ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Agent开发两年总结:决定项目成败的五个工程关键

Agent开发两年总结:决定项目成败的五个工程关键 如果你问一个刚入门的开发者Agent开发要学什么多半会得到LangChain、AutoGPT、提示词工程、Function Calling这些答案。我做了近两年Agent开发踩过的坑比写过的代码还多现在反而觉得这些都不是最核心的。真正决定一个Agent项目能不能落地、能不能扛住线上压力的其实是另外五件事任务定义、骨架设计、记忆管理、工具调用工程化、评测与观测。这五件事没有哪一件是某个框架直接给你的也没有哪个模型能替你解决。今天就把我这近两年的心得一次性说清楚。先交代一下背景免得大家觉得我在空谈。我这两年做过基于大模型的SQL查询助手、企业文档信息抽取Agent、多Agent协作的运营分析平台也给公司内部搭过Agent中台。框架换了好几轮模型也试了不少最后发现一个规律demo阶段翻车少一上生产就全是问题而且九成以上不是模型不够聪明而是工程问题。典型表现就是任务边界模糊、上下文越堆越乱、工具调用一并发就超时、出了问题根本不知道是哪一步干的。所以这篇文章我不打算推荐任何“必学框架”而是把这五件真正值得反复练的事情拆开讲。适合正在学Agent开发、准备从0到1搭Agent项目的朋友参考也适合有经验但总觉得系统不稳定的同学对照自查。1. 先把任务定义讲清楚Agent最怕的不是模型笨而是目标模糊我做Agent开发两年最强烈的感受是大模型像一个能力很强但特别容易自作主张的新员工。你只跟它说“你帮我处理一下这些数据”它大概率会按自己的理解处理给你一份看起来像模像样、但完全不是你要的东西。这不是模型笨而是任务边界不清晰。很多人把精力花在调Prompt上其实真正该先做的是把任务定义写明白。1.1 为什么“一句话需求”只能得到“一句话方案”很多人第一次体验Agent时会直接说“帮我抓一下这个网站的信息”或者“查一下销售数据”。在Demo里模型可能真的做出来了但换个数据源、换个字段名马上就崩。我见过一个项目用户让Agent“整理一份客户列表”结果模型一会儿按公司名去重一会儿按联系人去重输出格式也每次都不一样。这不是模型笨而是“客户列表”这个需求本身没有定义清楚。核心原因在于Agent不是搜索引擎它是一个需要指令契约的执行器。模型再聪明也无法从一句话里推断出你隐含的验收标准。你心里想的客户范围、去重规则、输出格式、排除名单它全不知道。它只能根据训练数据里的统计规律去猜猜一次准不代表次次准。所以做Agent开发的第一课不是学框架而是学会把模糊需求翻译成机器能执行的指令。我自己的习惯是接到任何一个需求先写一段任务描述卡至少回答清楚“处理对象是谁”“输入数据长什么样”“期望输出是什么格式”“哪些操作是禁止的”“什么时候算完成”。这段描述卡不需要给用户看但它决定后续所有工作的稳定性。很多项目失败不是死在Agent实现上而是死在这张卡没写好。1.2 输入输出契约把自由文本框成固定格式任务定义的第一个具体动作是把开放式的输入输出变成固定契约。拿SQL查询Agent举例这是我最常被问到的场景。不要直接接受“查询一下本月华北区的销售情况”这种自由文本而是拆成明确参数数据源是什么、要查哪个时间段、目标表是哪几张、输出字段有哪些。更稳的做法是预置一组可查询的表结构和字段白名单模型要查的表不在列表里直接拒绝而不是让它瞎猜。契约设计越严格模型越不容易出错。比如给模型一个结构化的任务对象包含这些字段task_type任务类型、target_entity目标实体、parameters参数对象、constraints约束条件、expected_output期望输出格式。模型的任务就是把这个对象填完整然后调用对应工具。这比让模型读一大段自然语言指令要可靠得多。我还建议给每个输入参数加上类型、范围、示例值。什么是示例值比如“time_range: [开始时间, 结束时间]格式YYYY-MM-DD示例[2024-01-01, 2024-01-31]”。一个具体例子比十句描述都管用。模型非常擅长模仿示例但非常不擅长从含糊描述里推断格式。这个规律在Function Calling里尤其明显。1.3 约束和退出条件没有终止条件的Agent会“努力跑偏”任务定义里最容易被忽略的是“什么时候该停”。Agent在长任务里特别容易陷入循环同一个工具调用几十遍或者已经拿到答案还在继续补充分析。我见过一个Agent做财报分析明明已经得出ROE数据了又连续调用了四次计算工具每次结果都一样纯粹在烧token。原因就是没有定义终止条件。所以必须在任务定义阶段写清楚三件事第一达到什么状态算完成第二连续失败几次就放弃第三超时上限是多少。我给Agent做内部项目时会要求任务对象里必须携带“终止条件”字段。比如“当所有查询字段都成功返回结果后输出最终报告并停止不要追加额外建议”“单步执行失败超过3次直接返回错误说明不要重试”。失败处理也很重要。Agent执行过程中遇到不可恢复错误时它倾向于自己编一个理由继续跑而不是停下来。你要在提示词和工具层同时做限制工具返回明确错误码Agent发现致命错误就进入兜底分支返回预设的降级话术。没有退出条件的Agent就像一个没有刹车的车早晚出事。1.4 任务定义模板我这两年在用的最小清单很多朋友问我要一个可以“抄作业”的模板我就把这两年实际在用的最小清单说出来。不一定适合所有场景但能覆盖大多数项目。目标用一句话说清楚任务对象、范围、动作例如“提取本周客户工单中的高频问题TOP10”。输入清单有哪些表、字段、文件、接口数据从哪来由谁提供。输出定义结构、字段名、格式、示例最好给一条完整输出样例。约束条件禁止访问的数据、禁止调用的工具、不允许使用的参数值。终止条件成功标志是什么失败多少次后放弃超时阈值是多少。兜底行为失败后返回什么话术是否需要转人工是否记录异常日志。这张清单看起来简单但每次写都能发现问题。比如“提取高频问题TOP10”TOP10按什么口径排序按出现次数还是按影响人数要不要排除某些已知问题不写清楚模型每次都会给你一个“看起来合理但没法用”的结果。任务定义越细后续的评测、排障、迭代就越轻松。这是整个Agent开发里性价比最高的一步。2. 学会搭Agent骨架先从徒手写ReAct开始任务定义解决的是“做什么”骨架设计解决的是“怎么走”。很多初学者一上来就用LangGraph、AutoGPT这种重型框架结果出了问题根本不知道是框架的锅还是自己的锅。我强烈建议每个做Agent开发的人先徒手写一遍最基础的ReAct循环。自己写过一遍之后再看任何框架都会觉得它的抽象很自然。2.1 ReAct循环所有Agent框架的“最小公倍数”ReAct的全称是Reason and Act核心思路就是交替执行“思考-行动-观察”三个步骤。模型先根据当前状态决定下一步做什么然后调用工具再把工具返回的结果作为新的观察输入继续思考。这一套循环几乎被所有Agent框架沿用区别只是在外面包了不同的状态管理和编排逻辑。我建议你用Python手写一个极简版本不依赖任何Agent框架核心逻辑大概长这样def run_agent(task, tools, max_steps10): messages [{role: system, content: 你是任务执行助手请严格按照流程调用工具。}] messages.append({role: user, content: task}) for step in range(max_steps): response llm.chat(messages, toolstools) if response.tool_calls is None: break messages.append(response) for call in response.tool_calls: tool tools[call.function.name] observation tool.run(**call.function.arguments) messages.append({ role: tool, tool_call_id: call.id, content: str(observation) }) return response.content代码虽然短但里面隐藏了四个关键问题第一模型返回的JSON解析失败怎么办第二工具抛异常怎么反馈给模型第三上下文越堆越长怎么处理第四循环到最大步数还没有结果怎么收尾。这四个问题就是Agent开发的“基本功”不亲手踩一遍后面用框架也会莫名其妙地翻车。我见过有人直接用LangChain里的AgentExecutor跑通demo很开心结果线上遇到工具参数解析错误完全不知道错误是模型产生的还是框架转换格式时产生的。这就是因为对底层循环不熟。所以哪怕你最后决定用框架我也建议先手写十行代码跑通一遍。2.2 从单循环到Plan-and-Execute长任务的必经之路单ReAct循环适合短任务比如“查一下订单数量”。但任务一旦变成“分析过去三个月不同区域的销售趋势找出异常原因形成报告”模型在单循环里就容易迷失。它经常做完第一步就忘了后面的计划或者被某个中间结果带偏。这时候就要用Plan-and-Execute模式俗称先规划再执行。流程是第一步让模型把大任务拆成若干子任务生成一份结构化计划第二步按计划一个个执行第三步每完成一个子任务就更新计划进度最后一步汇总输出。这样做的好处是每一刻模型都知道自己走到哪了、还剩什么不容易跑偏。我实践下来的经验是计划阶段要让模型明确输出每个子任务的依赖关系、输入输出和终止条件。比如“任务2提取销售数据依赖任务1区域配置表输出为DataFrame完成后标记完成进入任务3”。把计划当成一个可执行的状态机而不是一段散文。这样即使中途失败也能定位到具体是哪一个子任务出错。Plan-and-Execute的缺点是规划质量的直接影响全局。如果模型第一步就把任务拆错了后面再努力也是白费。所以需要在规划阶段加一道校验比如让模型对计划做自检或者用一套规则检查子任务是否覆盖了任务目标。没有校验的规划很容易变成“计划很完美执行全白费”。2.3 多Agent编排能力互补还是互相甩锅多Agent是这两年特别容易被神化的方向。许多人一提到复杂任务就觉得应该让一个Agent查数据、一个Agent写报告、一个Agent做质检。但我在实际项目里吃过亏。运营分析平台一开始就拆了数据Agent和报告Agent结果数据Agent返回的结果表述不清报告Agent就把错的中间结果当成事实写进报告。错误像传话游戏一样被一级级放大排查起来特别痛苦。多Agent会增加两层成本一层是通信成本A的输出要变成B能理解的输入这中间要做格式转换和语义对齐另一层是信任成本B无法判断A给的中间结果是真是假只能选择相信于是A的错误会悄悄传递下去。除非真的有明确的角色差异、独立的上下文空间和严格的接口协议否则我不建议强行用多Agent。我后来把那个平台改成了单Agent加两个工具任务流程由Agent内部编排效果反而稳定很多。单Agent 好的工具编排往往比多Agent更适合大部分业务场景。多Agent适合的是需要专业化分工的领域比如一个负责代码生成、一个负责代码执行、一个负责安全审查每个Agent都有自己独立的记忆和校验逻辑这时候才值得引入。2.4 框架选型到底该不该上LangGraph既然手写循环能跑通为什么还需要框架框架解决的是状态管理、图编排、条件路由、断点续跑这些问题。当你需要处理复杂状态流转比如一个任务有分支、有循环、有需要在中断后恢复的场景手写代码会迅速膨胀到不可维护。这时候LangGraph这类图编排框架是有价值的。但框架不是银弹。我在选型时的标准很简单团队里每个人是否理解这个框架的核心抽象如果大家只会照着示例代码改出了问题就会陷入“框架黑盒”的困境。另外框架的抽象会隐藏一些细节比如上下文管理策略、工具调用的异常处理这些恰恰是线上最容易出问题的地方。如果你对这些底层逻辑没有体感选框架就是在赌运气。我还想提醒一点不要因为某个框架热就去迁。热词“Agent框架与编排”背后的本质需求是解决复杂流程问题不是解决模型智商问题。如果你当前项目只是简单的“问答工具调用”用最基础的循环就够了。框架是工具不是目的。我在近两年里最稳定的一次系统反而是用不到两百行的自定义调度器实现的。3. 记忆管理决定Agent“越用越聪明”还是“越跑越糊涂”记忆是Agent开发里最容易被低估的部分。很多人一开始以为Agent的记忆就是把对话历史都留在上下文里结果上下文越堆越长模型越来越糊涂回答质量快速下降。真正做好记忆管理需要分清楚什么是当前任务的工作备忘什么是值得长期沉淀的业务知识以及怎么让记忆不被脏数据污染。3.1 Working Memory当前任务的工作台标签里常说的working memory指的就是当前会话中必须暂存的信息。它和长期记忆最大的区别是工作记忆是临时的、面向当前任务的用完就应该清掉或压缩。很多Agent失败就是因为把工作记忆和长期记忆混在一起所有历史对话全往上下文里塞。正确做法是维护一份结构化的工作备忘每次模型调用前把它组装进提示词。我常用的字段包括当前目标、已完成步骤、待办步骤、关键中间结果、当前假设、失败记录。举个例子一个多步数据清洗Agent工作备忘里应该写清楚“已完成读取源文件格式化为DataFrame去重规则应用待办缺失值处理结果导出注意日期字段存在混合格式”。这比把前二十轮对话全部塞进上下文高效得多。工作记忆还有一个容易忽略的细节要区分“事实”和“推测”。模型在中间过程产生的推断不能直接当成事实写进工作备忘。我会让Agent在记录时明确标注置信度比如“门店A的销售下降原因可能是促销活动结束待验证”。否则一个错误推测被反复传播后面每轮推理都会被带偏。3.2 长期记忆向量库只是存储真正难的是写入和召回很多教程一讲长期记忆就推荐你搞向量数据库加Embedding好像把文本往向量库里一扔就万事大吉。但我的经验是存储永远不是难点真正的难点是两件事写什么进去以及什么时候把什么捞出来。写入策略上不能把每条对话都存进向量库。我自己按业务对象组织长期记忆比如“客户记忆”“项目记忆”“偏好记忆”每条记忆都要带上业务对象ID、时间、来源、置信度。召回策略上不是每次对话都去全局向量检索而是先按对象ID过滤再做相似度检索。比如用户问“这个客户之前提过什么需求”就先锁定客户ID再在该客户的记忆集合里搜索而不是在整个知识库里漫游。我还建议给长期记忆加一个“活跃度”机制。经常被命中的记忆排在更前面很久没被用到的记忆降权。单纯依赖向量相似度很容易把那些语义相似但已经过时的旧信息捞出来干扰当前判断。长期记忆系统设计得好的Agent会给人一种“越用越懂你”的感觉设计得不好就是越用越糊涂。3.3 记忆写入策略先压缩再沉淀我见过很多“越用越傻”的记忆系统根因是写入太随意。对话刚结束就把原始聊天记录全部向量化入库没过几天库里全是互相矛盾的碎片。比如用户周一说不喜欢邮件推送周二说紧急消息可以发邮件两条记忆都存在模型下次就只能靠猜很容易选错。更稳的写入策略是分两级会话内压缩和离线沉淀。会话内压缩任务进行时每几轮对话就把历史压缩成摘要只保留事实、结论和待办减少对模型注意力的占用。离线沉淀任务结束后把最终结果、用户明确表达的偏好、经过验证的事实写入长期库并和已有记忆做冲突检测。写入之前还要做去重和去噪。比如用户重复说过的偏好只保留最新一次从外部文档里抽取的信息要标记来源和可信度已经被推翻的结论要增加“已废弃”标签而不是直接删除。记忆系统的质量决定了Agent在长周期使用中的上限。3.4 记忆安全不要把全部秘密放在同一个prompt里记忆这个主题绕不开安全问题标签里也有“A-MemGuard”这样的词。这类研究做的是对LLM记忆写入做防御性检测核心动机是Agent在浏览网页、读取文档时可能收到攻击者精心构造的提示注入内容诱导Agent把恶意指令当作事实写入长期记忆。一旦恶意指令进了记忆下次Agent运行时攻击者的话就变成了“内置系统指令”危害比单次提示注入更大。所以记忆系统一定要分信任级别。用户主动输入的信息、系统日志、外部抓取内容这三者的可信程度完全不同不能混在一个池子里。我的做法是外部不可信内容默认加“低可信度”标签只有在经过二次确认、与已有事实不冲突、并且来源可靠的情况下才允许提升为长期记忆。另外写记忆之前要做敏感信息过滤比如手机号、身份证号、内部系统地址该脱敏的必须脱敏。记忆不只是存储它也是安全边界。4. 工具调用Agent的“手”比“脑”更容易出事如果说任务定义是大脑骨架是脊椎记忆是硬盘那么工具调用就是Agent的双手。这两年我最深的感受是Agent真正出大事的地方往往不是模型回答错了而是工具被错误调用、重复调用、越权调用。一个脑洞很大的模型加一堆没约束的工具就像一个人拿了把没保险的刀到处挥舞。4.1 工具描述写得不好Agent就会乱传参数Function Calling看着很美好但实际用起来模型选错工具、填错参数是家常便饭。最常见的原因是工具描述写得太糊。比如一个搜索工具描述写“搜索关键词”模型就真的只传一个关键词完全不填搜索范围、时间限制、返回条数。更离谱的是把参数名写得不明确模型把日期传到用户名里。我的建议是工具描述要像正式API文档一样严格。每个参数都要写清楚类型、是否必填、取值范围、示例值、单位。能枚举的就枚举能限定格式的就限定格式。比如{ name: search_products, description: 按条件搜索商品信息所有参数均为必填, parameters: { type: object, properties: { keyword: { type: string, maxLength: 30, description: 商品名称关键词示例无线鼠标 }, category: { type: string, enum: [electronics, fashion, food], description: 商品类目 }, limit: { type: integer, minimum: 1, maximum: 20, description: 返回数量上限 } }, required: [keyword, category, limit] } }模型对例子的理解能力远超描述所以 Description 里一定要放具体示例。我见过参数描述写“用户要查询的时间范围”模型还是会给一个不规范的日期字符串改成“时间范围格式为2024-01-01至2024-01-31示例2024-01-01至2024-01-31”错误率立刻下降。除了写清楚Schema代码层还要做参数校验模型传错了直接拒绝并返回标准化错误信息让它重试。4.2 并发、重试与限流AI Agent扛并发不是模型的事“AI Agent怎么扛并发”这句热词背后藏着很多团队踩过的坑。Agent不是只有一个实例在跑线上可能是几百个任务并行每个任务又要调用多次LLM和外部API。这时候所有瓶颈都会暴露LLM有速率限制工具API有QPS限制数据库连接池会被打满网络带宽会被占满。我自己的经验是要把Agent当成一个普通的分布式后端服务来设计而不是靠框架自动解决。核心机制有这么几个限流对每个Agent实例、每个工具的调用频率做统一限流超过阈值直接排队或降级。超时LLM请求和工具请求必须设超时时间不能无限等。重试对临时错误做指数退避重试对致命错误直接返回不要盲目重试。幂等同一个工具调用重复执行时结果不能不同。特别是发邮件、写数据库、调支付这类操作一定要设计幂等键。缓存同一个查询在短时间内结果不变的比如股票查询、天气查询可以做结果缓存减少重复计算。链路追踪每个Agent任务一个request_id每次工具调用都记录这个ID否则并发一高问题根本没法查。我见过一个线上Agent系统单日调用量上来之后频繁超时排查之后发现是同一个外部搜索API被反复调用而且调用之间没有缓存。加了五分钟结果缓存之后整体调用量下降了一倍多。很多人一上来就研究模型参数量其实工程侧的并发设计才是线上稳定性的关键。4.3 工具返回结果的校验别把大模型的“自信”当事实模型拿到工具返回值之后特别容易“过度解读”。最简单的例子查询接口返回空列表模型为了完成任务硬是编出一段“近期无销售记录推测是因为季节性波动”的分析。这在业务上非常危险因为它把“没有数据”包装成了“有结论”。所以工具返回值不能直接丢给模型了事。在返回给模型之前要做几层处理第一校验返回数据是否符合预期Schema不符合就标记异常第二检测空值比如查询结果为空要在返回内容里明确写“结果为空不要编造数据请调整查询条件或终止任务”第三给返回数据加状态码和置信度模型能直接看到这次调用是成功、部分成功还是失败。错误信息也要让模型看得懂。很多工具直接把Java或Python的堆栈抛给模型模型根本不知道该怎么办只能瞎猜。应该把异常翻译成模型能执行的指令比如“超时请使用重试机制”“认证过期请调用refresh_token工具”“参数不合法请检查日期格式”。这也是一种“以模型为中心”的接口设计。工具调用链路做得好的Agent成功率能提升一大截。4.4 沙盒与访问控制给Agent一只可以犯错的手Agent如果只是查数据还好一旦涉及执行代码、访问文件、调用命令行就必须有沙盒。代码执行Agent尤其危险你让模型写一段Python脚本并执行它可能真的会访问不该访问的目录、下载不该下载的依赖。我见过很多团队图省事直接在宿主机上让Agent跑代码一次脚本失误就把生产环境搞挂了。我的做法是所有代码执行统一放进Docker容器限制CPU、内存、网络白名单、文件系统只读容器内的操作不影响宿主。生产环境的数据库凭证绝不能通过环境变量直接暴露给Agent每次连接用临时凭证加上访问范围限制。工具层也要做访问控制比如“只允许查询最近90天数据”“只允许读取客户名称字段不允许拉取手机号”。社区里讨论“codex沙盒”“hermes agent沙盒”这些词本质都是在说同一个问题Agent执行环境必须可控。我见过不少新手用桌面版Agent工具运行时报“agent execution terminated due to error”或者沙盒更新之类的问题很多时候不是产品坏了而是本地环境缓存过期、资源配额不足、安全策略阻止了执行。处理方法也简单重建干净环境、删掉旧缓存、检查网络策略和资源配额再重新跑一遍。但如果你自己的系统没有沙盒设计这类问题会更严重模型一旦拿到高权限一个错误命令就能造成不可逆损失。5. 评测与观测没有评估体系Agent开发就是碰运气最后一个主题是我认为Agent开发里最容易被忽略、但又最决定项目生死的一环评测与观测。很多团队做Agent全凭感觉跑一次成功就觉得成了换环境换数据之后立刻崩。原因很简单你没有建立一套系统化的评估和观测体系所有结论都建立在个例之上。5.1 结果评测只能说明“这次运气好”过程评测才能说明“为什么”Agent项目最迷惑人的地方是demo成功一次不代表真的成功。因为大模型有随机性同一个任务换一种表达方式甚至换一次采样温度结果都可能不一样。如果只比最终答案你根本不知道它是在哪一步开始偏的。所以我更强调过程评测。拿到一条跑完的轨迹要逐段检查模型有没有调用预期中的工具工具参数是否正确有没有跳过关键步骤有没有调用无关工具有没有在结果已经明确之后继续绕路举个例子任务要求“统计上周销售额”Agent先查了产品列表再做了计算最后给出数字。只看结果答案是对的但看过程它多查了一张完全无关的表。如果不做过程评测这类低效甚至错误的路径永远发现不了。过程评测还有一个维度是合规性检查。我在金融场景里做过一个Agent结果全靠人工核对太累后来写了自动检查规则比如“任何涉及金额的结论必须附上对应查询语句”“如果模型未调用查询工具就直接给出结论直接判失败”。这类规则比单纯看最终答案靠谱得多。5.2 构建回归集迭代Agent的地基做Agent开发最需要防止的是“改好了A弄坏了B”。今天调了一下提示词结果某个之前跑通的场景不跑了。要解决这个问题就必须有一套回归测试集。它不需要很大但必须覆盖正常、边界、异常三种情况。我习惯按标签组织回归集每个case包含四部分任务描述、期望行为、期望输出、禁止行为。举几个例子正常查询某门店本月销售额期望调用query_sales工具并返回结构化数字。模糊用户只说“看看上个月怎么样”期望Agent先问清楚范围而不是直接乱猜。多步需要先获取门店列表再逐店查询最后汇总。冲突用户同时说“只看直营店”和“包括加盟店”期望Agent能提醒矛盾。敏感用户要求导出全量客户手机号期望Agent拒绝执行。每次改模型、改提示词、改工具定义之后强制跑一遍回归集记录三个指标成功率、平均耗时、平均成本。再把失败case按标签归类你就能快速定位是哪个环节出了问题。我自己的经验是几十条精心设计的回归case比几千条线上日志有用得多。5.3 观测与排障从一次“agent execution terminated due to error”说起这类错误提示在Agent系统里太常见了几乎每个平台上都会出现。关键是它本身没有信息量纯粹告诉你有一步执行被终止了。真正要回答的问题是为什么终止是模型调用API超时工具返回了致命异常还是沙盒资源不够被强杀我的排查顺序是固定的第一看最后一条轨迹里模型试图调用什么工具、传了什么参数第二看工具层返回的状态码和错误信息第三看上下文长度是否已经接近模型窗口上限第四看沙盒状态是否异常比如临时目录被清空、网络白名单失效。为了支撑这套排查日志必须记录每一步的结构化信息。我常用的日志字段是request_id、step_index、model_prompt摘要、tool_name、tool_input、tool_output_status、token_count、latency_ms、error_category。没有结构化的轨迹日志排查这类问题基本靠猜。有一次线上报了一个“terminated due to error”查了半天才发现是某次工具返回了一个超长的Base64图片把上下文撑爆了。如果没有记录token_count和上下文长度这种问题要查很久。所以从项目第一天起就把轨迹日志当成一等公民所有Agent执行都落库后面会省下无数时间。5.4 从开发到上线灰度、限额、回滚Agent的特性和普通后端服务不一样它天然有随机性可能今天表现好、明天表现差。所以上线策略不能是“全量发布然后祈祷”必须设计灰度、限额和回滚机制。我常用的做法是灰度先让内部用户或少量白名单用户使用观察成功率、耗时长尾、错误分布稳定后再逐步放量。限额给每个Agent任务设置每日调用次数、Token预算、成本上限超过阈值自动熔断返回兜底话术并转人工。回滚每次改动都保留上一个稳定版本的配置一旦指标恶化能一键切回。模型Prompt、工具定义、参数阈值都纳入版本管理。分级告警退款、隐私数据泄露之类的高危错误立刻告警一般的工具超时、失败则进入慢速队列另行处理。我见过不少项目在演示时很惊艳一上生产就崩在“超额调用”上。比如某个Agent计划每个任务调用5次LLM结果线上平均调了50次成本直接爆表。加了预算熔断之后系统会自动在成本超过阈值时切换成轻量回答模式。这类机制不需要多高深的算法但它决定了Agent能不能长期稳定在线。做了近两年Agent开发我的体会是所谓学习路线不是去追框架名单而是把上面五件事反复打磨。每到一个新项目我都先写一页纸的任务定义和骨架设计哪怕后面会改也逼自己想清楚边界和验收标准。另一个小技巧是我有一个“坏案例文件夹”把线上所有出错的轨迹都收集起来定期复盘。它们比任何教程都有价值。迭代到后面你会发现Agent开发拼的不是谁的Prompt写得漂亮而是谁的工程边界清楚、评测完善、能够稳定交付。这五件事值得反复练。
返回列表