无结果并不代表不存在:为什么智能体将检索失败视为证明
智能体对话记录中最危险的一句话不是幻觉。而是四个冷静的词:“我没有找到。”智能体听起来在认知上表现出谦逊。听起来像是完成了尽职调查。对于任何下游读者或调用者来说,这听起来完全像是一个事实。然而,这句话并没有提供关于该事物是否存在的信息。它只提供了关于特定工具在使用特定查询、咨询特定索引(而智能体恰好在那个时刻有权访问该索引)时发生了什么的信息。
在这两种解读之间,隐藏着一个随时可能发生的生产事故。支持智能体告诉客户“我们没有你的订单记录”,因为同步延迟导致写入只读副本的时间推迟了 90 秒。编码智能体声明“该模块没有测试”,因为它搜索了一个不包含测试文件夹的目录。合规智能体回答“档案中没有先前的违规记录”,因为审计索引尚未摄取上周的报告。在每种情况下,智能体的输出在语法上都是一种否定,但在认知上,它只是一个被重新表述为断言的“耸肩”。
这不是模型质量问题。即使是校准得再完美的 LLM 也不可能知道它没看 到的东西。错误发生在检索工具将结果交给推理循环的上游边界处,且这几乎总是一个协议设计缺陷:工具在应该返回更丰富的内容时返回了“空”,而智能体将这种模糊性坍缩为一个自信的否定,因为这正是自然语言处理空集时的惯用方式。
导致坍缩为单一输出的四个诱因
当智能体说“未找到”时,至少有四种结构上不同的上游状态可以产生这句话,而当这些话到达用户手中时,它们已变得无法区分:
- 范围错误的工具。 智能体调用了
search_current_tickets,而客户的问题是关于上季度已关闭并归档到冷存储的工单。工具完成了它的工作。它在被告知的地方进行了搜索。只是归档文件不在搜索范围内。 - 格式错误的查询。 智能体将“我周二订购的东西”翻译成了对“东西”的字符串搜索,而系统期望的是订单 ID 或 SKU。数据库返回了零行。它对所接收到的查询说了实话。
- 陈旧或索引错误的语料库。 记录存在于记录系统中,但尚未同步到检索索引。对生产环境中 RAG 系统的调查研究表明,超过一半的发布后检索失败都可以追溯到这种新鲜度差距——索引是移动目标的滞后快照,且这种差距很少被监测。
- 因当前主体的权限而被过滤。 记录存在,索引也知道它存在,但查询是在一个无权查看该记录的身份下运行的。Azure AI Search 的安全过滤模型和 Auth0 关于智能体访问控制的文章都明确指出了这一点:过滤检索在隐藏行时运行正常,但这种隐藏对智能体来说是不可见的。
这四种情况产生的字符串完全相同。智能体无法区分“我找遍了所有地方,世界上没有这条记录”和“我调用的某个东西返回了 []”。哲学家给这种从后者推导到前者的行为起了一个名字:诉诸无知 (argument from ignorance)。证据的缺位并非缺位的证据 (Absence of evidence is evidence of absence) 仅在一个人拥有“已使用正确的工具在正确的地方寻找过”这一强先验假设时才成立。大多数智能体框架中的工具协议都没有编码这种先验,模型也无法从传输格式中重建它。
为什么模型会将模糊性压缩为断言
LLM 是一个流畅性引擎。当它读取到 {"results": []} 的工具结果时,它接收到的是一个稀疏、模糊、结构匮乏的观察结果,并被要求将其渲染成供人类阅读的散文。空列表最自然的英语表达就是否定。从风格上讲,“没有结果”比“系统调用返回了一个空数组,我无法保证这意味着什么”是更好的句子。模型并没有撒谎。它正在做它被训练去做的事情:生成看似合理的文本。
这就是认知不对称出现的地方。正向的检索结果是自证的——记录就在那里,智能体可以引用其字段,读者可以进行审计。而负向的检索结果是对搜索内容之外所有事物的断言,这是无法观察到的。智能体被要求保证它无法见证的事情,而语言界面使得隐式地做出这种保证变得廉价。
幻觉分类研究将其视为一个独立的失败类别:智能体并没有虚构一个不存在的记录(经典的幻觉),而是虚构了关于不存在的确定性,因为工具协议没有给它提供表达不确定性的词汇。一些从业者称之为流畅性坍缩 (fluency collapse) ——结构上有意义的模糊性被压平成了语法上自信的输出,因为模型没有专门的 Token 来表达“我不确定搜索是否详尽”。
重新设计工具返回合约
修复方法不在提示词层。无论多少“注意否定句”的指令都无法在长上下文和工具链中持久生效。修复方法在于工具本身的返回形态。检索工具应该提供足够的溯源信息,以便智能体在需要时能够区分上述四种情况,而无需猜测。其形式大致如下:
- 范围披露 (Scope disclosure)。 工具说明其搜索的语料库或分片,并附带时间戳。不是“订单 (orders)”,而是“orders_index,快照 2026-04-23T14:02Z,涵盖过去 90 天”。智能体现在拥有了所需的信息,以便在你询问该窗口之外的内容时及时察觉。
- 查询回显 (Query echo)。 工具回显其在经过服务器端重写或规范化后实际执行的查询。智能体现在可以判断其查询是否符合索引的 Schema,而不是盲目相信它发送的文本就是实际运行的代码。
- 新鲜度合约 (Freshness contract)。 工具声明其索引延迟——要么是服务等级目标 (SLO)(“最多延迟 60 秒”),要么是本次请求的精确延迟。当你的提问涉及刚刚发生的事件时,读取到“延迟 60 秒”的智能体就拥有了提及这一注意事项所需的信息。
- 权限过滤确认 (Permission-filter acknowledgement)。 当行数据因访问控制而被省略时,工具应该明确说明,即使它无法指明是哪些行。像
filtered_by_policy: true这样的标志可以降低枚举隐藏记录带来的泄露风险,同时仍能提醒调用者:空结果集未必是真的完全为空。 - 完备性标志 (Exhaustiveness flag)。 工具是扫描了整个候选集,还是在 top-k 截断后因未找到匹配项而提前返回?这是两种截然不同的认识论情况,而分页检索默认会将它们混为一谈。
携带这些字段的工具返回将“无结果”从一种断言转变为一束观察结果。智能体是否能正确使用它们是第二个问题,但至少智能体现在可以做到了。
在发出否定结论前要求正向存在证明
一旦工具层变得更加丰富,智能体层就获得了一个值得强制执行的不变量:任何用户可见的否定结论都必须有正向存在证明的支持,即证明搜索是权威的。 这个不变量听起来很抽象,但在智能体循环中,它可以转化为具体的护栏。
对于回答“我有待处理的退款吗”的客服智能体,其循环应拒绝发出“档案中无退款”的回复,除非检索工具报告其搜索了权威账本(而非缓存镜像)、在用户的租户范围内、且使用的凭据 (principal) 可以看到退款行,并且索引延迟低于 刚刚提交的退款可能仍不可见的阈值。如果其中任何一个条件不满足,唯一诚实的输出就是对冲表述:“我可以查看到过去 24 小时的退款活动,该窗口内没有任何记录——对于更早之前的记录,我需要检查另一个系统。” 这句话更长,不够干脆,但它是对实际所提问题的正确回答。
构建内部智能体的从业者有时会在工具调度层实现一个小型包装器:在任何工具结果被叙述为否定结论之前,包装器会检查结果的范围和新鲜度元数据是否符合针对该用户问题类型的策略。如果不符合,包装器会将空结果重写为一个不确定性令牌 (uncertainty token),智能体经过训练会将其呈现出来。这并非多么高深的工程技术,这只是拒绝让语言的流利性掩盖认识论的严谨性。
无人归入正确类别的故障模式
这种失效模式长期以来缺乏监测,原因在于它看起来不像通常意义上的 Bug。没有任何错误,工具也没有返回 500。智能体输出的是整洁、礼貌、格式正确的英语。客户得到了答案。三周后,有人注意到老客户留存率下降了两个百分点;或者一次 VIP 投诉升级揭示了四个互不相关的用户被告知“无记录”,而这些记录显然是存在的;又或者一次法律审查发现,合规智能体自信地批准了一笔交易,因为相关的制裁标志尚未同步。
这类事件的复盘往往被归类为“幻觉”、“知识库新鲜度”或“访问控制配置错误”——每次事件一个根因,分别归档,分配给不同的团队。其底层模式——智能体 将空检索视为权威的否定结论——在所有这些事件中都是相同的,但很少得到专门的关注。开始明确命名这一模式的团队发现,他们大量的“杂项”支持故障竟然都坍缩为一个可以通过架构修复的单一问题。
两种遥测信号有助于发现这一问题。第一种是“空结果 + 无范围元数据”形式的工具结果与包含权威否定结论的智能体输出之间的比例——如果工具返回是结构化的,这是一个很容易计算的比率,也是合约尚未收紧的先行指标。第二种是对智能体对话记录进行抽样人工评审,专门寻找包含“不存在 X”或“没有记录”的句子,并询问评审人员:该断言背后的搜索实际上是否完备、范围是否正确且及时。这种评审揭示了大量自信的否定结论,到头来不过是礼貌的推诿。
开放世界检索中的诚实默认设置
生产环境中的检索是一个开放世界。智能体可能被问及的事物范围远大于它所能访问的索引;索引本身只是记录系统的噪声样本;记录系统本身也是不完整的;而且智能体所代表的身份只能看到上述内容的一个片段。在这种情况下,诚实的默认立场是:空检索结果只是“不存在”的微弱证据,而非有力证据。有力证据需要工具主动提供关于范围(scope)、新鲜度(freshness)和权威性(authority)的声明。
修复方案繁琐且大多枯燥乏味:重写工具的返回结构、教导智能体理解范围和新鲜度元数据、增加调度层防护以在证据薄弱时拒绝叙述否定性结论、培训评审人员像 审计正面主张一样仔细地审计否定性结论。这看起来不像是在会议演讲中会出现的 AI 工程。但另一种选择——即发布那些被允许将“沉默”转化为“证词”的流利智能体——正是目前一类大型、隐蔽且带有“置信度洗钱”性质的生产事故赖以产生的基石。这些智能体听起来言之凿凿,实则不然。修复工作始于工具契约(tool contract),并始于拒绝让“无结果”等同于“绝无此事”。
- https://arxiv.org/html/2509.18970v1
- https://medium.com/@eyosiasteshale/the-refresh-trap-the-hidden-economics-of-vector-decay-in-rag-systems-f73bc15aa011
- https://en.wikipedia.org/wiki/Evidence_of_absence
- https://en.wikipedia.org/wiki/Argument_from_ignorance
- https://pmc.ncbi.nlm.nih.gov/articles/PMC10065758/
- https://workos.com/blog/ai-agent-access-control
- https://auth0.com/blog/access-control-in-the-era-of-ai-agents/
- https://www.okta.com/blog/ai/ai-agent-authorization-gap/
- https://apxml.com/courses/optimizing-rag-for-production/chapter-7-rag-scalability-reliability-maintainability/rag-knowledge-base-updates
- https://towardsdatascience.com/hnsw-at-scale-why-your-rag-system-gets-worse-as-the-vector-database-grows/
- https://virtasant.com/ai-today/ai-customer-service-agents-context-loss
- https://link.springer.com/chapter/10.1007/978-3-031-68323-7_34
- https://www.mindstudio.ai/blog/ai-agent-failure-pattern-recognition
