最近一个做行政管理的朋友找我,说他们公司新修订了一版员工手册,两百多页,天天有人在小群里问"报销标准改没改""年假怎么算""团建经费上限是多少"。他问我能不能做个东西,让员工直接对话就能查到答案,不用翻PDF也不用到处问人。我给他搭了个基于AI智能体(Agent)的问答助手,前前后后花了两天时间做完。这事做完我最大的感受是:Agent开发真正难的不是写代码,而是想清楚"让模型做什么、给模型什么工具、怎么管住模型不乱来"。
这篇内容我想把自己在Agent实战开发里摸过一遍的路子完整梳理出来。适合谁看?已经会调大模型API、想进阶做Agent的人;正在选型纠结用哪个框架的人;以及刚接触Agent、被各种概念绕晕的初学者。我会从概念本质讲起,讲框架选型,然后手把手搭一个可用的Agent——就拿"制度条例学习助手"当案例,最后把实战里踩过的坑和学习路线都交出来。
1. Agent到底是什么:从"会聊天"到"会干活"
1.1 一句话拆解Agent
网上关于Agent的定义五花八门,什么"智能体""自主代理""多智能体系统",听着高大上,实际上彼此之间的界限也很模糊。我自己在实战中理解的Agent,就一句话:Agent = 大模型 + 规划能力 + 工具调用 + 记忆。
大模型负责两件事:理解人的意图,生成自然语言回复。规划能力是指模型在接到一个复杂任务时,能把任务拆解成一步一步的步骤,并决定每一步用什么方式完成。工具调用更直白,就是让模型能"动手"——查数据库、调API、写文件、执行代码。记忆则分为短期记忆和长期记忆,短期记忆是对话过程中模型能记住的上下文,长期记忆就是能把关键信息存下来,下次再见面还记得。
这四个部分组合在一起,模型就不再只是一个"聊天机器人",而是一个"有手有脚、会计划的执行者"。你让它"把销售数据整理成周报并邮件发给老板",它能拆成"查数据—生成总结—写邮件—发送"这个流程,每一步自主决定怎么做。
打个比方:如果把大模型比作一个聪明但没有任何工具的专家,那Agent就是给这个专家配齐了电脑、电话、资料库和秘书。专家自己记不住所有规章制度,但他知道去哪里查、找谁问、怎么把信息整理好交付给你。这就是Agent最核心的价值——它不依赖模型的"记忆力",而是依赖模型的"判断力"和外部工具的"执行力"。
1.2 为什么普通对话解决不了,非要Agent
很多人会有疑问:我直接调大模型API不就行了?为什么非要搞Agent?
区别在于"一次性生成"和"多步执行"。普通的API调用是一次性的——你给一段输入,模型给一段输出,完事。但很多真实需求是分步骤的。就拿制度条例学习助手来说,如果只是把员工手册整本扔给模型,让它回答"公积金缴存比例是多少",模型有可能答对,但也有可能把不同版本的制度搞混、把旧条例当新条例用。这个问题靠Prompt调优很难根治,因为模型本质上是个"文字接龙"模型,它擅长生成"看起来合理的回答",而制度查询要求的是"准确到条款、版本正确"。
Agent的解法是:不依赖模型记得这些内容,而是让它拿工具去查。模型收到问题后,先判断"这个问题需要检索制度文档",然后调用检索工具,拿到相关条款后,再基于条款内容生成答案。这样准确率和可控性都上来了。
我实际测过一个对比:直接问模型"年假政策",模型给了一段模棱两可的回答;而通过Agent检索后再回答,它能直接告诉你"按2026版手册第38条规定,入职满一年享5天年假"。这不是模型变聪明了,而是它学会了"不懂就查"。
1.3 ReAct模式:Agent运行的底层逻辑
理解了Agent的组成,还要理解它是怎么"思考"的。目前绝大多数Agent框架,跑的都是ReAct模式——Reason加Act,也就是思考加行动。这个模式最早来自一篇学术论文,核心思路是让模型在每一个步骤都输出"思考过程"和"行动指令",然后观察行动的结果,再进入下一步。
举个例子。Agent被问到"2026年公司年假政策是什么",它内部会走这样一个循环:
- 思考:我需要查询制度文档中年假相关的条款。
- 行动:调用search_documents(query="2026年 年假 政策")。
- 观察:检索结果返回了相关条款文字。
- 思考:条款显示入职满一年享有5天年假,满三年享有10天。
- 行动:直接回复用户。
这个"思考、行动、观察、再思考"的循环,就是Agent的底层运行逻辑。实践中为了控制成本和时间,通常会给循环加一个最大轮数上限,比如最多走5步。超过上限就停下来,告诉用户"这个问题我解决不了"。
在一个简单的Agent里,思考过程的判断可以由提示词引导模型输出,也可以靠工具调用的特殊格式完成。很多框架把这套循环封装好了,用户把它当成黑盒就行,但理解了底层逻辑,调试的时候你会少走很多弯路。我见过不少同事出了问题就疯狂改系统提示词,却不知道问题其实出在循环逻辑本身——这就是没吃透ReAct模式的典型症状。
2. 框架选型:从手写ReAct到成熟框架怎么选
2.1 手写vs框架,什么时候该自己写
给你一个问题:一个最简单的Agent,你想手写还是用框架?
我见过两种极端。一种人什么框架都不用,自己写循环、自己拼Prompt、自己解析模型输出;另一种人什么都要上框架,装一堆依赖,最后发现很多功能用不上,框架反而成了限制。
我的建议是分场景。如果你只是做一个内部工具、一个快速验证的Demo,而且你的核心诉求是"可控、简单、知道自己每一步在做什么",手写ReAct完全够了。手写的好处是:代码量不大(核心循环可能就几十行),每一步都能加日志调试,不依赖第三方库,出了任何问题都能自己改。
如果你要做的是复杂流程,比如多步骤审批、多Agent协作、有状态机一样的流转逻辑,这时候手写容易失控,上框架更稳。框架帮你处理了上下文管理、工具注册、重试机制、状态持久化,这些都是手写时要耗费大量精力处理的事情。
不要为了用框架而用框架。判断标准就一个:你的场景复杂度是否已经超过了手写能维护的成本。我见过一个团队,为了做一个"查天气"的Demo硬上了整套LangChain,依赖冲突装了半天,最后发现手写30行代码就能搞定。工具是拿来解决问题的,不是拿来撑场面的。
2.2 主流框架对比与选型建议
目前主流的Agent框架,我按使用体验和价值来分三个梯队。注意我这里只讲个人实战感受,不涉及任何框架的"官方对比"。
先说LangChain和LangGraph。LangChain大家听得最多,生态最大,文档最全,但它也常常被吐槽过度抽象。一开始用的时候你会发现它帮你封装了很多概念,Chain、Memory、Tool、Agent,看起来非常美好,但实际一跑就发现各种魔法行为难以排查。LangGraph是LangChain团队的下一代产品,主打图状编排,适合需要"状态机"式管理的复杂Agent,学习曲线更陡。
然后是MetaGPT和AutoGPT这类"明星项目"。AutoGPT是最早爆火的自主Agent项目,理念很宏大,但实际用起来你会发现它的稳定性堪忧,适合当玩具和研究案例,不适合直接上生产。MetaGPT主打"多Agent模拟软件公司",让多个Agent扮演产品经理、开发、测试等角色协作开发软件,在特定场景下效果不错,但工程落地上还有很多gap。
还有一类是Dify、Coze(扣子)这样的平台型工具。它们把Agent的开发从写代码变成拖拽配置,内置了知识库管理、工作流编排、插件市场。Dify开源,可以私有化部署,是国内很多企业做内部助手的首选之一;Coze背靠字节生态,插件多、上手快,适合快速验证。这类平台非常适合非深度开发者,或者想快速出原型的人。
另外,国产大模型厂商也在陆续推出自己的Agent框架,有些配合自家模型的工具调用能力,在特定场景下表现相当不错。选型时不要只看名气,要看你的主力模型是什么,优先选择和你模型配合顺滑的框架。
我列一个简单的选型对照表,方便你做决定:
| 框架/平台 | 优势 | 劣势 | 适合场景 |
|---|---|---|---|
| 手写ReAct | 完全可控、轻量、易调试 | 功能简单、需自研重试/记忆 | 快速验证、内部小工具 |
| LangChain | 生态最大、组件丰富 | 抽象重、黑盒多 | 标准Agent开发、团队维护 |
| LangGraph | 支持复杂状态流转 | 学习曲线陡 | 多步骤、有状态流程 |
| MetaGPT | 多Agent协作理念新颖 | 落地稳定性不足 | 研究、创意Demo |
| Dify | 开源、知识库完善 | 复杂自定义受限 | 企业内部助手、知识问答 |
| Coze/扣子 | 上手快、插件多 | 有平台绑定风险 | 快速原型、中小场景 |
2.3 低代码平台什么时候更合适
前面提到Dify和Coze,我多说几句。很多人有偏见,觉得低代码平台做不出"真Agent"。但我自己在实际项目里的体会是:如果你的核心业务场景是"知识检索增强问答""表单流程处理"这类,低代码平台反而比高代码方案更快、更稳。它们内置了文档解析、切片、向量检索这些工具,你不需要自己搭向量数据库、不用自己写Embedding的调度逻辑。
什么时候用低代码平台?我总结三条:第一,团队里缺少专门的算法或后端工程师;第二,需求变化频繁,需要业务人员也能参与调整;第三,上线时间紧,需要一周内出可用版本。反之,如果你的Agent要深度接入企业内部系统API、要做复杂的权限校验、要承担高并发生产流量,那还是老老实实用代码方案。
低代码平台还有一个隐形优势:它们通常自带日志和监控面板,Agent跑得好不好一眼就能看出来。这比你在代码里自己埋日志、自己搭看板省事太多。对于预算有限、又想快速看到效果的小团队,这条路非常值得走。
3. 从0到1搭建制度条例学习助手(完整实操)
3.1 需求拆解与工具设计
前面聊了这么多概念和选型,现在我们来动手。就用我给朋友做的"制度条例学习助手"当案例,完整过一遍开发流程,你把里面任何一个步骤换成自己的业务场景都一样能走通。
先做需求拆解。用户问的问题大概分几类:
- 查制度条款:比如"差旅报销上限是多少"。
- 查流程:比如"请假审批流程怎么走"。
- 查新旧版本差异:比如"2026年手册和2025年有什么区别"。
针对这三类需求,Agent需要配套的工具也就清楚了:一个文档检索工具,负责在制度文档库里搜相关内容;一个流程问答工具,用来回答"步骤有哪些"这类结构化流程问题;一个版本对比工具,比较两版制度文本的差异。你不需要让模型凭空答这些内容,而是给足工具让它去查。
工具设计上,我给每个工具定义了名字、描述、入参格式。其中描述特别重要,模型会依据描述来决定"什么时候用这个工具",描述写不清楚,模型就容易在工具选择上出乱子。举个例子,如果你的检索工具描述里只写了"搜索文档",模型很可能拿它去搜天气;你要是写上"在公司的制度条例库中检索与员工福利、报销、假期、考勤等相关的政策条款",模型就能精准判断何时启用它。
3.2 环境准备与核心代码实现
环境准备很简单,用Python写一个最小可跑的Agent。我这里用真实的代码来呈现,关键代码你复制就能改。
假设选用OpenAI风格的大模型API,我就以Function Calling的调用方式来写核心循环。其实很多国内大模型也都兼容类似的调用格式,你用哪家就换对应的SDK和endpoint。
核心的Agent循环代码如下:
import json def run_agent(user_query, max_steps=5): messages = [ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": user_query} ] for step in range(max_steps): response = call_llm(messages, tools=TOOLS) msg = response.message messages.append(msg) if msg.tool_calls: for tool_call in msg.tool_calls: result = execute_tool( tool_call.function.name, json.loads(tool_call.function.arguments) ) messages.append({ "role": "tool", "tool_call_id": tool_call.id, "content": json.dumps(result, ensure_ascii=False) }) else: return msg.content return "我已经尝试了多次,但还是没有找到准确答案,建议联系人事部门确认。"这段代码看着不长,但它已经是一个完整的ReAct循环了。SYSTEM_PROMPT告诉模型:你是制度条例学习助手,你要基于检索到的条款回答,不许编造;TOOLS是工具定义列表;call_llm负责调模型;execute_tool负责把工具名字映射到真正的函数执行。
我把工具执行的关键部分展开一下。文档检索工具内部,我用了向量检索加关键词召回混合的方案。先把制度文档切成长度约500字的片段,用Embedding模型转成向量存到向量库里。查询时,把用户问题也转成向量,取最相似的Top5片段,同时用关键词再召回Top5,最后把两路结果合并去重。
为什么要混合召回?因为制度条款里大量使用精确数字和专有名词(比如"15个工作日""OA系统"),向量检索对语义相似效果好,但对精确匹配容易丢;关键词召回正好补上这块。两路合并后,相关性和准确性都有保障。如果你只做向量检索,很可能出现"用户问的是15个工作日,检索回来的是10个工作日"这种细节错位。
3.3 记忆与上下文管理
Agent跑起来后你会很快遇到一个问题:用户的问题不是独立的。刚问了"报销上限",接着又问"那餐饮呢",这第二问明显依赖第一问的语境。如果每次请求都只把当前这条问题发给模型,模型可能不知道"那餐饮呢"指的是"报销里的餐饮标准"。
解决方案是给Agent加上会话记忆。最简单的方式就是把历史消息一并发给模型。在OpenAI格式里,你只需要把messages列表从头到尾带上就行。但这里面有个坑:token消耗会越来越大。所以实际开发中一定要做记忆裁剪。我的做法是:保留最近两轮完整对话,再加上之前对话的摘要。摘要由模型在轮次切换时生成,存到会话里。这样既保留了关键历史,又不至于让上下文爆炸。
如果你有更长期的记忆需求,可以引入向量库存历史问答对,等用户提问时先做一次检索,把相关的历史内容捞出来拼进上下文。这就是我们常说的长期记忆。
这里要特别提醒:记忆裁剪的触发时机很关键。我一般每10轮对话做一次摘要,但如果检测到上下文占比超过窗口的70%,也会提前触发。你可以把记忆管理理解成整理书桌——东西全堆在桌上或许都能找到,但找东西的速度会越来越慢,到后面干脆放不下,必须定时收拾归类。
3.4 效果实测与调优
代码跑通第一版之后,我一般会拿真实问题先测一遍再优化。测试的时候你会发现几个常见现象:模型把工具参数传错了;模型该用工具时不调工具,直接凭记忆瞎答;还有模型陷入循环,反复调用同一个工具却不收敛。
针对第一个问题,我会在工具描述里写清楚每个参数的格式和示例值。针对第二个问题,我会在系统提示词里加一句硬约束:"当问题涉及制度、条款、流程时,你必须先调用检索工具,不能直接回答。"针对死循环,就靠max_steps兜底,同时在检测到模型重复调用同一工具时,直接打断并提示模型换一个思路。
当时给朋友做的助手,第一版实测准确率大概在70%多,很多错误都出在"模型不查直接答"。加上硬约束和工具描述优化后,准确率能到90%以上。剩下的10%基本是极冷门的制度条款,因为检索结果本身不够好,模型也救不回来。这种问题靠调模型没用,得回头优化文档切分和召回策略。比如给切分增加段落标题作为辅助锚点,或者把表格单独提取处理,都能明显提升冷门条款的命中率。
4. 实战中高频踩坑与排查技巧
4.1 上下文窗口溢出问题
Agent一旦带上工具调用结果和多轮历史,上下文消耗速度会远超普通聊天。你想象一下:一次工具检索可能返回几千字内容,五轮工具调用下来光中间结果就上万字。模型上下文窗口有限,一旦溢出,轻则报错,重则前面的记忆被截断,Agent行为变得很奇怪。
排查和解决思路有几点:给工具返回设置长度上限,比如检索结果截断到前1000字;对历史消息做裁剪和摘要;把不重要的工具输出从context里摘除,只给模型看关键结论。这些都是在项目初期就应该设计好的,不要等到线上炸了才回头补。
我自己的血泪教训是:第一版助手上线后没做工具返回截断,有用户问了一个涵盖面很广的问题,Agent连续检索了四次,每次返回5000多字,直接把上下文撑爆了。最后整个会话崩溃,用户一脸懵。后来我在所有工具返回值外面套了一个统一的截断函数,同时保留一个摘要字段,问题立刻消失。
4.2 工具调用失败与格式错误
工具调用失败是Agent开发里最高频的坑,而且报错信息千奇百怪。最常见的是工具参数格式不对,比如模型把数字参数传成了字符串,把日期传成了"2026-1-1"缺了补零。我的经验是:在工具执行层做一层容错,不要直接让原始异常抛给用户。捕获异常后返回一个结构化的error信息给模型,让模型自己修正参数重新调用。这比让用户看到一长串Python堆栈要体面得多。
还有个常见问题:模型幻觉生成了工具名,调用了不存在的工具。除了在工具描述里严格约束,还可以加一层白名单校验,工具名不在列表里就直接拒绝执行,返回"工具不存在"的提示。实战中这两个坑我已经踩过无数次,每次排查都要花大量时间看日志,写成宽容的工具执行层以后省心太多。
4.3 Agent死循环与超时
死循环是所有Agent开发者的噩梦。模型决定调用工具,拿到结果后又决定调用同一个工具,再拿到结果还是决定调用同一个工具。这种情况经常出现在检索结果不明确时,模型想反复确认。
应对方案有三个层次:第一,硬性轮数上限,这个必须有;第二,检测重复调用,同一工具连续被调用超过两次就中断,并把之前的结果重新整理给模型,让它基于已有信息回答;第三,在提示词里明确"如果检索结果没有新增信息,请停止检索,基于已有内容回答"。三管齐下,基本能挡住绝大多数死循环。
我见过最夸张的一次,一个Agent在测试环境里循环了40多轮,每次都在调用同一个搜索API。要不是有日志告警及时发现,那个月的API账单得翻好几倍。自那以后,"循环上限"和"重复调用检测"成了我所有Agent项目的标配,没有例外。
4.4 成本控制与安全边界
Agent的成本是普通聊天交互的好几倍,因为每次工具调用都是一次模型调用,而且上下文中塞了大量工具结果。我见过一个团队,Agent跑一天,算力账单吓人。控制成本的核心手段是减少不必要的工具调用,优化提示词让模型一次就把事情做对;尽量复用更小、更便宜的模型做"路由判断",只有真正复杂的推理才上大模型。
你可以这样理解:不是所有问题都需要最强模型来答。用户问"今天天气怎么样"这种简单问题,用个轻量模型就能处理;涉及跨部门流程、版本对比的复杂问题,才需要大模型上场。在Agent入口做一道"问题分级"的路由,成本能省下30%到50%。
安全边界也很重要。企业内部Agent的权限控制要从严,不能让模型随意调用内部系统API。我在工具层做了一套权限校验,每个工具都绑定了最低权限等级,只有通过校验的会话才能调用。这看起来是小事,但一旦Agent上线,面对的是真实用户的恶意输入和误操作,没有这层防护很容易出大问题。
4.5 问题排查速查表
| 现象 | 可能原因 | 排查思路与解法 |
|---|---|---|
| 模型不调工具直接瞎答 | 提示词约束不够 | 更新系统提示词,强调必须调用工具 |
| 工具参数格式错误 | 工具描述不够清晰 | 补充参数格式、示例值,增加容错层 |
| 上下文溢出/报错 | 历史消息和工具返回太长 | 裁剪上下文、摘要历史、限制工具返回长度 |
| Agent死循环 | 检索结果不明确 | 设置轮数上限、检测重复调用 |
| 回答与条款不一致 | 检索召回结果不准确 | 优化切分策略、混合召回、调TopK |
| 成本飙升 | 工具调用过多 | 减少调用、模型分级路由 |
排查的技巧就一句话:把Agent每一步的思考、行动、观察全部记日志。我看过太多人排查问题靠猜,其实把"思考、行动、观察"三项日志打出来,大多数问题看一眼就明白了。我自己的项目里,日志不仅包括模型返回的原始JSON,还包括工具执行耗时、返回内容的token数、缓存命中情况。这些数据积累多了,你会发现很多性能问题根本不用等用户反馈,看日志趋势就能提前预判。
5. Agent开发的学习路线
5.1 基础阶段:Prompt与函数调用
想入门Agent开发,我觉得不需要一上来就啃框架源码。先把两件事做扎实:一是Prompt工程,二是函数调用(Function Calling)。函数调用是大模型API提供的一种能力,让模型在生成回复的同时,输出结构化的JSON,告诉系统"我想调用哪个工具、传什么参数"。这是Agent的基石。你先用一个简单案例跑通函数调用,比如做一个天气查询工具,让模型决定何时调用它。这个练熟之后,再学ReAct循环就水到渠成。
Prompt工程方面,重点学会写系统提示词,特别是"约束边界"和"行为规范"这两类。很多新手把系统提示词写成一段华丽的营销文案,真正需要约束的行为规范反而一笔带过。我建议把提示词当"员工手册"来写——告诉Agent它是谁、能做什么、不能做什么、遇到异常怎么处理,越具体越好。
5.2 进阶阶段:完整Agent与记忆
当你跑通一个最小Agent之后,下一步是完善它。学习方向包括:工具设计与注册,多工具调度策略,记忆系统实现,以及如何评估Agent的效果。我特别强调"评估"这个概念。Agent不像普通模型,你用几个case测测准确率就完事。Agent是有状态、有分支的,你需要设计一套评测集,覆盖不同难度的问题,跑一遍看整体的成功率、工具调用准确率、上下文消耗等指标。
这一步最容易忽略的是"失败样本分析"。不要只看整体准确率,要把每个失败案例单独拎出来看:是模型理解错了?工具调用错了?还是检索召回不行?每个失败原因对应不同的修法。我记得自己做过一个复盘,12个失败案例里面,4个是提示词约束不足,5个是工具描述不清,3个是文档里的内容本身有歧义。没有这一步拆解,你只会机械地加提示词,问题永远修不完。
5.3 高级阶段:多Agent协作与生产化
再往上走,可以选择的方向就比较多了。一个是多Agent协作,多个Agent各司其职,通过消息通信完成复杂任务,比如写代码、做数据分析。这里要学框架的编排机制,也要读一些经典的多Agent设计模式。另一个方向是Agent的生产化,涵盖工程层面的问题:并发控制、日志追踪、监控告警、权限安全、模型成本优化。还有一个方向是Agent评测与安全,做一个Agent不难,但要证明你的Agent在真实场景里可靠、安全、不跑偏,非常考验功底。
学习资料方面,吴恩达有一门Agentic AI方向的公开课,讲Agent的核心模式和常见陷阱,适合进阶阶段的人系统学一遍。开源社区里MetaGPT这类项目的源码很值得读,能学到不少多Agent的编排思想。另外,不少国产大模型团队的公开技术分享里都有Agent训练和调优的一手经验,这类内容往往比二手教程更有参考价值,建议保存下来反复研读。
这里我想多说一句:学习Agent开发最忌讳的是一味追新框架。今天看到LangChain火就学LangChain,明天看到新平台出来又换过去,结果每个都只学了皮毛。框架是工具,核心能力永远是"拆分问题、设计工具、约束模型"这三件事。把这三件事练扎实,换任何框架你都能快速上手;练不扎实,换什么框架都是事倍功半。
最后再分享一点个人体会
Agent开发这两年变化非常快,框架不断推陈出新,模型的工具调用能力也越来越强。我自己的感觉是,这个领域的核心能力反而不是某项技术本身,而是"拆解任务、设计工具、约束模型"这三件事的功力。你Prompt写得再好,工具设计得烂,Agent照样跑不明白;你工具设计得再好,不设置好安全边界,上线就是灾难。
如果你正在规划自己的第一个Agent项目,我的建议是从一个内部工具做起,场景不追求宏大,但一定要真实。把"制度条例学习助手"这种小而具体的问题解决得漂漂亮亮,比做十个炫技Demo都更有价值。跑通第一个之后,你会发现后面再做Agent,道路会顺畅很多。真正做出一个能解决实际问题的Agent,那种踏实感,比任何框架的新特性都让人上瘾。