首页 / 资讯中心 / 文章详情

从LLM到Agent:学习路径、框架选型与工程实践全解析

从LLM到Agent:学习路径、框架选型与工程实践全解析 ★ FEATURED ARTICLE
最近不管是技术社区还是产品群Agent这个词已经快被说烂了。我被问到最多的问题已经从“Agent是什么”慢慢变成了“Agent怎么学”“框架怎么选”“记忆怎么做”“多Agent怎么协作”。有人把Agent和LLM混在一起说有人上来就问我DeepSeek是不是Agent还有人连第一步都被“agentpresets/list failed: failed to fetch”这种报错卡住。今天这篇东西我想换个角度不谈概念包装直接从学习路径和工程实践出发把我自己从“会调API”到“能搭一个带记忆、带工具、能多角色协作的Agent系统”这个过程里的思考、选型和踩坑都整理出来。内容主要给两类人看一是刚接触Agent的开发者想找一条不绕弯的学习路线二是已经在用某个框架但总觉得哪里不对劲、想搞清楚底层原理的人。1. 先搞清楚Agent是什么再谈学习框架1.1 Agent、LLM、AI模型的边界在哪里很多人把Agent和LLM当成同一个东西这是学习路上最大的认知障碍。LLM是“大语言模型”它是一个模型擅长做文字理解和生成本质是一个概率函数给你一段文本预测下一个token是什么。AI模型这个概念更宽泛包含LLM、多模态模型、图像生成模型等一堆东西。而Agent不一样它是一个“能自主完成任务的系统”LLM只是这个系统里的一个组件负责“思考”和“决策”但真正让它跑起来的还有工具调用、记忆存储、任务规划、执行循环这些模块。我常用一个很土但很准确的比喻LLM是大脑Agent是有手有脚有记事本的员工。你跟大脑聊天它能回你一段话你跟员工布置任务他会自己拆步骤、查资料、用工具、记笔记最后交付结果。所以DeepSeek本身不是Agent它是模型但基于DeepSeek的API套上一层工具调用和任务循环你可以做出一个Agent。社区里经常出现的Pi Agent、Hermes Agent、Orca Agent这些名字听起来五花八门本质都是有人给某个具体场景的Agent实现起了个代号核心还是“模型加循环加工具”那一套。理解这个边界之后你再看各种框架就不会晕了。所谓的Agent学习框架其实是在帮你解决“怎么把模型变成员工”这件事。它管的是状态怎么流转、工具怎么注册、记忆怎么存取、多Agent之间怎么通信而不是帮你重新发明一个模型。1.2 学Agent前需要补齐哪些基本功经常有人问我零基础能不能直接学Agent。我的答案是可以但有一个前提至少要有写Python函数和调HTTP接口的能力。Agent开发目前主流的路子还是写代码尤其是Python你不需要成为语言大师但得能看懂异常栈、能定义一个函数、能处理JSON返回值。第二个基本功是Prompt工程。有些人觉得Prompt是文科活其实不是。写好一个系统提示词决定了Agent角色定位和不做什么写好工具描述决定了模型能不能在正确的时候调用正确的工具。我自己见过太多案例Agent行为不对调了半天代码最后发现是系统提示词里少了约束条件。第三个基本功是理解一次LLM API调用。你得知道temperature、max_tokens、top_p这些参数是干什么的看得懂返回结构里的content、tool_calls、usage这些字段。尤其是function calling现在几乎所有主流Agent框架都依赖它如果连“模型返回一个结构化指令程序负责执行”这个机制都没亲眼见过后面学框架会非常痛苦。最后一个容易被忽视的是日志意识。Agent程序跟普通Web服务不一样它的行为是动态的同样的输入可能跑出完全不同的路径。从一开始就养成打印中间步骤、记录每次tool call的习惯后面调试多Agent系统会省下大量时间。2. 学习框架的三层结构模型层、能力层、编排层2.1 模型层基座模型怎么选Agent的“智商”上限基本由模型决定。选模型时我会优先看四个维度工具调用的准确性、上下文长度、推理能力、成本与数据合规。工具调用准确性是最容易被低估的指标。很多模型聊天很流畅一到函数调用就乱传参要么参数名写错要么该调工具的时候不调。这种事情在Agent场景里是致命的。我实测过同一个工具定义不同模型的表现差距可以非常大所以在技术选型阶段不要只看榜单分数一定要拿自己真实场景里的工具定义去跑一遍。上下文长度决定Agent能“记住”多少临时信息。长上下文的模型可以少做压缩和裁剪省事但成本也会上来。还有一个经验上下文越长模型越容易在中间环节丢失注意力必要时还是要靠摘要和检索把关键信息提取出来而不是无脑塞原始文本。至于具体选哪个模型我不打算点名推荐因为更新太快。我的建议是优先选择“接口风格兼容主流协议”的模型这样以后换模型成本很低。现在很多模型服务都兼容OpenAI的API格式代码层面只需要改base_url和api_key这已经是事实上的行业标准了。2.2 能力层工具调用、记忆、Skills能力层是Agent区别于普通聊天机器人的关键。一个裸的LLM只会“说”接上工具之后它才能“做”。工具调用function calling的实现机制是你把工具的定义包括函数名、参数结构、功能描述以JSON Schema的形式传给模型模型在推理过程中决定“现在应该调用某个工具”并返回一个结构化的调用请求你的程序负责执行这个调用把结果回传给模型模型再基于结果继续推理。这个“模型动口、程序动手”的机制是整个Agent的基石。我建议新手第一课就写一个最简单的工具调用Demo让模型调用一个获取天气的函数然后再调用一个发送邮件的函数亲眼看看消息循环是怎么走的。这个过程搞懂了后面所有框架都只是在这个基础上加了一层封装而已。记忆在能力层里同样重要。注意这里的“记忆”不是指模型参数里固化的知识而是指Agent运行过程中保存的状态和信息。学习框架时你会遇到短期记忆、长期记忆、永久记忆这些词。我的理解很简单短期记忆是当前会话窗口里的上下文长期记忆是跨会话保留的用户偏好或领域知识通常用向量数据库加语义检索实现永久记忆是更底层的用户画像和事实型数据比如用户的姓名、订购历史、项目配置这些通常放在结构化数据库里有明确的Schema。三者之间是配合关系不是替代关系。至于热搜词里反复出现的“Skill和Agent的区别”我多说一句。Skill是一组可复用的“能力包”比如“生成PPT”“解析PDF”“查天气”它定义了Agent能用什么工具、按什么流程做一件事。Agent是持有这些Skill的主体。打个比方Skill是员工考的证书和掌握的技能Agent是拿着证书干活的人。一个Agent可以拥有多个Skill同一个Skill也可以被多个Agent复用。很多项目里管这个叫“技能库”本质就是把工具和流程做成可插拔的模块。另外还有一个词经常被拎出来问“Harness和Agent区别”。在不同的框架里Harness含义不完全一样但我倾向于把它理解为“承载Agent运行的壳”负责输入输出的解析、工具执行的调度、循环边界的控制Agent则是壳里面真正做推理和决策的业务逻辑。你可以把它想象成赛车和驾驶员的关系车架决定了怎么跑驾驶员决定往哪跑。2.3 编排层主流框架对比与选型到了编排层才是大多数人理解的“Agent框架”。这里的选择非常多我把主流的几类说清楚。LangChain和LangGraph算一类。LangChain生态最成熟文档多、社区大适合快速做原型LangGraph是它的升级思路把Agent的每一步建模成图节点和状态流转更清晰很适合做有分支、有循环的复杂Agent。缺点也很明显抽象层多出了问题排查起来要翻很多层源码。AutoGen现在叫AG2和CrewAI算另一类。AutoGen的核心思路是让多个Agent通过对话协作完成任务非常适合做研究型、讨论型的场景CrewAI则把Agent建模成“角色分工的团队”有Manager、Worker这样的角色概念上手直观适合做流程固定的自动化任务。国内的低代码平台像Dify、Coze扣子也值得了解。这类平台把模型配置、工具接入、知识库、工作流都做成了可视化界面非常适合快速验证产品想法或者让不会写代码的业务人员去搭一个简单的Agent应用。但对开发者来说这类平台有个问题灵活性受限很多底层行为你改不了复杂逻辑还是得回到代码里。还有一类是协议层的东西比如MCPModel Context Protocol。它解决的是“工具接入标准”的问题。以前每个Agent框架接入工具都要写自己的适配器MCP出现之后工具提供方可以实现一套标准接口所有支持MCP的Agent都能直接用。我对这个方向比较认可因为它降低了生态的重复建设成本。选型上我的建议很直白如果只是想快速跑通一个Demo选你身边资料最多的框架别纠结好不好如果是做严肃的工程项目优先看团队熟悉度和可维护性如果场景非常复杂需要精细控制状态流转LangGraph这类基于图模型的框架会更合适。框架本身没有绝对好坏只有合不合适。框架/平台核心思路适合场景上手难度LangChain / LangGraph组件化/图状态编排复杂流程、可定制要求高的项目中等AutoGen / AG2多Agent对话协作研究型、讨论型任务中等CrewAI角色分工团队流程固定、任务明确的场景较低Dify / Coze可视化工作流快速验证产品原型、非技术用户低MCP工具接入标准协议统一接入第三方工具生态较低3. 核心机制深入推理循环、记忆体系、多Agent协作3.1 推理循环Agent“自己思考”的底层逻辑所有Agent框架不管外层包装得多花哨内核都是同一个模式推理-行动-观察也就是常说的ReAct范式。Agent接到用户任务后先让模型基于当前状态做推理判断下一步是直接回答还是调用某个工具如果需要工具程序执行并返回结果模型基于新结果继续推理如此循环直到它认为任务完成。我在手写第一个Agent时把循环简化为四步组装messages包括系统提示词、历史对话、工具定义和当前用户输入。调用LLM得到回复。检查回复里有没有tool_calls字段。如果有遍历执行对应工具把结果追加到messages里然后回到第2步。如果没有tool_calls说明Agent认为可以输出答案了把content返回给用户。这个循环看似简单但有几个细节决定成败。一个是最大迭代次数必须设置上限否则遇到工具反复返回异常Agent会一直循环下去成本爆炸。我自己线上服务一般限制在10到15次。另一个是错误处理工具执行异常不能让整个程序崩溃要把异常信息作为工具结果回传给模型让它判断是换个方案还是放弃。这个机制很多人不做但它是Agent稳定性的关键。3.2 短期、长期、永久记忆分别怎么实现记忆是Agent应用拉开体验差距的地方也是最容易被初学者忽略的。我见过不少项目工具调用做得很好任务规划也很棒但用户第二次使用时Agent完全不记得上次聊过什么体验感大打折扣。短期记忆最简单就是把对话历史直接放进上下文里。需要注意的只有一点上下文有长度限制不能无限塞对话。解决办法通常是滚动窗口裁剪只保留最近N轮或者当历史太长时调用一次LLM生成摘要把摘要作为下一轮的系统上下文。这个方案成本很低做原型阶段够用。长期记忆通常指跨会话保留用户相关信息比如用户喜欢什么样的文风、对哪些话题感兴趣。最主流的实现方式是“向量化加检索”把每一条记忆文本通过embedding模型转成向量存入向量数据库新对话进来时把当前问题也转成向量做语义相似度检索把最相关的记忆片段取出来拼进系统提示词。选型上Qdrant、Milvus、pgvector都是常见选项。小项目用pgvector最省心直接挂在PostgreSQL上少维护一个中间件。永久记忆比长期记忆更强调“事实性和结构化”。比如用户的订阅状态、项目管理里的ID、支付偏好这些不适合靠语义检索去猜应该放进传统的关系型数据库有一张清晰的表结构程序能直接按主键查询。我自己的项目里会保留几张表conversations存会话元信息messages存每一条消息memories存长期语义记忆user_profile存用户事实数据。这个分层的好处是每次读取记忆时各取所需向量库只需要扛检索不用承担数据一致性的职责。这里要提醒一句记忆不是存得越多越好。记忆污染是真实存在的坑检索出来的旧记忆可能已经过时反而会误导Agent。我的做法是为每条记忆增加时间戳和来源标记检索排序时把时间衰减作为一个权重因子并且对关键事实型记忆提供“用户可修改”的入口避免错误信息长期固化。3.3 多Agent协作的四种常见模式当一个Agent搞不定复杂任务时多Agent协作就派上用场了。很多人以为多Agent就是“多开几轮对话”其实不是它是把任务拆给多个角色每个角色负责一个子目标通过某种调度机制协作。我在项目里用过的模式大致有四类。第一类是顺序模式最简单的流水线一个Agent做需求分析输出结构化的任务描述另一个Agent按描述生成结果。适合流程特别固定的场景。第二类是层级模式一个Planner Agent负责拆解和分配任务下面挂若干个Worker Agent执行每个Worker还有可能再挂子Agent。这类模式可控性强是目前企业项目里最常用的。第三类是对话模式多个Agent在一个共享对话环境里自由发言通过辩论、评审来收敛结果。AutoGen最擅长这个特别适合开放性的研究任务比如“分析这份文档里的风险点”让一个Agent找问题、一个Agent质疑、一个Agent总结。但这种模式有一个隐藏问题Token消耗非常大而且对话跑偏时很难拉回来一定要设置好终止条件。第四类是市场/黑板模式多个Agent共享一块“工作区”各自认领任务并写入结果。这种模式灵活但实现复杂度高普通业务项目不太需要。我的建议是能用单Agent加好工具解决的问题不要上多Agent多Agent的价值体现在“需要不同视角”或“任务可清晰拆解”的场景系统复杂度和成本上升是实打实的别为了炫技而用。4. 实操落地从零搭一个带记忆和工具调用的Agent4.1 不依赖重框架先手写一个最小Agent循环我强烈建议每个新手自己手写一遍Agent主循环这会让你对框架的敬畏感少一半理解深一倍。下面这个例子我用的是OpenAI兼容接口你只要把base_url和api_key换成自己模型服务的就行。from openai import OpenAI client OpenAI(base_urlyour_model_base_url, api_keyyour_api_key) def run_agent(system_prompt: str, user_input: str, tools: list, max_iterations: int 10): messages [ {role: system, content: system_prompt}, {role: user, content: user_input}, ] for step in range(max_iterations): response client.chat.completions.create( modelyour_model_name, messagesmessages, toolstools, ) message response.choices[0].message messages.append(message.model_dump(exclude_noneTrue)) if not message.tool_calls: return message.content for tool_call in message.tool_calls: result execute_tool(tool_call.function.name, tool_call.function.arguments) messages.append({ role: tool, tool_call_id: tool_call.id, content: result, }) return 达到最大迭代次数任务未完成这段代码虽然只有二十几行但已经具备了一个Agent最基本的能力模型能发起工具调用程序能执行并把结果回传。你在跑通这个循环之后再去学LangGraph或者CrewAI会发现它们的核心逻辑跟这差不多只是把状态管理、持久化、并发做得更工程化了。4.2 定义工具让Agent真正能“动手”工具定义的质量直接决定Agent能不能在正确时机调用正确的工具。初学者常犯的一个错误是工具描述写得太随意。比如定义一个发送邮件的工具description只写“发送邮件”模型完全不知道什么时候该用、参数怎么填。正确的做法是把使用条件、参数含义、副作用都写清楚。tools [ { type: function, function: { name: send_email, description: 发送邮件给指定收件人。当用户要求发送邮件、回复邮件或通知某人时调用。, parameters: { type: object, properties: { to: {type: string, description: 收件人邮箱地址}, subject: {type: string, description: 邮件标题尽量简洁}, body: {type: string, description: 邮件正文内容}, }, required: [to, subject, body], }, } } ]描述里写清楚“什么时候调用”比写“这个工具做什么”更管用因为模型是根据当前任务语义做匹配的。另外我还会给工具加一个返回值规范尽量返回结构化JSON而不是一段含糊的自然语言比如{status: success, message_id: 12345}这样模型在下一步推理时能准确提取关键字段。工具多起来之后建议把工具按领域拆成不同的集合比如邮件工具集、搜索工具集、数据库工具集按任务类型动态注入而不是全部塞给模型这样既能省Token也能减少误调用。4.3 记忆的工程化SQLite加向量库的混合方案记忆落地我介绍一个适合个人项目和中小团队起步的接地气方案SQLite存事实型数据向量库存语义记忆中间用一个简短的记忆读写函数串起来。事实型数据很简单直接建表CREATE TABLE user_profile ( user_id TEXT PRIMARY KEY, name TEXT, plan TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE conversation_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, role TEXT, content TEXT, tool_calls TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE memories ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id TEXT, content TEXT, embedding VECTOR, source TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );每次Agent跑完一轮就把用户消息、Agent回复、工具调用记录追加到conversation_logs里。对于需要长期记住的信息我单独写一个save_memory(user_id, content)函数把文本做embedding后存入memories表。下一次用户进来时先向量检索memories表取回最相关的几条拼进系统提示词里。我自己跑下来的经验是这个方案在数据量小于几十万条时性能完全够用而且比一开始就上分布式向量库省心得多。只有当数据量真的大了、并发上来了再迁移到专门的向量数据库和独立的关系库也不迟。工程上有一个原则很有意思先拿最简单的方案跑通全链路再把真正的瓶颈点单独拎出来优化。记忆系统的瓶颈一定出现在检索效果和写入策略上而不是存储引擎选的够不够大牌。5. 高频报错排查与Agent评估5.1 三个高频报错的定位思路开发Agent过程中有几个报错我几乎每次都会遇到这里挑三个典型的写出来。第一个是“Agent execution terminated due to error.”。这个报错本身很笼统就是Agent执行过程中抛了异常但不会告诉你是哪一步出了问题。我的排查顺序固定是三步先看完整的Traceback定位异常是从哪个工具函数抛出来的再看是不是上下文长度超限很多Agent在长对话中会触发这条最后看是不是达到最大迭代次数被上层中断。解决手段也对应着三招给工具函数加健壮的异常捕获、对上下文做裁剪或摘要、合理调整max_iterations。第二个是API请求层的报错比如“client api: agentpresets/list failed: failed to fetch”。这类问题常见于Web端Agent管理平台本质是浏览器请求后端接口失败。排查方向基本是后端服务有没有正常启动、接口地址配没配对、跨域策略允不允许这个请求、登录态有没有过期。如果你是自己写前端调Agent接口我建议先用curl或Postman直接打接口确认后端没问题再回过来查前端的请求配置别一上来就怀疑代码逻辑。第三个是工具参数错误也就是模型生成的参数不符合工具函数的要求。这类问题在函数调用场景里很常见模型传了一个不存在的字段或者把字符串当数字传了。解决思路有三个层面第一优化工具描述和参数描述给出更明确的格式要求和示例第二在工具入口统一做参数校验和类型转换不合法就返回错误信息让模型重新生成第三对于关键参数在提示词里给一次少样本示例教模型怎么填。5.2 EvalsAgent能不能上线得用数据说话Agent开发的隐形门槛是评估。传统软件写单测就能覆盖逻辑但Agent的行为是概率性的同一段输入可能跑出不同的路径。如果不在上线前做好评估很多问题只会在线上冒出来而且复现困难。我建议团队至少建立三类评估。第一类是任务成功率评估准备一批有明确正确答案的历史任务跑Agent后对比输出是否符合预期比如“让Agent查天气并告诉我明天是否需要带伞”预期是工具调用次数正确、最终结论合理。第二类是工具调用准确性评估检查Agent是否在合适的时机调用了合适的工具、参数是否正确这个可以用脚本自动对比。第三类是回复质量评估用LLM-as-a-judge的方式让一个评判模型对Agent的回复从相关性、准确性、语气等维度打分虽然不能完全替代人工但至少能批量筛出明显不合格的结果。更关键的是把评估集做成可持续迭代的回归集。每发现一个新的bad case就把它加进评估集下次改动代码或换模型时跑一遍全量回归。这样你才能心里有数这次升级到底是真的变好了还是只是换个姿势出问题。这个习惯花的时间不多但能显著降低线上翻车概率。6. 框架之外Agent的发展方向与学习路线6.1 我看到的几个确定性趋势在框架层面我对Agent的短期趋势有几个判断不一定全对但分享出来供参考。第一个趋势是协议标准化工具接入会越来越像USB接口一样即插即用。MCP这类协议正在快速普及未来Agent接第三方工具的成本会大幅降低框架之间的迁移成本也会变小今天你选的某个框架未必能锁死你五年后的技术栈。第二个趋势是记忆和个性化成为真正的壁垒。模型能力会越来越同质化但谁能让Agent更懂用户、少犯重复错误、在关键时刻想起来该用什么历史信息谁的用户体验就会明显胜出。记忆不是附加功能而是Agent系统架构里的第一公民。第三个趋势是评估和安全会被推到台前。现在很多Agent项目还在“能跑就行”的阶段但一旦进入生产环境安全性、可靠性和成本控制都会成为硬约束。Agent的安全不只是防注入还包括权限控制、工具误调用防护、敏感信息脱敏这块以后会是专门的岗位方向。第四个趋势是端侧Agent开始出现。轻量化模型配合端侧算力让部分Agent任务可以在本地设备上完成不需要每次都把数据传到云端。这能解决延迟和隐私问题但硬件约束和模型能力限制目前还很明显更适合特定场景比如手机助手、车载交互这类。6.2 一份可执行的学习路线建议如果你现在想系统性学Agent我按自己的经验给一条可执行的路线。第一步先跑通上面那个手写最小循环熟悉function calling和工具调用。这一步大概需要三到五天目标是理解“模型返回指令、程序执行、结果回传”这一个闭环。第二步选一个主流框架深入学。我建议先从LangChain入门因为资料最多遇到问题好搜等你能用LangChain搭出一个完整项目后再看LangGraph了解状态编排或者看Autogen理解多Agent对话。这阶段的目标是熟悉框架提供的能力边界知道什么场景用什么工具。第三步做一个能解决真实问题的项目。项目选择很关键最好是“你或者身边人真的会被它烦到的事”。比如做一个自动整理周报的Agent它能读取聊天记录、提取本周工作内容、按模板生成周报。过程中你自然会学到知识库、记忆、工具调用异常处理这些细节。第四步往纵深研究。读一个框架的核心源码尤其是ReAct循环、工具注册机制、记忆管理模块是怎么实现的。然后研究Agent评估方案找几个bad case分析根因。这阶段的目标是建立“调试Agent”的能力这是区分使用者和开发者的关键分水岭。至于面试方向现在常见的问题集中在Agent原理、框架对比、记忆方案设计、多Agent协作、评估机制、Failcase分析这几块。准备时别死记概念尽量每个问题都配上自己亲身做过的项目案例面试官更愿意听你踩过的坑和解决思路而不是背书式的框架介绍。最后再分享一个小习惯每做一个Agent项目我都保留一份完整的运行日志或trace。不只是为了排查问题更是为了后面做评估集积累素材。很多bad case只有真实运行时才会暴露攒得越多你的Agent调优空间就越大。这个动作不复杂但坚持下来积累的是别人拿不走的一手数据。做Agent这件事长期来看拼的不是谁的框架用得花哨而是谁对真实场景的失败细节理解得更深。
阅读完成 · 觉得有帮助?
咨询建站