跳到主要内容

知识切断是一个隐形的生产环境 Bug

· 阅读需 13 分钟
Tian Pan
Software Engineer

大多数生产环境中的 AI 失败都是“响亮”的。模型返回 5xx 错误。模式验证抛出异常。评估套件在发布前捕获了回归。但还有一类失败是完全无声的——没有错误,没有异常,没有警报触发——因为系统正完全按照设计运行。它只是在处理一个来自 18 个月前的现实快照。

你的 LLM 存在知识截止日期(Knowledge Cutoff)。这个截止日期不仅仅是文档中的一个脚注。它是模型认知的真实情况与实际现实之间日益扩大的鸿沟,而且你每在生产环境中多运行一天旧模型,这种差距就会累积。团队庆祝上线,随后眼睁睁看着用户信任在接下来的六个月里悄然瓦解——世界在前进,而模型却停滞不前。

隐蔽之处在于:模型对于它不知道的事情并不会报错。它会根据其训练分布进行自信的插值,并生成一个听起来很合理的答案。错误率保持平稳。延迟看起来很正常。用户会话顺利完成。只有当下游的人类根据在 2024 年准确但在 2026 年错误的信息采取行动时,失败才会显现。

部署差距是结构性的,而非偶然

每一个前沿模型在进入生产环境时就已经过时了。从训练截止到公开发布——经过 RLHF、安全评估、基础设施加固——需要 6 到 18 个月。发布后,团队通常会在进行重大更换之前运行模型 1 到 2 年。一个训练截止日期为 2023 年 10 月的模型(截至 2026 年初,这仍是许多第三方集成中的默认设置),展示的是一个近 30 个月前的现实快照,并将其作为当前信息呈现。

这种差距并不是极端情况。它是每一个部署的 LLM 运行时的结构性条件。

有效的截止日期通常比官方公布的还要早。通过实证追踪知识截止日期的研究(LLMLagBench, arxiv:2511.12116)发现,对于某个主流模型,基准测试检测到的知识边界比公开声明的截止日期早了 10 个月。原因在于:网页爬取存在时间上的错位。2025 年的爬虫包含了引用 2023 年来源的文档。训练语料库中超过 80% 的维基百科文档来自更早的文档版本,而不是截止日期当天存在的版本。

同一模型内的子领域可能具有不同的有效截止日期。模型对 Python 异步模式的了解可能与声明的日期一致。但它对某个小众监管框架的了解可能实际上要陈旧两年,仅仅是因为该领域在接近截止日期的训练数据中代表性不足。

实践中的时间性衰减

这种失败模式在各领域都是一致的。团队成功上线,然后遇到“90 天悬崖”——这个短语现在出现在多个生产环境的事后分析中——最初的成功逐渐让位给无声的侵蚀,因为模型的现实快照与当下发生了偏离。

定价和费率。 模型自信地引用其训练数据中的 SaaS 定价层级。如果该定价在六个月前发生了变化,客户现在就会根据错误的数字向供应商询价。模型针对“这需要多少钱?”生成了一个格式完美、完全合理的答案,但它就是错的。

API 弃用。 AI 辅助开发工具引用了一个在训练时存在但后来被弃用并移除的 API 端点。开发者编写的代码指向了一个并不存在的函数签名。这并非经典意义上的幻觉——模型准确地回忆起了曾经真实存在的事情。

监管和法律指导。 劳动法、税法、GDPR 修正案、特定行业法规——模型自信地根据训练时存在的制度进行回答。如果一个组织在 2026 年 4 月向一个知识截止日期为 2024 年 12 月的模型咨询合规要求,收到的详细且权威的回复可能描述的是早已发生变化的规则。

安全公告。 模型推荐了一个随后被发现存在严重 CVE 漏洞的库版本。它描述了一种在已知漏洞公开后被弃用的安全架构模式。

在所有这些案例中,监控显示一切正常。模型返回了响应。模式验证有效。延迟在 SLO 范围内。在下游的人类根据过时信息采取行动之前,这种失败是不可见的。

时间盲性比幻觉更糟糕

幻觉与时间陈旧性之间存在重要区别。幻觉是随机的:模型捏造了一些从未真实存在过的东西。陈旧性是系统性的和方向性的:模型准确地报告了在特定时间点真实存在的事情,同时含蓄地将其作为当前现状呈现。

系统性的方向性错误比随机错误更难捕获。如果模型幻觉了定价,有时会比实际高,有时会比实际低——用户可能会察觉到这种差异。如果模型始终自信地报告去年的定价,用户仅从输出结果无法判断出了问题。

关于 LLM 智能体和时间推理的研究(TicToc 基准测试,arxiv:2510.23853)将此量化为“时间盲性”(temporal blindness):模型在推理动态环境时,无法考虑到流逝的现实世界时间。在测试中,即使给出了时间戳信息,没有一个模型的对齐度超过 65%。模型要么过度依赖过时的上下文——跳过必要的工具调用去获取新鲜数据——要么冗余地重新获取并未发生变化的稳定信息。

美联储 2025 年关于 LLM 中宏观经济知识的研究发现,随着查询接近训练截止日期,准确率明显下降,而截止日期后的事件结果明显更糟。这就是度量问题:退化不是突然发生的,而是渐进的。没有跨越某个阈值来触发警报。

三个检测层面

在用户发现之前捕捉知识陈旧,需要在三个层面进行监控。

查询层检测。某些词汇模式能可靠地指示时间风险:“当前”、“最新”、“现在”、“最近”、“今天”、“今年”、“已更新”,以及特定版本的语言,如“...有哪些变化”或“截至...”。领域上下文增加了第二个信号层 —— 无论具体措辞如何,定价、监管、安全和组织架构相关的查询都具有较高的基础陈旧风险。构建一个轻量级分类器,在两个维度上标记查询,并将其路由进行额外处理。

RAG 中的文档层检测。每个检索到的文档都应携带最后修改时间戳。如果检索到的文档比例失调地陈旧 —— 例如,对于一个高波动领域的查询,80% 的检索分块都超过六个月 —— 这表明问题出在知识库本身,而非模型。在你的可观测性层中体现这一点。

总体层偏移。跟踪检索文档随时间推移的年龄分布。如果检索文档的年龄中位数逐周增加,说明你的向量索引累积陈旧的速度超过了刷新的速度。这一指标能在个体查询失败对用户可见之前,从总体层面捕捉到问题。

无人采用的最廉价修复方案

部署最不足的单一缓解措施不仅成本为零,而且可以在三十分钟内添加:将当前日期和模型的知识截止日期注入到每一个系统提示词中。

System: 今天的日期是 {{CURRENT_DATE}}。
你的训练知识截止日期为 {{CUTOFF_DATE}}。
对于有关事件、定价、法规、软件版本或任何频繁更改的内容的问题,
请承认这一局限性,并建议用户从权威来源验证当前状态。

这并不能赋予模型它所缺乏的知识。但它使模型能够显式地推理当前与训练数据之间的差距,对时间敏感的查询进行适度的风险对冲,并向用户信号化它知道自己的局限,而不是以虚假的自信呈现陈旧的信息。

其机制至关重要:知道今天日期的模型可以计算流逝的时间(“我的训练在 18 个月前结束”),并应用特定领域的陈旧启发式逻辑(“定价经常变动,我应该对此表达不确定性”)。如果没有日期,模型就没有时间自我意识的基础。它会像处理训练快照代表现在一样回答每一个查询。

这是最小可行性的陈旧缓解方案。大多数团队跳过它,因为觉得它太简单了。它确实很简单,而且非常有效。

RAG 的新鲜度本身就是一个问题

部署了 RAG 的团队通常认为他们已经解决了陈旧性问题。其实不然。研究一致发现,生产环境中超过 60% 的 RAG 失败归因于知识库本身中陈旧或过时的信息。只有当你保持检索语料库的新鲜时,添加检索才能为你提供新鲜的信息 —— 这需要其自身的架构。

主要的失败模式是批处理重新索引。每晚的任务会重新嵌入语料库。在批处理运行后更改的任何文档在下次运行前都是陈旧的。对于定价、API 文档或监管指南等高波动内容,24 小时的陈旧窗口是不可接受的。

目前的生产模式是用基于变更数据捕获 (CDC) 的流式重新索引取代批处理重新索引。当源系统中的文档发生变化时 —— Confluence 页面更新、数据库记录更改、API 文档重新发布 —— 该变化会立即流入嵌入流水线。只有发生变化的文档会被重新嵌入,而不是整个语料库。向量索引以毫秒级的延迟而非 24 小时的延迟保持最新。

在此基础上增加 TTL 策略:按波动性对文档进行分类,并相应地分配过期窗口。定价和实时数据在数小时内过期。API 文档在数天内过期。架构模式和历史内容在数月内过期或永不过期。检索到超过 TTL 文档的查询应在返回结果前触发异步刷新。

对于风险最高的查询 —— 由上述查询层分类器检测到 —— 在访问向量库之前路由到实时搜索。新鲜的网络结果或实时 API 调用可以用当前信息回答问题。仅当实时检索失败时才回退到向量库,并在此时显式地展示文档的年龄。

优雅降级胜过自信的错误回答

有强有力的经验和实践证据表明,当置信度低时,模型应该拒绝回答,而不是生成听起来合情合理的错误回答。关于 LLM 弃权的研究 (TACL, 2025) 表明,弃权可以维护用户信任;而自信的错误回答则会摧毁信任。

实际的设计方案是一个响应置信度分层,而不是二元化的回答/拒绝。对于高陈旧度领域的查询:

  • 如果新鲜检索成功:根据检索到的内容回答,展示文档日期。
  • 如果新鲜检索未返回任何最新内容:根据模型知识回答,显式界定截止日期(“根据我截至 [日期] 的训练数据,X 是真实的。此类信息会发生变化 —— 请验证当前状态。”)。
  • 如果模型在该领域的知识匮乏或内部不一致:拒绝回答,并引导至权威来源。

核心设计原则是陈旧度分层对用户绝不应是不可见的。知道自己正在根据陈旧快照回答问题的模型应该说明这一点。这种摩擦的成本低于用户依据错误信息采取行动并完全失去对你产品信任的成本。

组织架构层面

知识截断(Knowledge cutoff)失败也是组织监控上的一个缺口。通常共同承担责任的三个团队——ML(模型没变)、SRE(基础设施没问题)和产品(行为发生了变化)——各自正确地评估了自己负责的部分,并得出结论:一切正常。实际问题恰恰出在这些边界之间。

通过专用的可观测性信号来解决这个问题:持续追踪并明确归属权地记录“检索文档的时效分布”(retrieved-document-age distribution)。当该指标超过阈值时,直接触发告警。不要等到用户反馈“AI 给了我错误信息”——到那时,信任受损已成定局。

另一种组织层面的缓解措施:定期进行模型时效性审计。从生产流量中挑选排名前 20 的查询,手动验证模型的回答是否具有时效性。每季度运行一次。这项工作并不光鲜,但它是捕获系统性陈旧问题、防止其累积成用户可见故障的唯一方法。一个六个月前还很准确的模型,现在对你用户最关心的领域所掌握的可能已经是 30 个月前的快照了。

优先实现什么

以下是按每工程小时影响力排序的四项改进:

  1. 日期注入:在每个系统提示词(system prompt)中加入当前日期和知识截断日期。耗时 30 分钟。立即提升模型对自身局限性的推理能力。

  2. 时间敏感查询检测:构建一个轻量级分类器来识别时间敏感的查询。将标记出的查询在进入向量数据库之前导向实时检索(live retrieval)。耗时一个冲刺(sprint)。

  3. 检索文档时效监控:为每个检索到的分块(chunk)添加元数据,并在可观测性栈中追踪时效分布。当特定领域的中位时效超过阈值时发出告警。耗时一个冲刺。

  4. 针对高波动性文档的 CDC 驱动重新索引:将价格、API 文档和监管内容的每日批处理任务替换为流式重新索引。这是一项长期投入——请据此安排预算,但如果不这样做,在那些对时效性要求最高的领域,就会出现系统性的新鲜度失效。

知识截断不是一个你可以接受并直接跳过的模型限制。它是一个生产约束,你需要围绕它进行刻意设计、持续监控,并在无法弥补差距时诚实地向用户披露。那些将其视为基础设施(有明确归属、有仪表监控并保持在 SLO 范围内)的团队,交付的 AI 功能能随着世界的变化保持准确。而那些将其视为 LLM 奇怪特性的团队,则会在产品发布六个月后,从用户的投诉中发现问题。

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