跳到主要内容

凌晨三点调试 AI:LLM 驱动系统的故障响应指南

· 阅读需 11 分钟
Tian Pan
Software Engineer

你正在值班,凌晨三点,告警触发:过去一小时内 AI 聊天功能的用户满意度下降了 18%。你打开日志,却看到……什么都没有。每个请求都返回了 HTTP 200,延迟正常,没有任何报错。

这就是 AI 事故的体验。传统值班的肌肉记忆——grep 堆栈跟踪、找到异常、部署修复——在这里完全失效。系统并没有崩溃,它做的正是它被设计来做的事。只是输出结果是错的。

糟糕的生成结果没有堆栈跟踪,它有概率分布。如果你还没有为概率系统重新训练你的事故响应本能,你将在凌晨痛苦地盯着健康的监控指标,而你的用户却在得到错误的答案。

以下是如何调试它的方法。

为什么 AI 事故在结构上与众不同

传统软件事故有一个可以指向的根因:空指针解引用、防火墙规则配置错误、数据库查询缺少索引。某个具体的事情发生在某个具体的代码行。

AI 事故通常有诱因,而不是根因。模型本身没有崩溃——它产生的输出遵循一组条件:你给它的提示词、你传入的上下文、你包含的示例、你配置的采样参数,以及提供商今天实际运行的底层模型版本。任何这些条件都可能发生变化并导致输出质量下降,而不触发任何错误。

有研究追踪了 LLM API 的稳定性,发现当提供商更新其底层模型时,58.8% 的提示词和模型组合会出现退化——其中 70% 的退化代表超过 5% 的准确率下降。模型"改变了",但没有人动过你的部署。

这带来了三个传统事故响应所没有的诊断挑战:

设计上的不可复现性。 温度参数 > 0 意味着相同的输入会产生不同的输出。你无法可靠地复现用户得到的确切糟糕回复,只能表征响应的分布。

无声的成功信号。 你的基础设施监控全程看到的都是 200。唯一表明出了问题的信号来自下游的质量指标——用户反馈、任务成功率、输出评分流水线——而这些你可能已经建立,也可能还没有。

模糊的责任归因。 当模型产生错误答案时,这是模型失败?提示词缺陷?检索失败导致模型获得了错误的上下文?参数配置错误?每种原因需要不同的修复方案。

分类决策树

当 AI 事故触发时,在得出任何结论之前,按照以下顺序进行排查:

第一步:这是采样方差还是系统性问题?

取一个有代表性的失败输入,通过模型运行 10 次。如果大约一半的运行产生好结果,另一半产生差结果,你面对的是方差问题。如果每次运行都产生差结果,你有一个系统性故障。

这单个步骤能节省大量时间。方差问题的处理方式与系统性问题完全不同——许多凌晨三点的误报实际上是恰好在最近的监控窗口中集中出现的方差事件。

第二步:最近的部署周期中有什么变化吗?

按顺序检查:

  • 已部署的提示词版本(即使是措辞变化也算)
  • 模型版本或提供商端点变更
  • 检索流水线修改(如果使用 RAG)
  • 上游数据源更新

系统性故障几乎总是与最近的变更有关联。这个变更可能不是你做的——提供商会不通知地更新他们的基础模型——但某些东西发生了变化。

第三步:这是提示词问题还是模型问题?

这个区别很重要,因为它们有完全不同的修复路径。提示词问题你今晚就能修。模型能力缺口需要不同的策略。

提示词问题的迹象:

  • 失败集中在特定的输入模式或主题领域
  • 当你手动重新表述输入时,模型能产生正确答案
  • 上下文示例过时、相互矛盾或不再具有代表性
  • 指令模糊,或任务描述埋在长上下文的末尾

模型问题的迹象:

  • 失败在所有输入模式中均匀出现
  • 手动重新表述没有帮助
  • 模型从未在这个任务上达到准确,即使在早期测试中
  • 提供商的模型更新与退化开始时间相关

第四步:对于 RAG 系统,优先排除检索失败

检索失败尤其隐蔽,因为模型接收到错误的上下文,基于该上下文生成一个充满信心的响应,而基础设施监控看起来一切正常。检索流水线中存在七种已记录的失败模式,但运行时最常见的是:

  • 检索到的片段技术上相关但缺少所需的具体事实
  • "迷失在中间"的退化:模型对上下文窗口开头和结尾的关注效果好,但对埋在长输入中间的信息,准确率下降 30% 以上
加载中…
References:Let's stay in touch and Follow me for more thoughts and updates