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

Agent开发的核心不是框架,而是这五件事——两年实战总结

Agent开发的核心不是框架,而是这五件事——两年实战总结 ★ FEATURED ARTICLE
1. 做了近两年Agent开发我先说结论框架真的不值钱先交代一下背景。我是做后端出身后面转大模型应用开发从某个还比较早期的阶段就开始碰Agent相关的东西。前后加起来差不多两年时间主流的和不太主流的框架都试过自己也在团队内部从零搭过两套Agent脚手架。一直以来在社区里最常见的问题就是做Agent开发到底要学什么Agent开发的学习路线是什么。很多人的第一反应是学LangChain、学AutoGen、学CrewAI或者研究一下Hermes、Pi这样的新框架。不能说不对但以我实际做项目的体感来说这些东西恰恰是最不重要的。框架是流水线上的扳手换个型号最多别扭两天。真正卡住项目进度、决定Agent能不能落地的东西从来不是某一行API调用而是下面这五件事——Agent的目标与任务拆解、工具Skill设计、记忆体系构建、多Agent协作模式、以及让整个系统稳定跑起来的评测与防错机制。这篇文章不科普概念我只讲在真实项目里踩过的坑、验证过的做法以及不同方案之间到底怎么取舍。无论你是刚准备入门的开发者还是已经在做Agent项目但总觉得代码能跑、效果拉胯这篇文章应该都能给你一些可以照抄的经验。2. 第一件事先搞清楚Agent的边界再谈别的2.1 单Agent任务本质上是输入状态机到输出状态机的映射很多人做Agent开发一上来就设计Prompt或者先选框架这在我看来是顺序反了。做Agent的第一步一定是把一个宽泛的用户需求变成一个可以用工具序列完成的计算问题。我习惯用一个比较土但有效的说法Agent是一个接受目标状态和当前状态作为输入输出行动序列的系统。中间怎么推理、怎么调用工具反而不是本质。本质上我们要解决的就是两件事理解当前状态用户到底在什么背景下提问手里有什么资源限制条件是什么。定义目标状态什么样的输出算是完成哪些情况要停止并寻求人工介入。举一个我做过的例子。一个纯客服Agent表面上处理的是用户退货申请这个任务。如果不加边界模型会尝试理解用户情绪、判断责任方、甚至开始跟用户道歉——这些都在消耗上下文、延长推理时间而且大概率产出不稳定的结果。当我把任务边界改成判断退货条件是否满足 提取必要订单信息 调用退货接口三件事之后系统的稳定率直接提升了近30%。这背后的原理其实很简单LLM在开放域的推理能力是统计性的一旦任务边界模糊它的输出方差就会指数级增加。把任务边界定义得越清晰模型的推理路径越短幻觉率越低。2.2 任务拆解不是分步骤而是分决策点这里有一个很常见的认知误区。新手做任务拆解喜欢把任务拆成第一步做什么、第二步做什么这其实是流程拆解不是任务拆解。真正的任务拆解拆的是决策点。什么意思呢流程里的每一步执行不一定需要Agent做判断但每一个需要根据输入内容变化而选择不同路径的地方才需要Agent介入。我举一个内部项目里的拆分案例子任务是否拆出独立决策点理由提取用户订单时间否纯信息提取正则或结构化输出即可判断是否在退货期内是需要多条件组合判断且存在边界情况选择退货方案是根据用户地址、商品类型选择不同流程生成退货回执否模板化输出固定格式拼接即可如果你接触过React Agent或者Swarm这类偏底层的框架你会发现它们的核心能力之一就是根据当前状态决定下一步动作。这个动作的选择本质上就是在决策点之间的跳转。所以任务拆解得越细Agent的每个决策点越简单整个系统就越接近确定性程序少量智能判断的组合。这个组合越稳定Agent越可靠。2.3 给Agent立规矩什么时候必须停下来这一点是我认为所有做Agent的人最容易忽略的。我们用LLM做Agent天然有一种倾向是让模型尽量处理所有情况但实际项目里设计什么时候不做比怎么做更重要。我早期做的其中一个Agent用户问什么我都想让模型硬接。结果就是模型会编一个查询条件、会猜一个不存在的订单号、会把退款金额计算出负数。后来我总结了一个硬性规则当置信度低于某个阈值或者关键信息缺失时Agent必须调用一个澄清工具或者直接转人工而不是继续推理。这个规则怎么落地呢不是靠一句Prompt里的如果你不确定请询问用户——那样模型会过度询问体验极差。正确的做法是让Agent在决策点强制校验参数比如查询订单号必须匹配数字字母组合的正则否则就触发澄清分支。也就是说把关键约束放到工具层的参数校验里而不是放到模型层的自觉里。这个经验回头我会在第5部分展开讲。3. 第二件事工具不是越多越好重点是能被模型调对3.1 Skill、Tool和Action的关系别被各种框架绕晕最近Agent开发社区里有一个讨论度很高的点Skill和Agent的区别到底是什么其实各家框架的命名不太一样但底层逻辑是共通的。Tool工具最小的可执行单元比如查询天气API计算运费生成图片。Skill技能一组围绕某个场景组织的提示词工具集合比如售后处理技能里包含订单查询工具、退货判断规则、话术模板。Agent一个拥有目标、记忆和决策逻辑的运行时载体它根据当前状态选择调用哪个Skill或Tool。我见过不少人把Skill直接理解成多个Prompt的集合这有偏差。Skill的封装对象是能力而不是文本。一个合格的Skill应该包含三部分触发条件描述、工具清单、执行策略包括边界规则和错误处理。举个例子。我给一个内容审核Agent封装过一个图片安全审核Skill它里面包含图片描述工具、安全策略判断规则、以及拒绝内容的回复模板。当用户上传一张图Agent先判断是否需要审核再调用SkillSkill内部再去调度具体的API。这样的分层方式比让Agent直接在几十个工具列表里选要稳定得多。3.2 工具定义的质量决定了Agent的智商关于工具这里我最想强调的一个点是工具描述写得不好等于没给模型导航。以OpenAI Function Calling的经验来说模型是通过工具的description来理解什么时候该用这个工具的。结构化参数只是第二步。我自己吃过亏。有一个项目里我定义了一个获取用户信息的工具description写了一句话获取用户基本信息。结果模型在用户问订单问题的时候也调用它因为模型的逻辑是查订单之前得先知道用户是谁。后来我把description改成当用户提供手机号或用户ID时调用用于获取该用户的注册信息、会员等级和常用收件地址。该信息用于辅助售后判断不能直接作为订单查询结果。改完之后调用准确率明显提升。所以给到读者一个非常实用的建议写工具描述时一定要交代清楚三件事——什么时候用、用之前需要哪些参数、用了之后返回什么结果能够接续什么决策。这比你在Prompt里写一百句你要聪明一点都管用。3.3 我见过的工具设计最佳实践按业务能力域收敛早期我做一个功能顺手定义了二十多个工具接口。结果每到关键决策的时候模型选择工具的时间明显变长而且经常选错。后来做了一次重构把工具按业务能力域收敛成四个大工具每个大工具内部自己负责路由和错误处理整个系统的表现反而好了很多。这个思路跟RPC框架里的BFF层有点相似不要让模型面对数百个细粒度工具而是给它提供几个总闸门。每个闸门内部再通过参数区分具体操作。这不仅降低了模型的选择难度也让工具的测试和Mock变得更加容易。下面是当时重构前后的对比非常直观地展示了为什么少而粗有时优于多而细维度重构前细粒度工具重构后能力域工具工具数量24个5个工具调用准确率约82%约96%单次决策延迟约2.1秒约0.9秒mock和测试难度高需要逐接口mock低按域mock4. 第三件事记忆体系不是聊天记录而是结构化决策上下文4.1 短期记忆、长期记忆、永久记忆到底怎么落地Agent记忆这个话题最近逐渐热起来了相关的框架也越来越多。很多人问我记忆体系到底怎么设计。我先说一个最核心的认知记忆的本质是让Agent在做决策时拥有上下文而上下文的形式远不止聊天记录一种。按时间粒度和用途我把记忆体系分成三层短期记忆工作记忆当前对话轮次中需要临时保存的信息比如用户刚才说订单编号是A12345。这一层通常存在于上下文窗口内用完就丢。长期记忆场景记忆跨对话持续有效的业务信息比如用户偏好顺丰快递该用户是企业级会员。通常存储在处理后的向量库里按需检索注入。永久记忆知识记忆几乎不变的数据资产比如商品的售后规则、退货政策、渠道费率表。它们不太需要向量化的语义检索更适合用结构化存储加规则引擎。这三层记忆分开建不要混在一个Redis或者向量库里。否则就会出现一个经典问题用户刚聊完的事情下次对话被错误地当成了历史偏好甚至污染了政策判断。4.2 记忆检索里的时效性是大多数项目翻车的根源我一直有一种观点Agent的记忆检索难点不在如何存进去而在什么情况下应该忘掉。以长期记忆为例在向量检索时如果不加时间衰减会出现这样的窘境用户三个月前问过某型号的维修方法三个月后他问现在这个机器出问题了怎么办Agent反而把三年前的旧方案检索了出来因为新对话里没有更相关的文本片段。我的做法比较朴素但有效在每条记忆入库时打上last_access_time和hit_count两个标签。查询的时候除了语义相似度还要计算一个时效得分两者做加权和。具体公式大致是final_score 0.7 * cosine_similarity 0.3 * time_decay_factor其中time_decay_factor按天递减比如pow(0.99, days_since_last_access)。这样新近的记忆会得到额外加成旧记忆慢慢淡出检索结果。效果上实测能让记忆串味的问题减少一半以上。对于很多中小型团队的Agent项目这个简单方案已经足够用了。4.3 从选型角度聊聊哪种记忆框架适合什么项目最近社区里有很多记忆框架和选型相关的讨论比如Mem0、MemGPT、Letta还有Zep。我统一说一下我的选型感受框架/方案优势适合场景自建结构化存储MySQL/Redis可控性最强适合业务规则稳定的系统企业应用、数据敏感场景自建向量库Milvus/pgvector灵活支持语义检索需要跨场景召回记忆的项目Mem0 / MemGPT 等框架开发快社区活跃快速原型、研究项目混合方案结构化标签 向量检索兼顾精确与语义我推荐的生产级方案我自己目前在生产环境用的是混合方案结构化标签时间、场景、业务类型负责精确过滤向量库负责候选召回。框架的话早期用过几轮之后最终还是抽了出来因为业务里没有哪个现成框架的记忆衰减策略能完全匹配我的需求。这也是想提醒大家的一点框架可以帮你把轮子转起来但记忆这东西还是得结合自己的业务场景去修改底层策略否则上线跑一周你会积累一堆低质量的记忆垃圾。5. 第四件事多Agent协作的真相——先单Agent再谈编排5.1 多Agent不是多个大模型开会而是拆解后的职责分配在聊多Agent之前我想先泼一盆冷水如果你连单Agent的任务边界都没想清楚直接上手多Agent协作大概率会得到一个华丽但失控的系统。多Agent协作的中文翻译其实就是多个职责明确的程序模块通过消息传递完成一个共同目标。为什么需要多Agent而不是一个超级Agent主要有三个原因上下文隔离不同领域的信息不混在同一个上下文里减少相互干扰。权限控制某些Agent可以访问敏感数据另一些则不能。容错与降级某个子Agent出错时不会拖垮整个主流程。我比较常见的落地方式是主管-工人模式一个协调者Agent负责理解用户目标和任务拆解然后分发给多个工具型Agent执行最后做结果整合。这其中的关键点在于协调者Agent的决策尽量简单化——它不需要自己做具体业务判断而是根据规则或少量分类结果决定把任务交给谁。5.2 协作的基础不是聊天是结构化消息协议很多入门者会把多Agent协作理解为多个Agent互相发消息聊天这是大坑。如果Agent之间用自然语言来回对话不仅延迟翻倍而且消息内容难以追踪和回放。我建议的做法是定义一套结构化消息协议——即消息就是一个JSON对象包含task_id、sub_task_type、payload、status、callback这几个字段。Agent之间只传结构不传废话。举个例子假设有一个数据处理Agent收到了上游发来的sub_task_type: validate_email它处理完直接返回{ task_id: task_0001, sub_task_type: validate_email, status: success, payload: { valid: true, normalized_email: userexample.com } }下游Agent只需解析这个JSON就能决定下一步。不需要上游Agent写一段我已经验证完邮箱了它是有效的这种自然语言来传递信息这样既省Token又便于排查。5.3 编排模式选型的核心思路脉络优先工具其次当前主流的Agent编排框架功能其实都大同小异。很多人在朋友圈看到某个新框架发布就觉得技术又要重构了实际上没必要。我在谈框架选型时关注以下几个核心命题无论框架叫什么名字只要这些维度符合项目需求它就能用是否支持可观测性能不能看到每个子任务的执行状态。是否支持异步消息避免阻塞式同步调用造成的资源浪费。是否支持降级策略子模块失败时能否走备选路径。是否容易接入自定义Skill/工具。如果满足这四点无论框架是LangGraph、AutoGen、CrewAI还是自己写的状态机都能支撑项目跑起来。我甚至见过有人在生产环境里用纯消息队列加一个聪明的调度器就实现了不错的多Agent编排。做得太重反而让团队陷入为了用框架而用框架的困境。这里补充一个我很认同的观点来自吴恩达的Agent教程多Agent模式的第一步永远是思考你需要并行还是串行。串行场景适合长流程制造并行场景适合信息收集。框架只是把这些模式实现成代码结构真正定方向的仍然是你对业务流程的理解。6. 第五件事评测、防错与可观测性是Agent开发不被炒鱿鱼的底线6.1 没有评测体系的Agent开发等于瞎开车如果让我从近两年经验里挑一个对团队价值最大的技术方向我会说评测Eval和可观测性。几乎所有Agent做不好落地的团队问题不是出在模型能力不够而是出在无法证明模型能力足够好、也无法及时发现它变差。早期我们开发Agent时评测全靠人工试几条用例。后来发现模型版本一升级一些功能就悄悄退化但代码和环境都没变。那个阶段踩了不少坑。后来总结出来的教训是Agent评测不能只看最终回复是否正确还得看工具调用序列是否正确、是否及时停止、是否产生幻觉等。我目前在生产环境维护的评测体系包括回归评测集按业务场景整理几十条典型输入每次Agent改版后自动化跑一遍。工具调用审计记录每个工具的触发条件、入参、出参做离线分析。用户反馈闭环线上真实用户点踩或者转人工的数据回流到评测集。延迟与Token成本监控这些指标很多时候比答案正确更能反映系统健康度。有读者可能觉得麻烦但我的建议是哪怕最开始只整理20条真实业务场景做回归测试也比完全靠感觉和手工验证好。做Agent开发没有评测体系的加持上线后就会陷入修好一个bug引入三个bug的循环。6.2 Agent执行错误别只盯着traceback要分层定位标题相关热词里有一条是agent execution terminated due to error.这让我想起很多人在社区里问这种报错怎么处理。实际上这个报错信息通常出现在使用某些Agent框架时——当一个内部工具或子任务失败框架就把整个流程终止并抛出这么一条笼统的信息。只盯着这条报错看没有任何意义。正确的排查方式是把错误分层来看对不起不能用Mermaid。我改用文字描述排查Agent执行错误时按照意图理解层 → 工具调用层 → 编排执行层 → 模型推理层逐层定位。意图理解层用户输入是否被正确分类是否错误触发某个Skill。工具调用层工具入参是否合法API返回是否失败超时设置是否合理。编排执行层多Agent协作时消息协议是否有误子任务状态流转是否卡死。模型推理层LLM是否幻觉、是否拒绝执行、是否上下文过长导致截断。我自己碰到过最典型的一个情况是某个工具偶尔会因为上游接口超时而返回空数据Agent拿到空数据后没有走数据缺失分支反而生成了错误的业务结论。从表面看就是一句泛泛的execution terminated due to error实际根因是工具层没有对空结果做防御性验证。把校验加进工具层之后这类错误就几乎消失了。6.3 稳定性工程sleep、重试、降级三板斧说句稍微得罪人的话很多Agent开发者在写代码时没有把稳定性工程当成一回事。模型调用LLM API是有网络波动、有速率限制、有偶发超时的。如果你的代码不处理这些生产环境一定出问题。我处理LLM异常和工具异常时有一套固定的思路所有外部调用统一加超时和重试例如超时10秒重试3次指数退避。关键路径上加降级策略模型挂了就切规则引擎规则引擎挂了就切人工。每次外部调用记录耗时和返回码方便事后复盘。这套思路不是老生常谈。Agent项目由于链路长任何一环出问题最终表现都是整体不可用。而这种不可用的代价比传统后端应用大得多因为用户感知到的不再是某个接口报错而是这个AI助手好像变蠢了。6.4 架构选型时多问一句这个框架坑不坑最后闲聊一下框架选型的心态。前面讲到Hermes、Pi这些新名词其实在很多热搜词里频繁出现。我的看法是AI Agent领域现在处于一个高速迭代期几乎每个季度都有新的框架出来不值得为了追新而追新。选框架之前先把下面这些问题过一遍框架的维护活跃度如何有没有人解决Issues社区案例是否覆盖了与你类似的生产场景框架的抽象层级是否和你的业务复杂度匹配如果框架一年内不再更新你的代码还能不能继续维护我用过好几个框架有些项目后来因为框架迭代太激进团队被迫频繁改代码痛不欲生。后来我们的策略变成了核心Agent逻辑尽量自己写框架只负责外围的消息分发和状态管理。这样一来无论框架底层怎么变我们的核心业务逻辑都相对稳定。这也是为什么我前面一直强调少依赖框架做理解多依赖框架做基建。7. 沉淀一下这两年我最常用的落地核查清单这算是给急着上手项目的读者一个可以直接抄的清单。我每次接手一个新的Agent项目不管业务领域是什么都会按这个顺序过一遍目标边界用户一句话输入时Agent能识别多少种意图哪些场景明确不处理决策点清单把核心业务流拆成决策点确认每个决策点有对应的规则或工具。工具描述逐条检查工具描述是否包含什么时候用、用什么参数、返回怎么接续。记忆分层确认短期、长期、永久记忆的存储介质和时效策略是否分开。协作消息协议如果有多Agent确认消息结构是否稳定、可追踪。回归评测集至少准备20条真实场景用例自动跑完并记录结论。稳定性预案确认超时、重试、降级、人工接管四件事都写进了代码。写到这里差不多把我这两年的核心经验都掏出来了。要说做Agent开发有什么天赋型选手我是不太信的。这个方向说白了就是想法 工程 数据验证三件套一直转。你要是能把这五件事真正想明白、做扎实哪怕不追任何新框架也能做出一个能稳定交付价值的系统。这也是我做Agent开发到现在最想传达的一句话。
阅读完成 · 觉得有帮助?
咨询建站