29|故障诊断手册:从现象到最小有效修复
目标:面对失败不立即换模型或叠加规则,而是提出竞争解释、寻找区分证据并修复正确层。案例为作者构造,不是用户仓库已确认事故。
本章目录
沿着对象与状态理解本章
故障定位先查输入事实、检索、状态、执行和验证,避免把所有失败归于模型。
下方图解的固定输入在“输入与适用条件”中声明。它用于解释本章机制,不与本章其他独立例子的数值暗中接续。
先找错误发生在哪层,再谈换模型
什么时候该改Prompt、检索、记忆或模型?
一个错误答案可以来自不同原因。模型根本没拿到新版本时,增加推理时间不能补出缺失事实;检索已经拿到新版本却被旧记忆覆盖时,需要修上下文与记忆使用规则。选择修复层应跟随证据,而不是看到失败就再加一个Agent。
输入与适用条件:构造“旧配置被当成当前配置”的诊断案例;不以单次观察就宣称确定因果。
1 / 6 · 现象
窄屏可左右滑动图形,或点击“放大图形”。文字解释紧随图后。
先写清楚哪句话错、正确证据是什么,避免只说“感觉变差”。
本步状态由图形与说明共同给出。默认静止。用“下一步”看完解释再继续;播放到最后一步自动停止。键盘聚焦播放器后,可用左右键逐步查看、空格播放/暂停。图中颜色辅助区分,含义同时用文字注明。
为什么需要
避免无目的地叠Prompt、规则、模型和审查环节。
怎样实现
按原文→索引→检索→上下文→推理→行动→核验逐段定位。
可能的代价与误解
同时改变多个因素后只看总成功率,无法解释哪项改动起作用。
如何判断是否做对
同任务、同版本、同预算对照,保留失败样本与可复查轨迹。
案例一:Skill显示加载,但代码仍不专业
观察:日志有技能名称,输出却未处理事务超时。竞争解释包括:只加载了元数据;正文被裁剪;子Agent未得到内容;正文根本没有有效专业知识;模型看到但未应用;测试没有要求该行为。
最小排查先看实际加载范围与正文,再看执行轨迹中是否涉及相应风险,最后用能触发该错误的任务验证。不应第一步增加一个路由Agent,因为选择可能已经正确。修复可能只是补一条具体事务边界知识与对应测试。
回归同时包含需要事务处理与无关任务,防止把所有任务都升级成分布式系统分析。验收是错误行为减少,而不是回答更频繁提到“事务”。
案例二:压缩后工作方向改变
观察:原要求只改description,压缩后开始重构执行器。竞争解释:负约束丢失、假设升级、旧记忆覆盖、新用户输入未进入、子任务说明截断。
取压缩前后任务状态,检查“不能改什么”是否保留;比较下游委派说明与当前权威目标。若宿主压缩不可读,用相同前缀分叉继续执行,测试具体约束。修复优先持久化少量关键约束与证据入口,不必默认自建第二套全历史摘要服务。
回归应包含多次压缩与新的目标变更,避免系统过度固定旧约束,反而不能遵循用户后来授权的变化。保真不是永远不变,而是正确保留时间与权威。
案例三:检索结果相关,却总是旧版本
观察:回答术语正确,但API字段已废弃。可能是索引未更新、向量语义偏爱旧长文、缓存键没有版本、重排未使用时间范围或生成阶段混合旧证据。
沿管线检查当前文档是否入库、候选是否包含、过滤后是否保留、排序/选择是否丢弃、最终引用是否对应。修复点可能是索引代次与版本过滤,而不是更换Embedding模型。
回归加入同名不同版本、回滚场景和历史查询。不能简单永远选择时间最新的一条,因为用户可能问旧版本迁移原因。第15章有效时间与知晓时间帮助区分这些需求。
案例四:测试全绿,用户仍发现问题
可能原因包括测试根本没运行、关键项被跳过、测试被模型弱化、测试版本陈旧、新要求未覆盖、环境与生产不同。首先读取实际命令、数量、退出码和工件版本,不能只读模型总结。
修复应针对原因:空测试集设置明确失败;新要求补断言;验证绑定当前版本;高风险测试资源隔离。不要机械再加三轮自然语言Review,因为它们可能重复相信同一份错误绿色报告。
回归故意修改测试后文件、删除关键断言、制造超时,观察系统是否仍会宣布成功。第27章已实测其中的陈旧验证拒绝。
案例五:任务越来越慢,Token越来越多
先分解模型、工具、排队、检索、压缩与Review耗时。可能是多Agent重复读相同文件、技能默认全加载、输出冗长、失败重试、模型强度过高或外部工具慢。
一个针对性修复是让研究子任务返回精确证据入口,主Agent不再重复全库发现;另一个是移除对小问题重复重设计的流程。只有证明成本下降且专业质量不退化,才算有效优化。减少输入但提高失败率不是成功。
回归要覆盖复杂任务,防止简单任务更快而复杂任务被过度简化。用任务成功成本而非平均Token做主要判断。
案例六:重试导致重复副作用
观察:网络超时后出现两个工单。根因可能是每次重试生成新操作ID,或远程服务不支持幂等而客户端把unknown当失败。修复需要业务幂等/对账,不是把Prompt写成“不要重复”。
测试应在“远程已成功但客户端未收到”窗口断开,而不仅模拟调用前报错。本书本地文件崩溃实验验证类似窗口,但远程业务还需要相应服务能力,不能直接套用文件哈希。
案例七:记忆越多,错误越稳定
观察:系统坚持旧经验,即使当前代码相反。检查记忆的来源、版本、作用域、写入权限和检索优先级。一次猜测被自动保存为active,可能在多次摘要中逐渐变成“已验证规则”。
修复先清理错误权威与适用边界,再评价写入策略。必要时减少记忆,而不是增加更复杂图结构。回归包含新证据推翻旧结论、权限撤回、相互冲突与无匹配场景;系统应能不使用记忆。
统一诊断方法
把现象、竞争解释、区分证据、最小修复和回归样本放在一起。每次额外读取应减少一个重要不确定性;每项代码改动应对应真实失败。没有这些联系的“全面优化”很容易扩大系统而没有提升能力。
确定性Bug用测试修,信息缺口用检索补,专业缺口用知识补,执行缺口用Harness修,能力上限才考虑模型或训练。顺序不是绝对规则,但能避免把一切归咎于模型不够聪明。
内容没变但变慢:把运行轨迹对齐再猜
输入与条件。两次任务模型与Prompt相同。旧轨迹检索200ms,新轨迹检索200ms;模型耗时同为2秒,新版工具队列多等3秒。
| 步骤与对象 | 内部动作 | 中间结果 / 新状态 |
|---|---|---|
| 1逐段对齐 | 检索与模型时间相同 | 不是它们导致新增延迟。 |
| 2识别新增 | 队列等待3秒 | 先查并发、限流、重试和工具资源。 |
| 3最小修复 | 调整已确认不合理的队列配置 | 不先精简Prompt或换模型。 |
| 4复测 | 同任务、同负载口径 | 检查延迟是否恢复且错误率未升。 |
| 5边界 | 轻载好了不代表高峰好了 | 测试代表性负载。 |
把过程连起来。把症状沿Trace归位,可以避免修一个没坏的层。
边界与反例。时间是教学轨迹,不提供真实性能测量;生产日志应避免记录敏感内容。
依据与适用范围:[DERIVE]。示例输入和场景由本书明确设定。