跳到主要内容

复合 AI 系统中的流水线归因:在薄弱环节找到你之前先找到它

· 阅读需 11 分钟
Tian Pan
Software Engineer

你的检索精度提升了。重排分数改善了。生成器的忠实度指标比上个季度更好。然而用户却在抱怨系统越来越差。

这是生产级 AI 工程中最令人困惑的故障模式之一,而且发生频率远超团队预期。当你构建一个复合 AI 系统——检索结果送入重排器,重排器送入生成器,生成器再送入验证器——你就继承了一个根本性的归因问题。端到端质量是唯一真正重要的指标,却也是最难付诸行动的。你无法修复"系统变差了"。你需要修复某个特定组件。而在一个四阶段流水线中,这件事出乎意料地困难。

归因问题并非你所想象的那样

大多数工程师调试复合系统的方式和调试代码 bug 一样:隔离问题,修复,验证。但复合 AI 流水线打破了这种方法所依赖的一个基本假设——组件之间相互独立的假设。

在检索增强生成系统中,生成器的行为受检索器输出的影响。如果你改进检索器以获取语义更精确的文档,同时也改变了生成器接收的上下文分布。一个针对噪声较高的检索结果进行校准的生成器,在突然获得更干净的输入时,行为可能会不同——有时甚至更差。你并没有破坏任何东西,只是改变了联合分布。

这就是为什么单个组件指标的改善可能导致端到端回归。这不是你评估方法论中的 bug,而是组合系统的结构性属性:在隔离条件下优化组件,实际上是针对一个在你发布变更后已不再存在的固定输入分布进行优化

关于复合 AI 系统优化的研究文献已开始对此进行形式化。研究发现,端到端性能通常与每个模块的表现呈单调关系——但前提是所有其他模块保持不变。一旦你开始改变多个组件,交互效应就会主导一切。

为什么标准可观测性无法解决这个问题

对复合系统调试问题的典型回应是添加更多日志。对每个阶段进行监控,追踪每跳的延迟,构建仪表盘。这是必要的,但还不够。

根本问题在于,大多数可观测性工具被设计用于回答运营问题:系统是否正常运行,是否快速,是否在高效使用资源?它们并非被设计来回答归因问题:哪个组件应为这次输出质量下降负责?

质量归因需要不同的数据模型。你需要:

  • 一个追踪 ID,将用户查询连接到每个中间状态:原始查询、检索到的文本块、重排序结果、从上下文组装的最终提示以及生成的响应。
  • 针对该追踪计算的每阶段质量信号,而不仅仅是延迟和错误率。
  • 一种重现任何历史流水线状态的方式,以便在事后分析中隔离组件。

没有完整的追踪,你能判断出出了问题,但无法判断问题出在哪里。而在一个每天处理数千个查询的实时系统中,"某个地方出了问题"是无法付诸行动的。

真正能归因故障的各阶段指标

各阶段评估的目标是在每个阶段回答一个精确的问题:给定该组件接收到的输入,它是否产生了良好的输出?

检索阶段。 当检索器未能获取回答查询所需的文档时,它就失败了。这里的相关指标是检索召回率(正确文档是否出现了?)、平均倒数排名(它们在列表中的排名有多高?)以及上下文相关性(检索到的文本块在语义上是否适合该查询?)。检索失败的表现是:当相关文档恰好排在第一位时,答案质量高;否则答案质量低。关键证据是:在已有真实相关文档的黄金查询集上,召回率很低。

重排阶段。 重排器的工作是提高列表顶部的精度。其失败模式更为微妙:它可能在提高平均排名分数的同时,实际上损害了非典型查询长尾的性能,因为大多数重排器是在分布典型示例上训练的。各阶段指标:重排器分数与下游答案质量之间的等级相关性。如果接近零,说明你的重排器在评估与实际重要性无关的东西。

生成阶段。 生成器以两种截然不同却常被混淆的方式失败。幻觉失败:它生成了所提供上下文不支持的内容。指令遵循失败:它完全忽略上下文,退回到参数化知识。这两者需要不同的修复方案——一个是提示问题,另一个是模型校准问题。忠实度指标(答案是否引用了所提供的上下文?)和基础性指标(每个事实声明是否都能追溯到某个源文本块?)可以将二者区分开来。

验证阶段。 如果你的流水线包含验证器或自我批评步骤,它可能引入自己的故障模式:抑制正确答案的假阴性,或批准幻觉内容的假阳性。针对人工标注评估集的验证器准确率是这里的相关指标,但它经常被跳过。

消融方法论

一旦你有了各阶段指标,就可以运行有针对性的消融实验,为端到端质量变化分配归因。

基本方法:对于一个固定的查询集,用黄金标准预言机替换一个组件后运行流水线。如果用完美检索(即手动选择的真实文档)替换检索器能消除大部分质量差距,那么检索就是你的瓶颈。如果没有,那么检索不是问题所在——即使其指标看起来很差。

这种预言机消融模式直接借鉴自系统研究中的对照实验。它比仅仅查看仪表盘更耗时,但它是唯一能产生明确归因的方法。关键的实际要求是:你需要一个在端到端层面有人工验证质量标签的保留评估集。没有真实标准,你就是在将指标与指标进行比较,古德哈特定律适用:每个指标最终都会被优化,包括错误的那些。

这种方法的更系统化版本涉及在扰动条件下测试组件。对一个组件的输出施加受控降级——向检索结果中注入无关文档,将重排器置信度分数降低固定量,以特定速率引入生成错误——然后测量端到端质量移动了多少。灵敏度最高的组件就是工程投入回报最大的地方。

组件改进悖论

有一种非显而易见的故障模式会让拥有复杂各阶段指标的团队栽跟头:你正确识别了最薄弱的组件,改进了它,但端到端质量仍然没有改善——甚至变得更差。

这种情况发生有几个原因。

分布偏移。 如上所述,改进一个组件会改变下一个组件的输入分布。针对特定上下文质量水平训练或提示的生成器,在该质量水平发生变化时会表现出不同的行为。

评估集不匹配。 你的各阶段指标可能是在代表性查询样本上测量性能,但端到端质量实际下降的查询处于分布的不同部分。你平均改进了组件,但在重要的长尾上使其变差了。

交互效应。 某些组件组合会产生涌现行为。特定的检索器-重排器组合可能表现良好,因为重排器在隐式补偿检索错误。改进检索器后,重排器所学会的补偿就变成了负担。

对此的实际回应是:始终在发布前,通过在多样化评估集上测量端到端质量来验证组件级别的改进。各阶段指标是诊断工具,而非发布标准。一个不能推动端到端指标的组件改进,无论组件指标看起来多好,都是降低优先级的候选。

实用归因工作流

基于上述分析,生产中复合 AI 系统的可行归因工作流如下:

  1. 检测回归。 端到端质量信号下降——无论是面向用户的指标还是自动化评估。这是你的触发器。

  2. 按流水线路径分段。 不同查询可能在系统中走不同的路径(例如,有些绕过重排,有些使用不同的检索索引)。按受影响查询使用的流水线配置进行分段。如果某个分段受到不成比例的影响,你就立即缩小了搜索范围。

  3. 运行预言机消融。 对于受影响的查询集,逐一用黄金标准版本替换每个组件,测量替换后的端到端质量,按质量恢复程度对组件进行排名。

  4. 测量受影响查询的各阶段指标。 将受影响查询集的各阶段指标与基线进行比较,寻找与基线偏差最大的阶段级指标。

  5. 交叉验证。 如果预言机消融和各阶段指标指向同一个组件,你就有了高置信度的归因。如果二者不一致,你可能遇到了交互效应——调查两个被牵涉阶段之间的组件边界。

  6. 通过端到端验证发布修复。 修复归因组件后,在发布前在保留评估集上进行验证。同时追踪各阶段指标和端到端质量,以便及早发现分布偏移。

团队常犯的错误

最常见的错误是将各阶段指标视为端到端评估的替代品。它们不是。它们是一种调试工具,帮助你在端到端质量下降后了解应该查看哪个组件。在没有相应端到端信号的情况下单独运行各阶段指标,只能告诉你组件在评估集的实验室条件下的表现,而非在真实环境中的表现。

第二个错误是在第一次严重事故后才构建归因基础设施。那时,你是在对并非为回答归因问题而设计的日志进行取证。追踪不完整,评估集不存在,各阶段指标从未被监控。构建归因基础设施的正确时机是系统运行良好、你有时间仔细思考"如果它出了问题我需要知道什么"的时候。

第三个错误是假设个体指标最差的组件总是最高优先级的修复对象。在一个组合系统中,改进某个组件的价值取决于其下游组件会发生什么。一个看起来平庸但其输出对变化具有鲁棒性的组件,可能比一个指标良好但对输入质量高度敏感的组件更不重要。

从第一天起为可归因性而构建

其工程含义是:可归因性应该是复合 AI 系统的一等设计要求,而不是事后的补充。这意味着在查询接收时生成追踪 ID 并在每个组件中传播;记录中间状态(检索到的文本块、重排器分数、组装的提示)以及最终输出;构建并维护带有端到端质量标签的保留评估集;以及从第一次部署开始就在生产中监控各阶段质量指标。

这些在技术上都不复杂,需要的是纪律。在生产中最难调试的系统,很少是组件最复杂的那些——而是那些从未构建"哪个部分出了问题?"基础设施的系统。

当你的端到端指标变动时,你希望把时间花在修复问题上,而不是弄清楚该去哪里找。

References:Let's stay in touch and Follow me for more thoughts and updates