1. 为什么Agent开发总像“玄学”——先承认三件不体面的事
我有很长一段时间不敢在公开场合承认自己做Agent开发,因为没法回答一个很基础的问题:这个东西到底是怎么调出来的?昨天它表现惊艳,今天我原封不动跑同样的流程,它却在关键一步翻车了。没有改任何参数,没有换任何提示词,结果就是不一样。
这不是我一个人遇到的怪事。周围做Agent的团队,几乎都经历过同一种尴尬:Demo演示很流畅,一上真实业务就崩;跑通一条主流程很开心,换个数据集又满地找牙;修好了A问题,B问题又从哪里冒出来。大家嘴上说“AI是概率模型,有随机性是正常的”,但心里很清楚,把随机当合理性只是自欺欺人。一个连预期行为都无法稳定的系统,怎么做容灾、怎么做灰度、怎么做成本预估?
后来我陆续接触了一些真正把Agent推到生产环境的项目团队,才慢慢摸出一点门道。那些跑得稳的团队,并不是提示词写得比别人华丽,也不是选了一个更聪明的模型,而是他们在做三件看上去很朴素的事情:把人和系统的分工划清楚、把迭代的方法定下来、把预算当成架构设计的一部分。我把这三件事称作AI Agent开发的“铁三角”——分工、方法论、预算。
先别急着说“就这”?这三个词确实不像新概念,放任何一个软件工程里都是老生常谈。但放在Agent开发里,它们的含义和技术软件不太一样。传统软件开发里,分工靠模块和接口,方法论靠流程和规范,预算靠人天和服务器账单。而Agent开发里,模型本身是不确定的、行为是涌现出来的、成本是随对话内容动态变化的。这三根支柱,几乎每个团队都觉得自己有,实际上大多数都在靠个人英雄主义硬撑。
你把三条腿拆开看,会发现一件事:那些翻车的团队,通常是某一根支柱塌了。要么是人的职责和Agent的职责混在一起,整个流程变成一场大型“人肉补位”;要么是开发流程回到“改prompt靠手感、效果靠肉眼”的原始状态;要么是只管功能上线,没人回答一次Agent调用到底花了多少钱。更常见的是三种同时缺——那才叫真正的玄学开发。
所以这篇文章,就是把这三根支柱一一拆开,讲清楚每一根是什么、该怎么做、到哪里去取经。最后再合到一起,给出一套可以直接照抄上手的实战流程。目标只有一个:让你手底的Agent项目,从“看天吃饭”变成“按图索骥”。
2. 铁三角之一:分工——别让AI当“全才”,让它当好“专才”
2.1 先想清楚:Agent到底是一件事,还是一个团队?
很多人设计Agent的第一反应,是想让它独立完成一个完整任务:“帮我做个市场调研报告”“帮我把这个客服对话处理了”“帮我生成一整套营销方案”。这个想法本身没有错,问题出在实现方式上——不少人真就让一个Agent单线程从头干到尾,既要去理解用户意图,又要调用工具,又要整理结果,还要自己给自己纠错。
你想想,一个公司里如果只有一个人,既做销售又做售后还做财务,这个人大概率什么都做不好。Agent也是一样。一个大型语言模型虽然“什么都会一点”,但它在同一个上下文里同时扮演多个角色时,会在不同任务目标之间来回摇摆。你让它“先思考再回答,最后检查自己的答案”,它经常会认认真真走完流程,最后交给你的东西还是错的——因为它自己检查自己的时候,天然带上了“我已经答对了”的立场。
我在工程实践里见过比较靠谱的做法,是把Agent拆成“规划者、执行者、评审者”三个内部角色,哪怕这三个角色都用同一个底层模型来跑,也要在上下文中明确区分:规划者负责拆解任务、定步骤;执行者负责调用工具、查数据、生成阶段性产物;评审者负责拿验收标准对照结果,给出“过”或“不过”的判断。这听起来比“让AI一步到位”多绕了几层,但稳定性的提升是肉眼可见的。
2.2 人、模型、工具:三层职责边界要划清
比Agent内部角色更重要的,是人和系统的分工。很多团队犯的错,是把人当成系统的“兜底插件”——Agent一旦表现不对,立刻人工介入改prompt、改参数、甚至替它完成某些操作。这种“人机混合”模式短期内效果好,长期看是灾难,因为人的参与让系统行为变得不可复现,你永远不知道上一次成功到底是因为模型强,还是因为你在旁边顺手帮了一把。
我自己的经验是画一张三层图:最底层是基础设施和服务,包括API、数据库、缓存、消息队列这些常规组件;中间层是Agent本体,负责理解任务、编排动作、调用工具;最上层是人,只做三类决策——定目标、定验收标准、处理例外。Agent能自己跑完的流程,绝不让人插手;Agent拿不准的边界情况,不是临时人肉接管,而是要让它停下来明确求助,把问题抛回给人做决定。人不是系统的执行者,人是系统的定义者和监督者。
工具层的分工也容易被忽略。你在Agent里接的那些工具、API、脚本,不是“越多越好”的玩具,而是系统的“手脚”。每个工具都要有清晰的输入输出契约和错误处理策略。工具不稳定的,一定要在Agent调用之前加一层校验和兜底,别指望Agent自己的“智能”能对付一个设计得很烂的外部接口。
2.3 一个可落地的分工清单
我把在真实项目中打磨过的一套分工清单放在这里,可直接参考。
| 角色 | 核心职责 | 典型动作 | 典型错误(勿犯) |
|---|---|---|---|
| 产品/业务 | 定义用户任务、验收标准、边界范围 | 写用户故事、列评估用例、定“什么叫做好” | 只丢一句“帮我做个好用的Agent”,无验收口径 |
| 算法/Agent开发 | 设计角色、编排流程、选模型、调prompt | 搭RAG链路、配工具、跑评估集 | 把调prompt当“炼丹”,无版本无日志 |
| 工程/平台 | 保障API稳定性、监控可观测性、成本账单 | 接日志、接监控、做缓存和降级 | 等线上出问题才想起来没有监控 |
| 测试/质量 | 写评估集、跑回归、做灰度 | 自动化跑case、对比结果、总结失败case | 只测“Happy Path”,不测边界和攻击性输入 |
| Agent内部“评审者” | 对Agent自己的产出做二次校验 | 对照验收标准打回执行结果 | 评审者与执行者共用一套心智,人云亦云 |
这套清单的核心逻辑是:每一个环节都有明确的责任人,每一种失败都有明确的反馈回路。分工不是为了“分锅”,而是为了让你能说清楚“出了问题时,到底是哪一层出了问题”。
2.4 分工混乱的三个典型症状
第一症状是“Demo救火”。演示时Agent表现不好,开发人员直接在演示台上改prompt重跑,嘴里还念着“等一下,我换种说法”。这种操作放在开发环境没问题,但如果你发现生产环境出问题也都靠这个方式解决,说明人已经变成了系统的一部分。
第二症状是“人工标注不明”。用户任务、验收标准都没有落到纸面上,全凭开发者的“感觉”来判断Agent答得好不好。这样会导致评估结果完全不可复现——同一个case今天能过,明天你说它不能过,理由只是你心情变了。
第三症状是“Agent什么都能干”。当一个Agent变成“自动写文案+自动发邮件+自动管理日程+自动……”,它的上下文会越来越长、工具选择会越来越乱、故障爆炸半径会越来越大。你要做的不是让它“什么都会”,而是让它“在明确边界内做深做透”。想清楚什么不给它做,比给它堆功能更重要。
3. 铁三角之二:方法论——把“灵光一现”变成“流水线作业”
3.1 从自然语言需求到可验收的任务
“帮我做一个自动整理销售线索的Agent”,这句话不是需求,是愿望。方法论的第一步,是把愿望翻译成一组可以验证的任务。
我常用的模板是:当什么条件发生时,系统应当做什么动作,产出什么结果,达到什么标准。举个例子,客户说“自动整理销售线索”,我把它拆成四五条具体的验收场景:收到一封包含“预算、时间、决策人”三个字段的新邮件时,系统应提取字段并写入线索表,字段完整率不低于95%;收到一封只有“有兴趣,下次联系”的简短回复时,系统应判断信息不足并触发追问邮件,不能直接写入无效线索;遇到邮件附件是一个PDF合同草案时,系统应识别附件类型并移交给人工,不在Ans里瞎判断。每一条都能写进评估集,都能自动化跑。
这里有一条重要经验:凡是能用规则描述清楚的任务,就先别急着上大模型。地址清洗、字段映射、格式转换这些事,正则表达式和脚本比模型便宜一百倍,而且永远稳定。大模型只处理那些真正需要语义理解、推理判断的部分。很多人把Agent做成“万事都问模型”,纯粹是因为写规则太麻烦,但这份麻烦,恰恰是工程化最重要的投入。
3.2 从“我觉得行”到“指标通过”——搭一个最小评估闭环
模型和程序最大的区别,天然就在于前者的输出不可穷举。你没法给一个Agent写几千条单元测试来证明它正确,所以必须有一个持续的、自动化的评估机制。我把这套机制的最小形态称为“三个一”:一个评估集、一个运行脚本、一份对比报告。
评估集至少要覆盖四类样本:正常场景、边界场景、异常输入、攻击性/诱导性输入。正常场景是主流程的高频用例,边界场景是字段为空、长度超限、多义表达,异常输入是乱码、空白、突然打断,攻击性输入是试图让Agent越权或胡说八道的prompt注入尝试。一条用例最好固定成这样的结构:输入内容、期望行为、可量化的判定条件。
运行脚本要能自动化地把评估集跑一遍,然后把结果沉淀成结构化数据。我习惯用几十行Python就够,把每个case的输入依次丢进去,记录Agent的输出,再按字段比对结果。
def evaluate_agent(run_one_case, cases): stats = {"pass": 0, "fail": []} for case in cases: result = run_one_case(case.input, case.context) if result.meets(case.expected): stats["pass"] += 1 else: stats["fail"].append((case.id, result.error)) return stats真正让这套机制有用的,不是“跑完多少个case”,而是每次改动之后都跑一遍。你今天给一个Agent加了新工具、换了个prompt、改了一个系统指令,改动前后跑同一个评估集,用同一批case、同一套判定标准。指标升了,说明改动有效;指标降了,哪怕你直觉上觉得“应该更好”,也要认真反省。这套回归机制,是把Agent开发从“手感”拉回“工程”的分水岭。
3.3 思维链、自洽性、幻觉控制——哪些“花活”真正有用?
市面上关于“如何设计提示词”的说法多如牛毛。有的教你给Agent一个角色设定,有的教你强制让Agent“一步一步思考”,有的教你给模型塞一份几十页的“系统说明书”。我的态度是:在方法论层面,你可以都用,但必须给它们一个“可复现的验证条件”。
CoT在某些任务上确实能提升推理质量,但它不是免费的——它会让输出token变多,也会让Agent“自信地错”。我见过一个失败的客服Agent,它在输出最终答案前写了一大段“推理过程”,中间一句话把订单号给记串了,后续所有对话都基于这个错误展开。CoT的正确用法,是把中间推理产物当作一种结构化输出,扔给评审角色去检查,而不是把整个推理链条当作最终答案直接展示给用户。
幻觉控制在工程上的思路,是给模型划定“信息来源边界”。凡是涉及事实性回答的,优先去检索知识库或数据库,检索结果为空时,宁可让Agent回答“暂时没有查到,请稍后再试”,也不能让它编一个答案出来。RAG链路里最容易被忽略的是检索质量本身——你从一个质量很差的片段池里检索,模型当然只能基于脏数据进行推理。
3.4 灰度发布:Agent的上线方式,不是“一键切换”
Agent项目和传统后端服务在发布策略上有一个巨大差异——传统服务可以靠自动化测试来保障,Agent的行为天然带随机性,你没法保证一个prompt版本在100%的流量上都表现得和测试集一样。所以生产的“灰度”不是可选项,而是必需品。
具体做法也不复杂。把用户请求按照百分比或者业务标签分流,一部分流量走旧版Agent,一部分走新版Agent,两边全程埋点。灰度期间不要只看“回复成功与否”,要抽看回复质量——是不是真的解决了用户的问题,有没有引发客诉,有没有诱导性的错误信息。灰度时间拉长到至少一个完整业务周期,不要上午发版下午看数据没崩就觉得没问题。客服场景至少要看一周的完整值班轮转,销售线索场景至少覆盖从周一早高峰到周末的低谷时段,这样才能穷尽足够多的高频变化。
4. 铁三角之三:预算——成本不是账房先生的事,是系统架构的一等公民
4.1 预算不只等于“Token账单”:三类成本都必须算进去
在传统软件开发里聊预算,大家想到的是服务器、存储、人天工时。Agent开发的预算结构完全变了。最明显的是token成本——每次调用模型都是按字符数计费的,用户聊得越长、工具返回内容越大,烧的钱越多。token成本之外,还有两类经常被低估的成本:
第一是失败成本。Agent答错了,用户没注意,后面引发客诉或订单错误,这个损失往往远超token费用。我在一个外包项目里见过客户为了省成本,把Agent的模型温度调高、推理预算压得很低,结果是Agent经常在没看懂用户问题的情况下说出“您的问题已经解决”。省下的几分钱,最后全变成了人工返工和客户流失的费用。
第二是开发调试成本。“调prompt调了一个下午,还是觉得哪里不对”,这背后是一整段开发者的人力时间在燃烧。Agent开发里没有“编译报错”,所有错误都埋在没有结构性的文本输出里。这类隐性成本要通过方法论去压——评估集和回归跑起来之后,调试效率能提升一个量级,等于变相省了钱。
4.2 算一笔账:一个客服Agent到底要花多少钱?
先声明一点,下面的数字都是示例性的,不同模型、不同平台的报价差异很大,实际操作时以你采购到的真实报价为准。但计算框架是通用的,你套你自己的数字就能算出预算。
假设一个客服Agent处理一次用户会话,平均消耗的输入token是1.5万(其中大部分是系统指令、历史上下文、工具返回内容),平均输出token是5000。假设你用的模型报价大约是输入每百万token几十元、输出每百万token上百元这个量级(不同档位的模型和套餐价格差很多,实际以你采购到的真实报价为准)。算下来一次会话的模型成本大约在几元钱的量级。听起来不贵,但如果你一天有一万个真实用户会话,日成本就变成几万元。一个月下来,这个数字足够让财务部门找你要解释了。
更隐蔽的是长会话问题。用户和Agent多聊几轮,上下文窗口越堆越长,每轮都要把前面的历史打包发给模型,成本不是按对话轮数线性涨,而是按token总量复利式涨。一个用户如果和Agent聊了二十轮,前面只是简单问了个问题,后面已经变成了一个数千token的“庞大的历史包袱”,这些token每一次新回复都要重新计费。这就是为什么“用户只问了一句话,Agent却烧了一毛钱”的情况经常发生。
4.3 把成本从“事后算账”变成“架构决策”的六个手段
第一,加缓存。凡是系统指令、固定知识库片段、相似度很高的用户问题,都优先从缓存里命中,不再重复让模型跑生成。Prompt缓存命中率高的话,token成本能省下相当可观的一部分,实测中在客服类场景的节省效果特别明显。
第二,模型分层。不是所有问题都要用旗舰模型。一句话简介、标题改写、字段抽取这类简单任务,用小一号模型足够;复杂推理、长文本分析、关键决策才用强模型。在Agent框架里做一个模型路由模块,根据任务难度和字段置信度自动分发给不同模型,成本可以压一截,且不会明显影响质量。
第三,规则降级。当用户请求处于高频重复、无歧义的状态时,直接走规则引擎或预设模板返回,完全不需要触发模型。最常见的是“打招呼”“谢谢”“再见”这类寒暄场景,用规则接住,省下来的全是预算。
第四,输出预算控制。给模型设置最大输出token上限,强制要求“回答简洁,控制在X字以内”。很多Agent的输出冗长是默认行为,你不说它就长篇大论。限制输出长度既压了成本,又提高了人类用户的阅读体验。
第五,失败熔断。如果一个Agent在短时间内连续多次无法返回有效结果,不要让它无限重试并持续烧钱。设定失败阈值,触发后直接把流量切换到人工或备用流程,同时告警到开发群。这个能力既是预算控制,也是稳定性保障。
第六,成本审计分账。把每一个Agent实例、每一个业务线、每一种任务类型的token消耗都打上标签,每日汇总成本报表。没有审计,你根本不知道到底是哪个环节在偷偷烧钱。很多团队优化预算无从下手,就是因为没有先把账算清楚。
5. 三根支柱怎么拧成一捆:铁三角落地的完整实战流程
5.1 动工之前:一张启动检查清单
很多人启动Agent项目,第一个动作是选模型、搭框架、写prompt,这三个动作全错。正确的启动动作是先回答五个问题:具体要解决什么任务,验收标准是什么,边界范围是什么,成本上限是多少,出了错谁兜底。这五个问题的答案,就是铁三角三个支柱的底座。
我把这张清单分享给过好几个团队,他们反馈说最有效的一步,是把“验收标准是什么”落到纸面上。很多项目做到一半推翻重来,不是因为模型不够强,而是因为最初没人写过“什么样算通过”。你让开发猜“好”,他猜出来的和你想要的,经常是两个东西。
启动检查清单的完整形态:
- 先写目标业务的用户故事,用“条件–动作–验收标准”的格式
- 从用户故事里抽出第一批评估集case,覆盖正常/边界/异常/攻击性四类
- 确认工具层依赖是否稳定,输入输出契约是否清晰
- 设定每一类任务的模型等级和单会话成本上限
- 明确失败兜底路径:Agent连续失败N次,转人工还是走规则
- 从第一天就接上可观测性:日志、trace、token成本、评估分数
- 确定灰度策略:首批放量给谁,观察什么指标,回滚条件是什么
这七条做完,你才算准备好了开发,而不是拍脑袋开始写提示词。
5.2 开发阶段:以天为单位的小闭环,以周为单位的大闭环
在开发中,我比较推荐的节奏是“每天一个闭环,每周一个节拍”。每天,开发人员至少完成一次“改代码→跑评估集→看对比报告→修订”的循环。运行评估集不需要很长的耗时,几十个case脚本跑完几分钟就够。不要攒好几天才跑一次评估,那样你根本不知道是哪次改动把指标拉下来的。
每周的节拍,是拉上产品和测试,一起过一遍本周的评估报告。重点不是看整体通过率,而是逐条看失败的case:失败是因为评估集需要补充,还是Agent真的存在问题?这两个原因性质完全不同,前者是在打磨度量标准,后者是在修系统Bug。每周花一小时做这件事,看似慢,实际上能避免“开发一个月,最后发现跑偏了”的大返工。
这里我特别想提一个经验:不要怕评估集初期long得不好。第一版评估集永远是不完美的,会漏掉很多重要场景。它的价值不是“衡量绝对水平”,而是“给迭代提供一个固定的标尺”。你后续不断往里面加case,它就越来越像一套真的验收标准。
5.3 上线之后:灰度、监控、复盘,一个都不能少
上线不是终点。Agent项目发布后的48小时,是整个生命周期里最需要盯紧的时候。灰度放量的比例要从低到高,先放给一小部分低风险流量,观察指标稳定后才逐渐扩大。监控层面至少要盯住四个指标:成本趋势、成功率、转人工率、用户负面反馈率。这四者的任何一个异常波动,都要能马上追溯到对应的Agent版本。
上线稳定后,再开一次正式复盘会。复盘会不是“绩效表功会”,而是对照启动检查清单做校准:当时的验收标准如今还成立吗,成本预估偏差大不大,评估集里有没有需要补充的新case,分工中谁成了隐形瓶颈。每次复盘后的产出物是下一迭代版本的行动计划。就这样按周滚动,Agent系统的成熟度才会一点点逼近可用状态。
我把整个铁三角的落地节奏整理成一张表,当你不知道下一步该做什么时,可以先对着表格自查。
| 阶段 | 分工动作 | 方法论动作 | 预算动作 |
|---|---|---|---|
| 启动期 | 明确产品/算法/工程/测试的负责人 | 写用户故事;搭建第一版评估集 | 估算单会话成本上限;设定总预算 |
| 开发期 | Agent内部拆规划/执行/评审角色 | 每日跑评估集,每周复盘失败case | 接入token日志;按任务分层定价 |
| 灰度期 | 安排上看板盯质量的人 | 小流量放量;对比新旧版本指标 | 对比灰度流量成本与预期 |
| 上线稳定期 | 明确运维值班与告警收件人 | 补充边界case;定期跑回归 | 按周汇总成本报告;做异常告警 |
| 持续迭代期 | 重新审视人机边界 | 持续扩充评估集标准 | 优化缓存/路由/降级策略 |
6. 常见问题与排查技巧实录
6.1 我把CoT加进去了,Agent怎么还是答错?
CoT不是万能药。如果在你的场景里,Agent需要依赖外部工具结果才能给出答案,而工具结果本身不可靠,那CoT再长也救不了。排查这个问题,我会先看日志里Agent在做推理时到底用了什么上下文。最常见的情形是:工具返回了一个乱码或半截字段,Agent没有识别出异常,反而顺着这个脏数据继续编故事。修复方案不是“换一种更好的CoT模板”,而是在工具调用和推理模块之间加一道数据校验层,不让异常数据流进模型。
6.2 Agent开始“自由发挥”了,怎么让它收敛?
所谓“自由发挥”,往往是两个原因:系统指令给得太模糊,或者评估集里没有覆盖“该拒绝时拒绝”的场景。不要只教Agent“做什么”,还要教它“不做什么”。举个我踩过的坑:一个自动回复Agent,用户问“你能帮我查询别人的订单吗”,它居然真的去查了。问题不出在“查询”动作本身,而出在缺少一个权限判定节点。修复时我给Agent加了一条硬规则:涉及他人隐私的信息,一律不提供,并复用话术模板。注意,这种规则不是写在系统指令里靠运气生效,而是做成一个独立函数,在生产流程里强制判断。
6.3 token成本突然翻倍,大概率是这五个原因
先不用慌,按顺序排查:是不是上线了新的业务场景导致输入上下文变长;是不是某些工具返回的全文被塞进了模型上下文——这是最隐蔽的浪费点,一个搜索接口返回几千字的内容,真正有用的就一两句,你要做的不是把全文喂给模型,而是先做切片/摘要;是不是用户会话平均轮次在增加;是不是没有缓存命中;是不是重试逻辑写得过于激进,模型答错一次就整段重跑。我在项目里最喜欢干的一件事是:把token消耗最高的前10个会话拉出来,逐条看它们的token构成,问题基本一眼就能看出来。
6.4 明明跑通了,换一个数据集就崩了?
这几乎可以断定,你的系统在过拟合评估集。我也犯过这种错误:为了把线上case的通过率刷上去,拼命加提示词补丁,结果把Agent“教”成了专门回答那几个案例的复读机。换一批数据就不会了。解法是:评估集要定期更换和扩充,至少留出20%的“新题比例”来自你最新收集的真实业务数据;同时警惕过高的单一评估集准确率——差不多得了,别追求100%,因为100%通常意味着你做了一个只能回答考试题的系统。
6.5 某开发者的经验:三次失败后才把铁三角凑齐
这里分享一个我聊过的一位做客服系统的开发者的经历。他第一次做Agent项目时,只有一个信念——让模型“更聪明”,结果prompt改了几十版,线上一试全完蛋。第二次,他学会了搭评估集,但没做成本控制,一个月花了远超预期的token费用,项目被砍。第三次,他意识到是整个团队缺少分工——产品、开发、测试没有一套共同语言,大家各自为战。直到第四次,他把分工、方法论、预算三个维度一起做起来,项目才终于从“演示好看”走向“业务能用”。这个剧本其实挺典型的,值得每个入坑Agent的人提前读一遍。
7. 写在最后的一点实在话
如果只挑一个最核心的经验送给刚开始做Agent的你,我的建议是:先不要急着追求“更强的模型”和“更炫的Agent形态”,先把三个最朴素的问题回答清楚——这件事由谁负责决策,这个改动怎么验证它真的更好了,这一次对话到底花了多少钱。这三句话对应的,就是分工、方法论、预算。
我也踩过很长时间的泥坑,每次系统表现不稳定,第一反应都是“再调调prompt”,后来才发现根子在于没有把人和系统的边界画清楚;每次效果不对,第一反应都是“再换个模型”,后来意识到是缺少一套能自动跑的回归评估;每次成本超支,第一反应都是“砍掉一些高级模型的调用”,后来理解了预算优化应当是架构设计的一部分,而不是事后紧急补救。
这几年的大模型技术迭代速度很快,每年都有新框架、新协议、新的Agent形态冒出来。但这三根支柱不会过时,因为它们本质上不是技术方案,而是工程化落地的基本纪律。你先把这三个问题做实了,再去追新东西不迟。