1. Demo跑得通,不代表能上线:先承认评估是短板
先聊个扎心的现象。我见过太多Agent项目组,花了六周时间把效果调到“录demo视频完全没问题”,开完汇报会之后,下一周就会被自己人在生产环境里问得哑口无言。不是代码出Bug了,而是你根本说不清这个Agent现在到底处于什么水平——是80分还是40分,你自己都没底。
我最早做Agent开发时也有这个错觉。demo里你精心设计了几条对话路径,工具调用也顺滑,回答质量看着也高。但真正的用户不会按照你预设的路径走,他们的输入可能是错别字、口语化省略、甚至一句话里带三个指代。更关键的是:生产环境里的Agent不是跑一次就完了,它会连续跑几百上千次,状态是累积的,错误是会传染的。等到你发现自己根本hold不住未来走向时,已经晚了。
这个行业的普遍现状是:团队都在“做功能”,很少有人在做“度量”。为什么?因为写一个工具调用脚本很爽,搭一个能跑起来回答问题的Agent也很有成就感,但要给Agent建立一个可靠的评估体系,意味着你要回答一堆麻烦问题:什么样的回答算“好”?工具调用不正确但结果碰对了算不算对?用户改口重说时Agent能不能接住?
这一篇我想认真梳理一下,Agent从Demo走向生产这段“最后一公里”里,评估体系到底应该怎么搭。不是泛泛谈“要有评估”,而是给出我在真实项目中用过的分层结构、指标口径、数据收集方式和一整套可落地的做法。把这个补齐,你才算真正把Agent交到了用户手里,而不是交到运气手里。
2. 为何Demo里惊艳四座,生产环境却处处翻车
2.1 Demo环境里的“可控”本质上是精心排除变量
做Demo时你本质上是在做“选样”。你会挑最有代表性的问题路径走一遍,过程中如果Agent反应不对,你会重新触发、稍微改写提示词重新生成,直到录出完美的效果。这个过程没什么问题,问题在于你把“精心挑选的几组乐观路径”当成了系统的真实能力。
打个比方:这就像驾校里的学员在固定场地考科目二,每个项目的点位都是死的,方向盘打几圈都背下来了。你考一百分是因为场地里没有加塞的行人、没有突然变道的电动车、没有乱穿马路的狗。到了真实道路驾驶,你面对的是无限种交互,驾校那套死记硬背根本不顶用。
Agent在Demo里也是这么“考驾照”的。工具调用链路顺不顺、上下文记忆稳不稳、模型对指令的理解准不准——这些问题在没有真实流量压力、没有长对话累积、没有并发请求的时候,根本暴露不出来。
2.2 生产环境的三类失控:状态漂移、工具抖动、成本失守
我归纳了一下,Agent在生产环境翻车的形态基本是三类:
第一类是状态漂移。长对话里Agent会逐渐“忘掉”最初的需求,或者把之前回答里已经纠正过的错误信息再当事实引用回来。你在Demo里跑三四个来回看不出问题,但用户在真实场景里可能开一个窗口聊二十分钟,中间还穿插着上下文截断和重新加载,这时候记忆一致性就崩了。
第二类是工具调用的抖动。Demo里工具总是按预期返回正确的数据。生产环境里工具会超时、限流、报错、字段为空。Agent面对这些异常时的应对能力——是优雅回退还是直接报错中止——这才是真正考验鲁棒性的地方。我一度以为只要给Agent提示词里写上“遇到错误时请重试”,它就能处理,事实上当它连续三次重试同一把坏工具时,体验极差,用户只会认为产品是残次品。
第三类是成本失守。Demo你只跑几十轮对话,token消耗根本不明显。生产环境一开,每日调用量上千次,如果Agent的规划缺乏收敛机制,它可能为了回答一个简单问题绕了七八轮工具调用,成本直接翻十几倍。有个很直观的规律:Agent在看不到成本约束时,特别容易被一个模糊指令带偏成连环工具调用。这在评估里如果不考虑,上线第一周账单就会教做人。
2.3 团队为什么习惯性绕过评估
每当我跟团队聊评估,第一反应都是“先把功能做完再说”。我也理解,Agent功能迭代太快了,模型老版本还在调,新版本就出来了;你花两周搭好的评估用例集,换一个模型整个分布就变了,谁还愿意维护?
但恰恰是因为迭代太快,评估才必须前置。不做评估,后果就是每次模型升级或提示词调整,你都只能靠“感觉”判断有没有变好,等于把一个高技术含量的工程问题退化成了玄学。做了评估,哪怕它很粗糙,也能给你一个基础参照系,让你知道这次改动到底偏向哪个方向。
3. 评估体系的分层设计:从“单步正确性”到“整体任务成功”
3.1 单元评测:只测Agent的局部能力
Agent评估体系里我习惯先做单元评测,它解决的是“零件好不好用”的问题。具体来说,就是把Agent的某一项能力剥离开来单独验证。
比如工具调用能力,我会准备一批指令,每个指令对应一个工具调用期望,比如“查一下上海的天气”期望调用weather.get(city="上海")。这时不关心回答是否优雅,只关心工具名、参数对不对。
再比如指代消解能力,我会给Agent一段前文对话,然后一个包含指代的新指令,看它能否正确关联。例:
- 前文:“帮我订一间后天晚上的双人房。”
- 当前:“离地铁站近一点的那家。”
这里的评估点是它能不能从上下文中理解“那家”指的是哪一家。
单元评测的价值是快速定位问题模块。如果你的Agent整体效果差,却不知道差在哪一环,那就无从下手优化。单元评测就是打断Agent的连招,看每一招的准头。
一个容易犯的错误是把单元评测做成“纯文本匹配”——直接对比模型输出和期望字符串。这不靠谱,因为Agent回答一个任务可以有多种合理路径。比如“查天气”既可能调用工具再回答,也可能模型直接凭训练知识回答(虽然不推荐)。合理的单元评测要看“关键行为是否完成”,而不是逐字比对。
3.2 流程评测:验证多步交互中的链路一致性和工具编排
单步能力过了,就该处理流程评测。这一步的目的是验证Agent在处理一个完整任务时,多步交互之间是否保持一致、编排是否合理。
典型场景是订机票。一个完整的订票流程涉及查航班、选座位、填乘客信息、提交订单等多个环节。流程评测里,我关心的是:
- 每一步之间的信息是否正确传递(比如选了航班后,下单时用的还是同一个航班吗?)
- 用户中途变更需求时,Agent能否正确更新状态(比如用户从“经济舱”改到“商务舱”,后续查询是否基于新选择)
- 失败重试时是否会造成重复操作(比如支付超时重试,会不会同一订单扣两次款)
流程评测的数据组织方式是场景脚本,也就是把一个完整任务拆成若干步骤,每步骤设定目标,最后看整条链路的完成率和正确率。这种评测成本比单元评测高,但它解决的问题也更贴近生产。
实操上我建议先用离线脚本模拟,跑通后再把部分线上日志里沉淀的真实用户流程抽回进来做回归。只有把这两种场景都覆盖到,才算对流程稳定性有基本信心。
3.3 体验评测:用户不关心对错,只关心体验
最后这一层是最容易忽略的——体验评测。说实话,“正确性”和“好坏”之间的差距,在Agent领域比在其他软件领域大得多。
用户问“明天北京会不会下雨”,Agent调完天气工具后直接冷冰冰输出“多云,降水概率10%”,技术上完全正确,用户也获得了信息。但如果你在回答前边加一句“明天下雨概率不大,出门不用带伞”,体验就好很多。前者是数据,后者是服务。
体验评测不适合用规则来判断,更靠谱的方式有两类:一类是让模型扮演“用户视角的评审员”,对Agent的回答在“是否解决问题”“是否礼貌自然”“是否有效率”等子维度打分;另一类是内部人工抽检,建一个抽样池,定期人工评分。
这道工序的认知门槛在于,多数团队把Agent当成“接口服务”,但它本质上是一个“对话产品”。接口服务正确就是正确,对话产品除了正确还得得体。体验评测就是不断提醒开发团队这条认知线。
4. 黄金数据集:把评测从“感觉”变成“可回归”
4.1 从线上日志和专家构造中持续沉淀
所有评测体系的基础,是数据集。这个数据集我称之为“黄金数据集”,因为它是用来衡量Agent改版效果的关键参考系。没有它,所有讨论都是空中楼阁。
黄金数据集的来源有三个渠道:
第一是线上真实日志。这是最宝贵的来源。用户真实怎么提问、怎么追补信息、怎么表达含糊意图,都完整记录在线上日志里。我建议团队里安排一个固定流程,定期从线上日志里捞取案例,尤其是那些“用户反复追问”或“用户最终放弃”的会话,这些体验差的案例比顺滑案例更有学习价值。
第二是专家构造。让业务专家根据你的业务场景,手写一批“典型任务”和“边界任务”。典型任务覆盖主要业务流,边界任务覆盖极端情况,比如超长输入、冲突指令、无法回答的问题等。
第三是故障沉淀。生产环境每次出问题,都应当养成复盘后把案例“流入”黄金数据集的工作习惯。这能确保同一个坑不会被反复踩进场。
4.2 标注标准与答案质量的松紧把控
数据集有了,标注标准是下一个关键决策。我发现一个常见的争议是“答案的多样性”。同一个用户问题,“可以接受的答案”可能有多种说法。标注太死,会把模型束缚死;标注太松,又起不到区分好坏的作用。
我常用的做法是分两级标注:
- 硬性要求(不可妥协):信息必须准确、不能胡编乱造、工具参数的对应必须正确。任何一条不满足,整个答案判失败。
- 软性要求(分档打分):表达是否清晰、是否解决了用户的核心诉求、是否有多余误导。软性要求用1到5分制区分。
这种做法保证了“对错”有明确底线,“好坏”有层次差异。评估Agent改版时,先看硬性要求通过率有没有下降,再看软性评分有没有提升,两套数据互相参照,定位问题会非常高效。
4.3 数据集的版本管理:要像管代码一样管评估数据
黄金数据集不是一成不变的,它需要持续演化和维护。不管理版本,时间一长它会腐化:案例过时了、标注不一致了、新增业务场景没覆盖了。
我的建议是给数据集也建立版本号,每一次改动都记录变更说明。把数据集和Agent版本绑定起来:Agent v1.2配Dataset v3.1,这样的话,当出现“v1.3比v1.2效果好”的争论时,可以明确是在同一套数据集上比出来的,还是数据集也变了。混着比较,结论必然失真。
另外一个实用经验:数据集要保留“随机打乱”后的运行脚本,确保每次评估的用例顺序一致。因为大模型对上下文和顺序是有一定敏感的,顺序不同可能导致结果偏差,数据集的稳定性是评估稳定性的前提。
5. 指标怎么定:一遍讲清准确率之外的五个关键维度
5.1 任务完成率:评估体系的“主心骨”
任务完成率是整个评估体系里最有说服力的单指标。它的定义很简单:在一个评测任务中,Agent是否完整实现了用户目标。
但定义简单不等于落地简单。难处在“完成”的判定标准上。比如用户问“帮我对比三款手机的性能差异”,Agent只回答了两款,算完成吗?严格来说不算。Agent回答了三款但其中一款数据是编造的,算完成吗?必须不算。
实践中最稳妥的做法是把任务完成率拆成一层层约束:上下文理解是否正确、工具调用是否成功、最终信息是否充分、是否遵循限制条件(比如不能问隐私)。一个任务只有所有约束都满足才算完成,任何一环失守都不算。这很苛刻,但换来的是当你看到“任务完成率85%”时,你心里有明确的底。
5.2 工具调用准确率、Token消耗、延迟、回退率:四种辅助性度量
任务完成率看的是“终点对不对”,但它不解释“过程好不好”。同样完成了任务,有的Agent只调了2次工具,有的Agent绕了8次;前者1秒返回,后者10秒才返回。从用户体验来说,这就是天壤之别。
所以配套指标我建议至少再盯四个:
- 工具调用准确率:Agent发出的工具调用中,参数完全正确的占比。这个指标对依赖外部服务的Agent尤为重要,因为参数错了不只是回答错误,还可能造成生产事故。
- Token消耗:每个完整任务消耗的平均token数。这不只是成本问题,还是“效率”的侧面指标。token消耗高,往往意味着Agent做了太多无关探索或循环调用。我发现给Agent设置一个“先规划再执行”的思维链能明显减少这部分的浪费。
- 延迟:从用户输入到首次反馈和最终完成的时长。如果一个Agent内部规划过长,用户早就等跑掉了。
- 回退率:Agent主动承认自己无法回答并转向人工或返回兜底话术的比例。回退率不是越低越好,有时候该回退却不回退、硬编答案,反而更糟。理想的回退率要和“回答准确性”放在一起看:准确率低、回退率也低,说明它在硬撑;准确率高、回退率略高,说明它知道自己的能力边界。
5.3 怎么把“用户满意”变成可计算的指标
团队内部对“用户满意”的理解往往很抽象。产品经理说“回复要更贴心”,算法工程师说“准确率要提升”,两边都对不上话。要想让评估体系真正发挥作用,必须把感性的“满意”转译成可计算的代理指标。
我常用的转译框架是这样:
| 用户情绪 | 可计算的代理指标 |
|---|---|
| 用户觉得回答有用 | 用户是否发起了后续追问(后续追问率高=可能没解决) |
| 用户觉得流程顺畅 | 单次任务平均工具调用轮数(轮数过高=流程太绕) |
| 用户觉得没有白等 | 首次响应时间和总任务时间 |
| 用户不想再用下去了 | 会话中断率(用户主动关闭或放弃继续输入) |
需要强调的是,这些代理指标不能直接等于用户满意,但它们提供了可比口径。选择代理指标的原则是:可以利用现有埋点数据立刻计算,同时和用户真实满意度有强相关性。先有可计算的口径,再谈优化,这是工程思维的底线。
6. 自动化评估落地:把评估挂进CI,上线后也盯着
6.1 离线回归:每次改动都要过一遍评估集
评估体系搭建起来以后,最重要的用途就是做离线回归。我强烈建议把评估挂进CI流程:任何Agent相关的代码变更(提示词调整、工具定义修改、模型切换、RAG配置变更),都必须先跑一遍黄金数据集上的评估,通过才能合入。
这背后的工程逻辑和传统软件的单元测试完全一样:防止回归。Agent开发很容易出现“这次改动解决了A问题,但搞挂了B场景”的情况。没有夜间回归机制,这类问题往往要等上线后被用户发现了才知道,那就已经造成损失了。
离线回归的频率上,我建议至少每天夜间全量跑一次黄金数据集,涉及核心路径的变更实时跑快速集。全量评估如果时间长,还可以做并行加速。
6.2 线上监控:生产环境里接住未知问题
离线回归覆盖的是“已知问题”,生产环境里一定会冒出你没想过的问题。所以线上监控是评估体系在真实场景中的“扩展形态”。
线上评估和离线评估的思路不同。离线是拿已有的标注数据检测模型能力,线上更关注“哪些情况异常了”。我觉得比较有效的做法是设置几个自动化触发的线上陷阱:
- 对高风险请求(比如涉及支付、删除、权限变更的操作)做额外的合规审查;
- 对用户负向反馈的内容实时打标分析;
- 对工具调用连续失败两次以上的会话,自动记录链路调用数据。
这些监控数据不只用来告警,更重要的任务是回流到黄金数据集。线上发现的新问题案例,经过标注后成为离线回归的新增用例,这样就形成了一个“线上发现问题 → 数据沉淀 → 离线回归 → 修复验证”的闭环体系。
6.3 评估结果的可信度:校准和抽检必不可少
自动评估跑出来的分数,不能全信。大模型评审自己的同行,本质上是有偏误的,尤其容易受回答长度、格式影响——长得像好答案的往往会拿到偏高的分。
我第一次跑自动评估时,就发现一个大模型评审员对长回答的偏好:凡是带结构化列表的回答,它给的分普遍比同样质量的自然段回答高。这其实和模型训练方式有关系,不代表真实用户偏好。
两个工具解决这个问题:
第一是校准。拿自动评估的成绩和人工评估的成绩做对照,计算二者差异。如果某个子项长期严重偏差,就要调整该子项的评估方式或提示词。自动和人工的差距应该是一个逐步缩小的过程,而不是一条平稳的平行线。
第二是抽检。定期抽样跑人工评分,用人工评分结果校准自动评估结果的可信区间。抽检比例不用高,5%左右即可,但如果抽检显示偏差大,就要扩大比例排查原因。
7. 评估体系上线后的真实踩坑记录
7.1 案例一:评估集泄漏导致“训练”进评测集
这个坑我印象特别深。团队在做RAG优化,基线评估一直正常,改了一版检索逻辑后评估分数暴涨,大家欢呼雀跃。但进一步分析发现,新的检索逻辑有一个bug:当用户问题和黄金数据集里某个问题非常相似时,它会直接从内部缓存返回一个“记忆中的答案”——这个缓存来自之前的评测过程信息。
部分答案不是基于当前检索产生的,这就等于把过往评估中的正确结果泄漏进了系统,自动评测分数自然虚高。上线之后换个新问题域,分数立刻打回原形。
解决方式:评估用的黄金数据集,在Agent运行时必须隔离,不能在提示词或检索库里留任何数据集本身的影子。同时每次评估结果出现“离群式暴涨”时,不要先开心,先怀疑有没有数据泄漏。
7.2 案例二:评估器偏见导致“废话模板”盛行
还有一次我们发现自动评估分数在持续爬升,但用户反馈并没有变好。排查后发现,评估员模型对“结构化分点+礼貌用语+补充建议”这类格式有强烈偏好。Agent的提示词里被悄悄加了一些“请分点回答,并适当给出建议”的编码,结果回答确实变规范了,但内容深度并没有变化。
这件事让我坚定了抽检机制必须存在的原因。自动评估分数是决策辅助,不能当唯一真理。后来我们把“格式要求”从评估维度里剥离,改为只评估“信息是否准确、是否充分”,分数才重新变得有参考意义。
7.3 案例三:指标打架怎么办
实际项目里,指标之间经常互相冲突。最常见的是“Token消耗降了,但任务完成率也降了”。看起来是效率提升了,其实可能是Agent遇到难题时干脆不深入处理就随便给个答案,草草结束,这自然省token,但完成率崩了。
这种冲突怎么处理?我的经验是给指标排优先级。任务完成率永远是第一优先级,Token消耗、延迟等效率指标是第二优先级,不可以为了省成本牺牲完成率。优化时以“完成率不降”为前提去优化成本,而不是反过来。
但如果完成了任务却付出了过高成本,也要看短期和长期的平衡。这时候我会看看行业参考基线,判断当前成本是合理偏高的量级,还是存在严重浪费。评估体系的价值不是偏袒某个指标,而是把指标间的矛盾暴露出来,让大家基于事实做决策。
8. 团队协作和演进路线上的几个经验
8.1 评估从一开始就要做,而不是上线前做
我最想强调的实战建议是,评估体系一定是和功能同步生长的,不是等到最后再搭。哪怕第一个版本只有五十条数据集、两三个指标,它也能让你的每次改动都有的放矢。等Agent复杂到一定程度再倒回来建评估,成本会高到让人放弃,这才是很多项目评估缺失的根本原因。
8.2 评估的结果谁来负责解读
很多团队有个误区:评估报告生成了,但没人认真解读。技术负责人扫一眼指标就过了,写报告的同学也不知道这些数字下一步该驱动什么动作。我现在比较坚持的做法是,每次评估结果出来后,必须开一次短会,推进以下问题的讨论:
- 哪个维度的指标出现了显著变化?
- 变化对应的具体场景和调试用例是什么?
- 如果需要修复,是谁在什么周期内跟进?
评估结果如果只停留在“知道了”的层面,它就只是成本;只有当它驱动了下一步的优化动作,它才是投资。
8.3 后续的演进方向:从评估到持续学习闭环
最后说一下这个体系的演进方向。评估和监控做到位之后,自然延伸就是“持续学习”。结合线上日志里高频出错的case,沉淀到数据集中再做针对性微调或few-shot增强,然后回到评估体系验证,这其实是Agent能够稳定进化的正循环。
当然,这个方向也不是没有挑战。它对数据回流链路、标注效率、模型迭代周期的要求都很高。即便做不到完全自动化,固化好从线上问题到数据标注再到版本验证的主链路,也已经能带来很大的确定性提升。
Agent赛道近两年火得很快,但真正让一个产品活得久的核心,是把它从“demo惊艳”变成“生产可靠”,而评估体系恰恰是中间那条必经之路。从我现在经手的项目来看,谁先把这条路走扎实,谁才不会被快速变化的模型版本和技术热点甩在后面。