做 Agent 应用最让人头疼的从来不是“它不会做”,而是“它看起来会做”。我身边一位同学维护的客服 Agent 项目,上周验收还跑得好好的,这周同一句测试话术丢进去,系统先是把某产品价格说错半截,接着顺着这个错误把售后政策也一并“编排”完整了,问答链路当场连锁崩盘。乱编、连锁、失忆,这三个词基本能概括我和同行们做 Agent 落地时遇到的绝大部分问题。
这篇文章不讨论 Agent 的基础概念,也不做云里雾里的原理分析,目标很直接:把这三个症状量化成一套可复用的五维体检框架。你会看到为什么 Agent 会自信地胡说八道、为什么一个小错会滚成系统性雪球、为什么长对话里规矩说丢就丢,以及我实际用来诊断这些问题的完整流程和工具思路。如果你正在做 Agent 开发、多轮对话调优、或者负责 Agent 产品验收,这套体检方法论可以帮你少走很多弯路。
1. 先看懂三个症状:乱编、连锁、失忆背后的行为机制
1.1 乱编不只是“说错”,而是“自信地说错”
大语言模型在应答时的行为逻辑,决定了乱编这件事几乎无法通过“加大训练”彻底消灭。它的优化目标从来不是“先验证事实再生成回复”,而是“生成一段语义最通顺、最像人会说的话”。一旦输入的信息不在它的训练覆盖范围内,或者用户的问题本身包含了一个并不存在的假设,模型最自然的行为就是用一段流利的文本把空白填上——这就是乱编。
我在实际项目里观察下来,乱编高发点非常集中:冷门版本号、特定金额、精确时间区间、细粒度因果关系、还有那些听起来像那么回事、实际上不存在的名词。最常见的场景是用户问“你们产品是不是支持某某协议”,如果这个协议并不存在,但名字起得像模像样,模型极大概率会顺着字面意思把“支持它的方式”编出来。更麻烦的是追问场景,模型为了维持前后一致性,会在已经错误的方向上继续补细节,完成二次圆谎。
所以在体检里,我从来不用“模型知不知道正确答案”作为判定标准,而是看模型在不确定时如何表现:是给出前提条件明确的推断,还是直接生成一段听不出瑕疵的“事实”。后者才是需要警惕的乱编信号。
1.2 连锁:错误在 Agent 链条里的自我加固
Agent 和普通单轮问答的一个重要区别在于:它会执行多步动作。一次典型任务链路是解析用户需求、规划下一步动作、调用工具、解析工具返回、更新当前状态、再进行下一步。每一步都会把前一步的输出当成输入。只要其中一步的先验是错误的,后面的工具调用就会基于错误前提去查、去算、去生成,并在下一步把错误结果当成“已验证事实”继续传递。
这就像一条生产线,第一道工序的尺寸偏差没有被发现,后面的切割、组装、质检全都在这个错误基础上运行,最后出来的成品当然不可能对。更危险的是,工具返回的数据自带“可信感”。用户看到 Agent 说“根据系统数据核对,已经确认”,就会默认结论可靠,而不知道它在第一步就把比对口径搞错了。
我拆过一个典型案例:一个数据分析 Agent 做月度业务归因时,第一步把“比上年同期”错误理解为“比上一个统计周期”,导致后续所有环比、贡献度计算全部偏差。但它在每一步都向用户展示“数据已核对”,整条链路看起来无比专业。这种错误在只看最终结论的验收方式下几乎不可能暴露,必须单独追踪中间环节。
1.3 失忆:上下文里的“橡皮擦效应”
失忆的本质有两个层面。第一是物理层面:上下文窗口有上限,当对话轮次足够多,系统提示和早期对话会被新内容挤出有效注意力范围。第二是权重层面:模型在长对话中对早期约束的记忆权重是持续衰减的,用户在开头提的“请始终用简体中文回复”“输出不超过三行”等要求,越往后越容易被忽略。跨会话场景就更直接了,如果应用层没有做记忆持久化,那么上一轮对话结束时所有状态直接清零。
我见过最典型的失忆场景是用户一周前让 Agent 记住了自己的偏好设置,一周后再问“你记得我跟你说的规则吗”,Agent 会根据上下文残留的蛛丝马迹强行拼一个答案出来。有时它能拼对,有时拼错,这种不确定性对企业应用来说非常危险。在做体检时,我会把失忆拆成三个层级分别测:短对话内的一致性、中长对话里的约束保持、跨会话的事实召回。
2. 五维体检设计:先量化,再谈修复
2.1 五个维度从哪来,权重为什么这样定
我设计这套体检框架时反复取舍过很多版,最终沉淀为五个维度:事实一致度、链式稳定性、记忆持久度、工具对齐度、指令遵循度。很多人问为什么不是先测准确性或者安全合规,我的回答是:对于 Agent 这类“多步执行系统”,单点准确率说明不了整体健康度。乱编对应事实一致度,连锁对应链式稳定性,失忆对应记忆持久度,而工具对齐度和指令遵循度是 Agent 特有的两个高频出问题点,必须单独拉出来量化。
权重分配我也有一版比较稳妥的建议:事实一致度占 30%,链式稳定性占 20%,工具对齐度占 20%,指令遵循度占 15%,记忆持久度占 15%。事实一致性权重最高,因为它是信任底线,一项 AI 应用哪怕任务完成得再好,一旦用户发现它编造信息,所有能力都会被重新审视。链式稳定性与工具对齐度直接决定任务完成率,属于硬能力。指令遵循度是底座,系统提示里的约束守不住,其他维度再高都会在真实场景里翻车。记忆持久度影响面相对可控,修复手段也明确,所以权重垫底。
| 体检维度 | 对应症状 | 权重 | 核心关注问题 |
|---|---|---|---|
| 事实一致度 | 乱编 | 30% | 回答是否与可信来源一致,是否敢承认不知道 |
| 链式稳定性 | 连锁 | 20% | 多步执行中错误能否被识别、拦截、纠正 |
| 记忆持久度 | 失忆 | 15% | 约束、偏好、上下文在长交互中的保持情况 |
| 工具对齐度 | Agent 特有 | 20% | 工具选择、参数填充、返回结果利用是否合理 |
| 指令遵循度 | Agent 特有 | 15% | 对系统提示中格式、边界、行为约束的遵守情况 |
2.2 健康分怎么算:从单维度分到综合报告
每个维度我采用 0-100 分制。事实一致度可以简化为“可信语句比例”,即回复中可以被外部可靠信息源验证或与给定文档一致的句子占比。链式稳定性用“链路完成度”来衡量:在预埋了可控错误的测试链路里,系统能识别、纠正并完成最终目标的比例。记忆持久度用“引用召回率”,看模型中后段对早期约束和用户偏好事实的准确引用比例。
工具对齐度我会从三个子项加权:工具选择正确率、入参完整率、返回结果利用率。指令遵循度用格式符合率和禁语命中率综合计算。综合健康分的数学表达式是各维度分乘以权重再加总,这个总分作为横向对比指标,但我在看报告时从来不看总分——先找最低分维度,再决定干预优先级。总分只是给团队管理层看的,最低分才是给技术团队看的。
2.3 体检频率:救火队员和保健医生的区别
体检做成一次性行动意义不大。我建议三种节奏:开发期每周一次快速体检,用自动脚本跑十到二十条核心用例,确保每次提示词改动都没有引入新退化;上线前做一次全量五维体检,覆盖所有测试集;上线后每周随机抽二十五三十条真实会话做五维盲测,对比健康分波动。
经验之谈是,只在发版前做一次体检远远不够。模型在提示词微调、上下文结构变化后的行为变动幅度,比大多数人想象中大得多。上周分数健康不代表这周同样健康,把体检变成固定机制,才能从“救火队员”切换成“保健医生”。
3. 搭一个能复用的体检台:测试集、执行框架、判定标准
3.1 测试集构造:按维度往对话里埋“陷阱”
体检台的地基是测试集。构造测试集的原则不是“找难题”,而是“精准命中高风险行为”。
| 维度 | 典型陷阱 | 示例 | 主要观测点 |
|---|---|---|---|
| 事实一致度 | 冷门事实、虚构名词、诱导开放题 | 让 Agent 解释一个不存在的协议 | 是承认不知道,还是当场编一段自洽说法 |
| 链式稳定性 | 前置小错误 | 多步任务的第一步注入可控偏差 | 后续是否识别、纠正,还是会放大偏差 |
| 记忆持久度 | 长上下文约束 | 开头声明限制,二十轮后再询问 | 约束是否仍然生效,早期事实能否准确召回 |
| 工具对齐度 | 模糊查询 | 给一个缺少关键参数的请求 | 主动追问补参,还是猜一个参数直接调用 |
| 指令遵循度 | 禁词与格式 | 明确要求“输出三行以内” | 是否遵守格式,是否触发禁用词 |
以事实一致度的“虚构名词”类题目为例,我会把一个不存在的技术名词包装成“某厂商最近发布的协议”,让 Agent 解释它是干什么用的。健康模型会指出信息无法确认,或者基于命名推测并明确标注“这是推测”;病态模型则会像介绍老朋友一样把这个不存在的东西的细节一一铺开。链式稳定性测试则要设计多环依赖任务,比如“先提取数据、再校正口径、最后输出结论”,并在第一步的参数里预埋一个肉眼不易察觉的偏差,看系统能不能在中间环节兜住。
3.2 执行与采集:不只记录回复,更要记录轨迹
体检执行阶段,我要求所有测试都必须保留完整轨迹,而不只是最终回答。每条测试case记录的字段包括:问题ID、输入文本、系统提示词版本、模型参数、会话轮次、模型原始输出、解析后动作、工具名称、工具入参、工具返回结果、最终输出、人工标注备注。
这些字段的价值在你排查病例时会完整体现。回想前面那个数据分析 Agent 的案例,如果只记录最终回答,你看到的是一个原谅本身通顺的结论,完全不知道该从哪个环节切入。但如果你保留了每一步工具入参与返回,很快就能发现第一步的参数就错了,后续全部建立在错误地基上。轨迹数据就是 Agent 的“监控录像”,没有它,体检就只能停留在结果评分层面,无法定位问题根源。
跑测执行我通常用脚本批量回放测试集,模拟多轮对话需要自己维护一个会话状态管理器,按真实的用户交互时序逐步发送输入。会话轮次是重要变量,因为失忆类问题往往要等到上下文累积到一定量级才会暴露。
3.3 判定策略:自动规则抓“铁证”,人工抽检抓“合理怀疑”
判定环节,我采用自动规则与人工抽检并行。
自动规则适合处理有客观标准的维度,比如:指令遵循度里的禁词检测和格式解析成功率,工具对齐度里的入参完整率和非法调用拦截率,事实一致度里能否在给定文档里找到对应依据。这类问题特征是“对就是对,错就是错”,机器判定的准确率已经足够高。
人工抽检则负责语义层面的判断,特别是隐蔽编造和工具调用的必要性这类问题。自动规则很难判断“这句话是不是在装懂”,只有人看才知道模型是在合理推测还是无理编造。我的建议是抽检比例不低于 30%,并且优先抽检事实一致度低和综合问卷有疑虑的case。自动规则负责抓“铁证”,人工抽检负责抓“合理怀疑”,这样既能控制人力成本,又能保证体检结果可信。
4. 从体检报告逆推到病灶位置:三个实际拆解
4.1 客服 Agent:事实分低,问题不一定在模型本身
某个客服 Agent 项目在第五轮体检时拿到的数据很有意思:事实一致度只有 62,工具对齐度 45,但模型本身的单轮问答能力在横向对比里并不差。更矛盾的是,它的工具调用量非常活跃,看起来“很勤奋”,用户满意度却在下降。
翻日志才发现病灶不在模型,而在系统提示词。那份提示词为了强调客服准确性,反反复复塞了大量“遇到不确定必须先查工具”“所有答案必须经过工具确认”之类的约束,导致模型把大量本可以直接回答的问题全部转化为工具调用。工具调用一多,新的噪声就进来了:返回结果格式不统一、部分字段缺失、超时重试,模型又被这些噪声带着走向另一个偏差方向。
修复方案分三步:一是把系统提示词里冗余的“必须调工具”类约束砍掉,改成基于置信度的策略;二是为工具调用设置触发条件,比如“仅当本地知识库无覆盖且置信度低于阈值时才触发”;三是新增“不知道”兜底话术,允许 Agent 直接承认没有足够信息。复检后事实一致度提升到 87,工具对齐度上升到 78,兜底话术的使用率反而成了健康信号。
4.2 数据分析 Agent:整个结论被第一步带偏
另一个典型案例是数据分析 Agent,这个项目的症状是“重事故”——最终结论错误,但过程看起来完全正常。体检报告显示链式稳定性只有 55,其他维度都接近健康。追踪轨迹数据时,我看到了那条完整的错误传播路径:任务第一步需要按系统内某个字段名读取数据,但模型在解析时用了错误的同义字段,导致取回的数据是前一个周期的;第二步它基于这份过期数据计算环比;第三步又把自己的错误结果作为“已验证基线”用于归因排序。
从最终输出看,报告结构完整、结论有数据支撑、甚至还有“经与历史数据核对”这样的表述。但从第一步起,整条链路就在错误基础上运行。这个 case 告诉我,只看头部和尾部、不看中间的验收方式,在 Agent 项目里完全是赌运气。
修复手段我用了三层保险。第一,中间结果强制结构化,每一步数据处理都输出统一格式的 JSON,里面显式标明数据源和时间戳,让错误在结构上无处遁形。第二,关键节点加前置断言,比如在计算环比前检查“当前周期字段与前值周期字段是否来自同一套口径”,不满足就直接中断并报告。第三,工具返回的数据在进入下一环之前要做格式校验,杜绝“字段为空但继续计算”的路线。复检后链式稳定性从 55 升到 88,后续两周的抽检里没有再现同类问题。
4.3 工具调用量高不一定是健康信号
这个洞察是体检做得越久越有体会的。很多人看到 Agent 频繁调用工具就觉得“系统很勤奋”,但在体检数据里,过高的工具调用量往往是病态信号。
我总结过三种典型的病态模式。第一种是重复回源,同一个查询在上下文已经有了答案的情况下,模型出于“不信任”反复去工具里查,既浪费资源又增加噪声。第二种是试探式调用,模型对用户意图拿不准,于是把多种解释对应的工具全都调用一遍,再用返回结果反推用户想干什么,这是把判断成本转移给了工具层。第三种是参数猜测,入参缺失时模型不主动追问,而是猜一个最可能的值传进去,工具返回的结果自然带上了随机性。
所以我在工具对齐度这一维里特别强调“调用必要性”:该调的时候调、不该调的时候不调,比“调得多”重要得多。体检台在采集层记录工具调用轨迹的意义之一,就是能够统计每一次调用的必要性,把这种病态模式从日志里挖出来。
5. 从一次体检到长期健康管理:回归基线必须建起来
5.1 每次修复都必须复检,否则就是盲修
Agent 修复有个很让人头疼的特征:修复一个问题,常常连带改变另一处行为。改了一版提示词,可能链式稳定性上去了,事实一致度却降了;调整了工具触发策略,工具对齐度好了,指令遵循度又冒出新问题。这是因为所有维度都共享同一个模型状态,牵一发而动全身。
因此我给团队立了一条规矩:任何修复上线前,必须用同一套体检台完整跑一遍五维体检,对照修复前后的六个分数(五个维度加综合分)。如果目标维度提升了,但其他维度出现明显下降,就说明修复带有副作用,要重新评估方案。这听起来麻烦,但相比之下,上线后在用户侧崩掉再排查,成本高得多。
5.2 把失败 case 沉淀成回归基准集
体检最大的资产不是那张报告,而是体检过程中暴露问题的那些 case。每轮体检里失败的测试项,我都会归档到回归基准集里,变成一条带标注的测试用例。case 结构包含四部分:场景描述,也就是输入文本和前置状态;期望行为,明确写出可接受的回复或动作;允许偏差,列出哪些表述差异可以容忍;禁用行为,标记绝对不能出现的内容,比如“允许回答未知,但不能编造协议细节”。
这套机制本质上就是 Agent 版的单元测试。提示词、模型参数、工具定义都是被测代码,回归基准集就是测试用例库。任何一次改动,跑一遍全量回归基准集,如果旧问题复现,说明改动并没有真正修进去;如果新问题出现,说明改动引入了回归。规模上我建议三十到六十条起步,够覆盖主要风险即可,不必追求数量庞大。
5.3 轻量持续监控:用周度健康分趋势代替用户抱怨
全量体检适合在开发期和发版前做,上线后每天做不现实。我通常建议做“周度轻量盲测”:每周随机抽取二十五到三十条真实用户会话,按五维框架盲测打分,汇总成周度健康分趋势。这条趋势线比任何单项测试都更有价值,它能告诉你系统在长时间运行里是循序渐进地退化,还是稳定的。
具体操作时不需要每次都跑完整测试集,只需要跑一套精简版自动规则,配合少量人工抽检,半小时内就能完成。把每周分数记录在表格里,连续四周的趋势就能看出问题:如果事实一致度呈下滑趋势,说明近期可能有提示词污染线上流量;如果工具对齐度波动很大,说明工具返回格式在服务端发生了变化,需要及时排查。这种健康监控的核心价值,是把 Agent 系统从“等用户骂了再修”变成“指标预警提前介入”,也让所有人不再凭印象判断系统状态。
做了大半年体检,我最深的体会是:体检的意义不是把每个维度都刷到满分,那是理想状态,现实往往做不到;体检的真正价值在于让你清楚知道自己的 Agent 在哪个维度会先崩,从而在方案设计、资源投入上做出取舍。你会明白哪些问题该靠提示词修,哪些问题该靠工具链兜底,哪些问题可能干脆就是模型当前能力的天花板,该换脑子而不是继续调措辞。这套框架的所有文档和测试集结构都可以按需调整,权重和维度也不需要照搬,但核心思路值得坚持:先把玄学变成可量化的指标,再在指标的指引下去做干预。