
我在做 Agent 开发之前一直以为它就是个“进阶版聊天机器人”——你问它问题它用大模型回答你顶多多查询几次资料。真正上手之后才发现这个理解一开始就偏了。Agent 的核心不是“答得好”而是“做得成”它能自己拆解任务、调用外部工具、根据执行结果反复调整最后把一件原本需要人分几步操作的事从头到尾自动跑完。这篇文章我打算把整个 Agent 开发入门阶段的认知链路和实操过程都沉淀下来。从核心概念讲起到框架选型、手写一个最小可用的 Agent、处理记忆与规划问题再到生产落地时遇到的并发、安全和私有化部署等实际问题。内容尽量不分门派不站队某个框架把底层的“为什么”讲清楚。适合刚接触大模型应用开发、之前只写过普通 API 调用、或者想做 AI 自动化产品的朋友。看完之后你不光知道 Agent 怎么写还能避免我踩过的那一堆坑。1. Agent 不是 ChatBot 换了个马甲先搞清楚它多了什么很多人第一次接触 Agent 都是从 ChatGPT 这类产品开始的所以天然会觉得“Agent 不就是能多轮对话的大模型吗”。我一开始也是这么想的直到自己动手写了个工具调用 Demo才真正悟到它和普通 ChatBot 的差别。1.1 三层结构从 LLM 到 Agent 的关键跳跃为了好理解我习惯把当前的生成式 AI 应用分成三个台阶。第一层是纯文本生成也就是最基础的 LLM 调用。你输入 Prompt它返回文本。它没有外部感知也不知道自己说的是真是假只会凭训练时的记忆“编”。第二层是 RAG检索增强生成。在生成之前先到知识库里检索相关内容把结果塞进 Prompt 一起送给模型。这一步让模型有了“查资料”的能力但本质上它仍然是一次性输入、一次性输出没有对资料做多步消化和行动。第三层才是 Agent。它在这个基础上增加了三样东西工具调用Tool Use、任务规划Planning和反馈循环Feedback Loop。模型先生成一个执行计划然后调用外部 API 或函数拿到执行结果后回来继续推理判断下一步动作直到任务结束。这就好比ChatBot 是个只会“说”的人RAG 是给他配了个书架而 Agent 是直接给他配了双手双脚和一张任务清单让他自己去把事办了。1.2 类比一下让大模型“学会开锁”的过程打个比方把大模型想象成一个人。它很聪明但被困在一个房间里。你让它“从房间里出来”它会给你讲一堆关于门窗的理论但永远出不去。普通 ChatGPT 在这个比喻里就是那个只会讲理论的人。你给它一张门锁的照片相当于上下文里塞了个工具描述它告诉你“这种锁应该怎么开”但它手里没有钥匙。而 Agent 不一样。你不但给它照片工具描述还真的递了一把螺丝刀工具函数。它尝试撬了一下发现不行然后它会在反馈里告诉你“这个锁需要的是内六角扳手”你再递扳手给它它再试直到门打开。这个“尝试—反馈—再尝试”的闭环就是 Agent 区别 ChatBot 的本质。1.3 从热搜词看方向大家都在搜的 Agent 关键词我翻了一下最近的搜索趋势发现“agent框架”“agent架构”“ai agent搭建”“agent安全”“agent怎么扛并发”这几个词的搜索量都很高。这其实传递了一个信号工具刚火起来时大家都在搜“怎么跑通 Demo”现在大家更关心的是“怎么把 Agent 做成一个靠谱、稳定、能上生产的系统”。这两个目标对知识结构的要求完全不同——前者只要你会调 API 就行后者要求你理解调度、并发、安全和可观测性。这篇文章的实操部分我也会把重心放在后者上。2. 框架选型不能看热度主流 Agent 框架横向对比确认要用 Agent 架构之后下一个绕不开的问题就是到底要不要用框架用哪个我把 LangChain、AutoGen、MetaGPT 和 Dify 这几个主流方案都实际跑了一遍各自的优缺点和适用场景差异非常大。2.1 四类框架的定位完全不同先看一张我整理的对比表格后面展开讲。| 框架/平台 | 核心定位 | 上手难度 | 自由度 | 典型场景 || LangChain / LangGraph | 通用开发框架抽象完善 | 中高 | 高自己控制流程 | 需要深度定制逻辑的复杂 Agent | | AutoGen微软 | 多智能体对话协作 | 中 | 中高 | 多个角色分工协作、群聊式任务解决 | | MetaGPT | 软件开发流程模拟 | 中 | 中 | 按软件工程流程生成代码/文档 | | Dify | 低代码/可视化编排平台 | 低 | 低 | 快速搭建带界面的 AI 应用非程序员友好 |2.2 LangChain典型但容易让人迷失LangChain 是使用面最广的框架生态最丰富各种内置模块、文档和教程都很多。但它的“全”也是一把双刃剑。我实际用下来有个很大的感受你想做一件事至少有三四种官方推荐的写法版本迭代速度又快网上搜到的教程经常还是老版本写法。新手很容易陷入“一直在学框架 API却没时间思考业务逻辑”的困境。如果你本身理解了大模型调用的核心机制用 LangChain 会让你如虎添翼如果你还没搞懂 Function Calling 和 Agent 循环的基本原理一上来就用 LangChain你会在它的链式调用和各种抽象里越绕越晕。LangGraph 则是它在图编排上的升级版适合做有状态、带条件分支的复杂 Agent但学习曲线也更陡。2.3 AutoGen先想清楚是否真的需要“多个角色”AutoGen 主打多智能体群聊模式你定义几个 Worker他们之间可以互相对话协作完成目标。我原本觉得这个理念很酷但实际用起来它的调试成本比单一 Agent 高不少。多个 Agent 之间产生“话痨式”的循环、互相确认却没推进任务的情况经常发生而且 Token 消耗成倍增长。它适合的场景是任务本身天然需要分工比如一个 Agent 负责调研另一个负责写代码还有一个负责审校结果。如果你的需求只是一个“帮我连续调用几个工具完成任务”直接用单 Agent 就够了没必要引入多角色对话纯属给自己增加复杂度。2.4 Dify快速验证产品的最佳选择Dify 这类可视化编排平台对我来说更像是“AI 应用的工作台”。你不需要写太多代码通过拖拽配置就能串联一个带知识库、带工具调用的 Agent 应用。上手成本几乎为零而且自带日志、观测、模型管理这些生产需要的功能。它的取舍也很明显自由度受限。当你需要实现一些复杂的状态转移逻辑或者对 Prompt 做极度精细的控制时低代码平台反而会变成束缚。我的建议是如果你做的是内部工具、MVP 产品验证优先考虑 Dify如果你做的是一个要长期迭代、要深度控制每个环节的严肃产品还是要走代码方案。2.5 我的选型结论先裸写再上框架我最后想提醒一句话不要为了用框架而用框架。框架是帮你解决工程问题的不是你的目的。如果你连一次裸写的 Function Calling 循环都没手写过我强烈建议你先跟着下一章用最原始的方式写一个 Agent。跑通一次你会彻底明白框架里每个抽象到底在解决什么问题这时候再回来选型眼睛会毒辣得多。3. 手写一个最小可用 Agent从零理解 Function Calling 循环讲再多的概念和框架都不如亲手跑一轮“模型—工具—模型”的循环理解得深。这一章我会带你写一个最简的 Agent它要做的事情很简单根据用户输入判断要不要调用一个“查询天气”的工具然后把工具返回的结果整合成自然语言回答。3.1 环境准备省下那些折腾时间我这里假设你已经有 Python 3.9 以上的环境。我们需要的库极少如果你想用 OpenAI 接口就装一个 openai 包如果你想用国内的模型服务比如通义千问、智谱、DeepSeek 等它们大多也是 OpenAI 兼容的接口只需要改 Base URL 和 API Key。pip install openai如果你是跟着国内大模型厂商的文档走通常还会看到它们推荐安装一些自己的 SDK没关系核心逻辑都是一样的。在这个 Demo 里我直接以 OpenAI 兼容格式来说这样你无论用哪个服务商都能复制着用。3.2 核心代码定义工具让模型“看见”可以调用的东西Agent 与普通对话的关键区别在这里你需要给模型一份“工具说明书”但它并不真正执行工具而是返回一个结构化的“调用请求”由你的代码去执行再把结果回传给它。第一步定义一个“查天气”的工具并把它包装成模型能理解的 JSON Schemaimport json import openai client openai.OpenAI( api_keyyour-api-key, base_urlyour-base-url, # 如果使用国内模型服务这里填入对应地址 ) # 1. 工具定义这是模型能理解的功能清单 tools [ { type: function, function: { name: query_weather, description: 查询指定城市的当前天气情况, parameters: { type: object, properties: { city: { type: string, description: 城市名称例如 北京、上海 } }, required: [city] } } } ] # 2. 这个是实际执行的函数真正去查天气 def query_weather(city): # 这里简化为模拟数据真实场景可以请求天气 API data {北京: 晴25度, 上海: 多云28度, 广州: 小雨30度} return data.get(city, f{city}暂无数据)第三步是 Agent 里最重要的循环。你要在一个循环里反复做三件事把当前对话消息、工具清单发给模型模型如果返回tool_calls就执行对应工具把结果追加回消息列表模型如果不再要调用工具直接生成文本就退出循环代码如下messages [{role: user, content: 北京今天天气怎么样}] while True: response client.chat.completions.create( modelqwen-plus, # 根据你使用的模型服务商调整 messagesmessages, toolstools, ) choice response.choices[0] if not choice.finish_reason tool_calls: # 如果模型没有要求调用工具说明已经生成了最终答案 print(choice.message.content) break # 模型要求调用工具时会返回 tool_calls 列表 messages.append(choice.message) for tool_call in choice.message.tool_calls: if tool_call.function.name query_weather: args json.loads(tool_call.function.arguments) result query_weather(cityargs[city]) # 把工具执行结果以 roletool 的形式追加进对话 messages.append({ role: tool, tool_call_id: tool_call.id, content: json.dumps(result, ensure_asciiFalse) }) # 如果准备让同一个 Agent 自动连续处理就在此回到 while 循环开头跑一次这个脚本你会看到流程大致是模型分析用户输入后返回query_weather的函数调用请求你的代码执行query_weather(北京)得到“晴25度”这个结果以roletool的消息传回模型模型拿到结果后生成“北京今天天气晴温度25度”结束循环。3.3 为什么工具调用要设计成“模型只发指令代码去执行”我第一次接触这个结构时有个疑问模型直接返回结果不就行了吗为什么非要绕一圈让代码执行答案是安全边界。模型不应该有直接执行外部操作的权力——万一它被恶意 Prompt 诱导或者推理失误直接调用了破坏性操作怎么办现在的设计是模型只输出“我想调用什么工具、参数是什么”的结构化指令你的代码收到指令后可以加权限校验、加操作审计、加人工确认然后再执行。这个“模型负责决策代码负责执行”的架构是整个 Agent 安全体系的基石后面讲 Agent 安全时还会展开。3.4 谈 Token 之前先理解 Agent 为什么“烧钱”很多人在 Agent 开发第一课都会听到一个说法Agent 比普通对话贵很多。原因从上面这段代码就能看明白——一次完整任务往往要经过多轮“模型请求—工具调用—结果回传—再请求”的循环每一轮都是完整的 LLM 推理都要把之前所有消息重新计算一遍 Token。而且上下文不是只增长不清理的。工具描述、历史工具返回结果、用户最初的指令都会一遍又一遍进入模型。这样算下来一个小任务烧掉几万 Token 是常态。理解了这一点就明白了为什么“上下文管理”在 Agent 开发里如此重要也让我对 Token 这个词有了远超字面的认知——在 Agent 里Token 就是真金白银是每一轮决策的开销。3.5 进一步把单轮工具调用扩展成多步任务上面这个例子只是“判断要不要查天气并回答”严格来说还算不上完整的 Agent因为它没什么多步规划。你可以试着扩展一下让 Agent 收到一个任务“明天上海的天气适合跑步吗”它会先查上海明天的天气数据再根据温度、降水、空气质量给出运动建议。这个任务天然需要两步工具调用先query_weather拿到气象数据后可能还要调用另一个get_air_quality。你会发现只要在tools列表里多定义几个工具同一个循环代码几乎不用改模型自动就会在推理出需要第二步时发起第二次调用。这种“模型自己决定调用链”的能力就是 Agent 区别于 RAG 的最核心体现。4. 记忆与规划Agent 有没有“脑子”就看这两块手写 Demo 跑通之后你会开始思考一个更复杂的问题为什么我的 Agent 只能处理“一次性、几步内完成”的任务稍微长一点的流程它就乱套了答案通常出在记忆和规划这两个模块没做好。4.1 短期记忆与长期记忆上下文窗口装不下所有东西Agent 的“记性”分两层。短期记忆就是模型自带的上下文窗口。但它天然有限而且越长推理越慢、费用越高。很多做 Agent 的人聊到一个常见的“失忆”现象任务进行到一半模型好像忘了最开始的目标。这往往不是模型笨而是你把超长历史一股脑全塞进去模型注意力被带跑了。长期记忆就要靠外部存储来解决。最简单的做法是把历史关键信息结构化后存进数据库再通过相似度检索在关键时刻喂回模型。这也是 RAG 在 Agent 里的意义——不是让模型“记住一切”而是让它在需要的时候“想起正确的东西”。我的经验是给 Agent 建一套“工作日志”机制。每完成一个子步骤把这一步的目标、关键输入输出、决定依据写进日志存到一个独立的消息槽位而不是简单地把所有工具返回结果堆在上下文里。这样模型在下一步决策时看到的是一条条结构化的“干过什么、为什么这么干”而不是一片庞杂的原始数据。4.2 规划ReAct 模式是最容易起步的思考框架规划的本质是让模型在行动之前先想清楚步骤。学术上有很多模式但我建议入门阶段只吃透一个ReActReasoning Acting。ReAct 像个循环模型先思考Reason根据思考决定调用什么工具Act拿到结果后继续思考Reason再行动Act。这跟上一章我们写的代码结构天然契合——模型每次返回tool_calls之前的那个文本内容就是你让它“思考”的机会。实操中我通常会在 system prompt 里给 Agent 立几条思考规则先复述任务目标确认自己理解的任务是什么分析当前状态现在还缺哪些信息已有哪些结论选择下一步需要调用什么工具为什么执行后复盘拿到工具返回后要判断结果是否合理是否需要换一条路径。4.3 用思维链提示词提升规划质量值得注意的是单纯情绪化地让模型“一步步思考”还不够好。我自己常用的手段是在系统提示里加入“输出思考链”的要求让它把推理过程显式地写出来再行动。举个我自己的 prompt 模板片段在每一步行动之前请先输出 当前目标 已经掌握的信息 还需要获取的信息 计划调用的工具及理由这个思路很简单却出奇有效。因为模型把推理显式化之后它的决策链路会变长也更稳。我观察过多次对比不加这个提示时模型偶尔会“跳步”直接调错工具加上之后失误率明显下降。4.4 不要把记忆和规划混为一谈我在社区里见过很多人把 Agent 做出“人工智障”效果根因是把记忆和规划混在一个 Prompt 里。你想让模型既记住所有历史又要它有条理地规划下一步这两个任务会互相干扰。正确的做法是把记忆做成外部模块把规划做成显式步骤二者在每次循环里各自取用。模型决策时看到的是“当前任务的状态摘要 下一步候选动作”而不是一坨超长的对话历史。这也是目前主流 Agent 产品在架构上一个不约而同的收敛方向——先做减法再做加法。5. 从 Demo 到生产并发、安全和私有化部署这三道坎Demo 能跑通离能上线还很远。我经历过几个项目纯手工调通的 Agent 在单用户使用时效果非常好一旦放在生产环境各种工程问题立刻暴露。我把最典型的三个问题拎出来讲。5.1 Agent 怎么扛并发该排队排队该异步异步“AI Agent 怎么扛并发”是热搜词里我特别关注的一个。它其实包含两个完全不同的子问题一是推理本身的并发二是业务流程的并发。推理并发很好理解就是同时有 N 个用户请求打到模型服务上。如果你用的 API 是别人托管的它有自己的限流策略你需要做的是把你自己的服务设计成异步队列——请求先进消息队列Agent Worker 从队列里取任务一个个串行执行任务完成后通过回调或者轮询返回结果。方案很简单但很多新手就是想不到不要用同步 HTTP 请求把用户的等待时间绑死在 Agent 的多步耗时上。业务流程并发则更难。多个 Agent 任务同时运行时它们可能调用同一个外部系统、抢同一份资源。比如一个 Agent 在调银行接口另一个也在调两边会不会因为 Token 过期、状态冲突而出错处理这类问题一是要确保 Agent 的每次工具调用都是无副作用的或者幂等的二是给关键操作加分布式锁。这些概念你在传统后端开发里都遇过搬到 Agent 场景依然成立只是很多人被“AI”二字迷惑忘了回归工程基础。5.2 Agent 安全比 RAG 时代更尖锐的攻击面Agent 安全是最近搜索热度上升最快的领域这跟 Agent 的本质特征强相关它能调用工具、能访问外部系统这意味着一个被攻破的 Agent 可以直接造成真实世界的操作后果而不只是“说错话”。我总结的安全清单主要有三条第一工具级权限最小化。给 Agent 的每一个工具都做独立的权限设计。能只读就不要给写权限能限制参数范围就限制范围。我之前做过一个数据分析 Agent所有 SQL 查询工具统一走一个只读账号而且强制要求 SQL 里必须带时间范围条件防止一次查询把全表拖垮。第二提示注入防护。外部输入里藏恶意指令诱导 Agent 干坏事这是 Agent 特有的攻击方式。做法是层级化校验模型要调用高风险工具时先让一个独立的校验模型或者规则引擎判断这次调用的合法性再决定是否放行。这个校验环节绝不能省掉。第三可审计与可回滚。Agent 的每一步决策、每一次工具调用参数和执行结果都要落到日志里。一旦出了问题你可以快速定位是哪一步、因为什么而误操作从而准确修复而不是整个系统推到重来。5.3 本地模型与私有化部署什么时候值得上热搜词里还有“大模型私有化部署”“ollama 部署大模型”这类这也是 Agent 落地时常被问起的问题。要不要私有化核心看两个指标数据是否只能留在企业内部以及单次调用的边际成本是否已经高到不可接受。如果数据敏感度高或者调用量大到长期按 Token 付费不划算就可以考虑用开源模型本地部署。部署工具方面ollama 确实把本地跑模型的门槛降到了很低一行命令就能起服务。它做原型验证非常方便。但要注意本地部署的模型能力上限通常比商业大模型 API 低在复杂任务规划、指令遵循等维度上差距明显。一个实用的折中方案是重要决策路径用强模型 API大量低风险的工具调用与信息提取用本地小模型。混合架构既能省钱省时又不牺牲核心体验。5.4 可观测性Agent 调试的最大痛点传统后端的日志打点思路在 Agent 场景下极其重要但很多人会忽略。普通接口调试你只要打印输入输出就行Agent 可是一个动态循环每一步的推理文本、工具调用参数、返回结果、上下文长度变化全都要记录下来。我自己的做法是给每个 Agent 任务分配一个 trace_id从任务开始到结束把每一轮循环的状态都打上时间戳。排查问题时直接把这个 trace 拉出来就能复现“模型当时是怎么想的、为什么调了那个工具”。这个能力没有的话Agent 一旦出错你几乎无从下手。现在很多框架自带追踪工具比如 LangSmith、Langfuse自己搭的话可以用日志框架做成结构化事件流不管哪种方式这步不能省。6. 我踩过的那些坑Agent 开发实战中的血泪清单写完前面这些还是想分享几个具体的踩坑经历。每一个都是我用真金白银换来教训的新手提前知道能少走很多弯路。6.1 第一个坑格式化上下文的“隐形炸弹”第一次让我很崩溃的是模型返回了好几个tool_calls但我的程序在把工具结果追加回消息时忘了把choice.message本身也追加进去。结果就是模型在一个没看到自己刚才请求了什么工具的状态下接收到了工具返回结果上下文前后不一致它就陷入了莫名其妙的重复调用循环。这个问题不报错只是 Token 疯狂消耗、任务永远完成不了。排查链路很难因为你看到的现象是“Agent 卡住了”或者“回答质量极差”。我后来是通过打印完整消息历史才发现模型在发出工具调用请求后消息列表里却没有对应记录。从此我给自己的代码加了一条金科玉律某些事件比如工具调用必须成对存证——工具请求消息和工具返回消息要保证同时出现在上下文中缺一不可。6.2 第二个坑把 RAG 当 Agent 用或反过来还有一个常见的认知错位——把 RAG 叫做 Agent或者把 Agent 当 RAG 使。RAG 解决的是“模型不知道某事”的问题它没有行动能力Agent 解决的是“模型无法做事”的问题它有工具去改变外部状态。如果你的需求是“根据知识库回答问题”那就该上 RAG简洁、可控、便宜如果你硬要塞进 Agent 框架就等于给自行车装了一台火箭发动机又费油又难控制。反过来如果任务需要连续多步操作你却只用一次 RAG 检索那就根本完成不了。我在初学阶段干过一件蠢事试图用 RAG 让模型去操作一个业务系统结果它根本不会真正触发操作倒是从文档里“检索”出操作步骤然后一本正经地描述了一遍。后来换成标准 Agent 架构把业务操作封装成带权限校验的工具一下就通了。这个教训让我牢记先想清楚任务是需要知识还是需要行动再做架构选型。6.3 第三个坑执着于“万能 Agent”很多人在入门阶段会有一个执念想做一个能处理所有任务的“万能 Agent”。我最初也有后来发现这是个大坑。因为模型在任务路径太长、边界太宽时规划质量会迅速下降而且你想覆盖所有场景工具列表会非常臃肿模型选错工具的概率也直线上升。我现在更推崇“单任务英雄型 Agent”一个 Agent 只做一件事把它做到极致。要做数据分析就专门做数据分析要处理客服工单就专门处理客服工单。每个 Agent 配少量高度相关的工具Prompt 里明确限定任务边界。需要跨领域协作时让多个单任务 Agent 之间通过消息传递协作而不是硬塞给一个万能 Agent。这个在工程上也更好维护——每个 Agent 的错误隔离在自己的领域里。6.4 第四个坑效果评估停留在“看着行”最后一个坑是关于评估的。我在早期开发时经常这样在几个测试样例上跑了一遍觉得“效果不错”就以为可以上线了。结果在真实世界场景里各种长尾输入把 Agent 打回原形。后来我意识到Agent 的评估难度比传统模型高一个数量级因为没有固定的输入输出对可以简单断言对错。我的经验是建立三个维度任务完成率核心目标有没有达成、工具调用准确率每次调用是否选对了工具和参数、资源开销Token 消耗和执行轮数是否合理。每一版 Prompt、每一次模型替换都用同一套测试集跑分对比而不是靠肉眼感觉。这一套下来迭代效果立刻有了客观依据。7. 入门到进阶我给想学 Agent 开发的人留下的建议写到这里核心内容基本讲完了。最后聊几句我个人在实操中的体会以及接下来怎么进阶。如果你刚开始接触 Agent我建议的路径是先手写一个不带框架的 Function Calling 循环彻底理解模型—工具—模型的三角关系然后用这个最小闭环去解决一个真实的小问题哪怕只是“每天自动汇总新闻发到群里”这种小工具下一步再引入记忆机制和规划提示词尝试多步骤任务最后才是框架选型和生产化改造。这个顺序能保证每个阶段的坑你都踩过、懂原因框架只是把你的成熟逻辑工程化而不是成为掩盖你理解缺陷的“黑盒”。项目做深之后可以往几个方向延伸都很有前景一是和研究 Agent 规划算法相关的高级技巧二是做多 Agent 协作架构三是往垂直行业工具链方向做深比如结合低代码平台、接入企业系统。这些方向不管未来技术怎么变你的底层理解不会过时——毕竟 Agent 的核心永远是“模型给出聪明决策代码给出安全执行”这句话我嚼了多少遍都不腻。