跳到主要内容

弃权作为一种路由决策:为什么“我不知道”应该属于路由层,而不是提示词

· 阅读需 12 分钟
Tian Pan
Software Engineer

大多数团队通过在系统提示词中加入一句话来处理弃权(abstention)问题:“如果你不确定,就说你不知道。”模型偶尔会遵守,但经常不遵守,而且这种失败模式是不对称的。一个自信的错误答案会以全速发布——它直接落入用户手中,在 Slack 讨论串中被引用,在下游摘要中被采纳。而一个诚实的弃权则会触发客户成功(CS)升级,因为用户期望智能体处理请求,而现在必须有人解释为什么它没有处理。六个月后,团队已经了解到哪种失败的发布成本更低,而那个名义上控制弃权的系统提示词修改,已经被悄悄地调整为倾向于顺从,而非诚实。

解决这个问题的准则不是寻找更好的措辞。而是要认识到,弃权是一个路由决策,而不是一种提示词模式。它理应拥有一个一等公民级别的输出通道、自己的 SLO、自己的评估套件,以及在系统拓扑中的独立位置——位于提示词之外,可以被测试、维护和扩展。

如果你把弃权放在提示词里,你就是把行为契约放在了技术栈中唯一没有契约执行的地方。提示词是模型随机解释的一个字符串;而路由器是一段具有类型签名的代码。这两者之间的选择,本质上与你的团队多年前决定停止将业务规则放入存储过程(stored procedures)时的选择是一样的。

悄悄重新调整提示词的不对称性

自信的错误答案和诚实的弃权在你的参与度指标中看起来是一样的:两者都是“智能体生成了输出,用户继续操作”。但在长尾效应中,它们分道扬镳了。一个自信的错误答案可能会在客户的邮件草稿、合同条款或已部署的配置中存在数周,然后其成本才会转化为修复工单。而弃权则是立竿见影的——表现为 Zendesk 升级、一个“AI 坏了”的 Slack 讨论串、或是一个 CSAT 分数下降。

行业调查显示,企业级部署的幻觉率超过 15%,估计幻觉相关事件导致的年化损失超过 2.5 亿美元。问题在于,这些损失是分散且滞后的。而弃权的成本则是集中且直接的。对团队激励因素的任何诚实核算都会显示,提示词在每个周期中都在偏离弃权,这不是因为有人决定这么做,而是因为团队在优化他们能看到的指标。

OpenAI 自身对模型为何产生幻觉的分析异常直接:标准的训练和评估奖励自信的猜测,而不是经过校准的不确定性。虚张声势的模型在排行榜上的得分比弃权的模型更高。你的提示词处于该训练目标的下游。告诉一个因猜测而获得奖励的模型开始弃权,从结构上讲,就像告诉一个有业绩配额的销售员把到手的钱留在桌上一样。

为什么提示词是错误的层级

当弃权存在于提示词中时,三个问题会叠加:

  • 无法独立测试。 评估套件衡量模型是否正确处理了可回答的问题。它不衡量模型是否知道 何时不该 回答——即使它衡量了,该指标也会被埋在和其他指标一样的平均值中,因此弃权质量的下降看起来就像噪声。
  • 责任无法明确。 谁拥有提示词,谁就拥有弃权。通常这和负责任务表现的是同一个人。这两个目标是互相权衡的,一个拥有单一指标的负责人会选择能赢得该指标的一方。
  • 无法扩展。 当团队增加第二个路由(例如不同的模型、工具或人工审核员)时,提示词根本不知道这些的存在。提示词中的弃权在构造上就是一个终点状态。模型说“我不知道”,追踪结束,接下来的任何可能性都被丢弃了。

AbstentionBench 是 Meta 最近发布的一个基准测试,涵盖了 20 个数据集中的 35,000 多个无法回答的问题,研究发现弃权是“一个尚未解决的问题,而且扩展模型规模几乎没有用”。在前沿模型中,推理微调(Reasoning fine-tuning)实际上会削弱弃权能力。如果更大、更智能的模型更不擅长识别自己不知道的事情,那么依赖提示词来解决这个问题的团队,正在等待一场该领域已经证明不会到来的免费午餐。

将弃权作为一等公民输出通道

结构性的修复是给弃权一个自己的类型化输出。模型返回的不再是 { answer: string },而是 { answer: string } | { abstain: { reason, missing_information } }。现在,弃权是一个路由器可以观察、记录并据此路由的值,这与“模型返回了一个包含‘我不知道’子字符串的字符串”截然不同。

这一改变解锁了四件事:

  • 独立的评估。 弃权质量可以分解为精确率(当模型弃权时,是否真的无法回答?)和召回率(当输入无法回答时,它是否弃权了?)。两者之间的 F1 分数衡量了校准。AbstentionBench 正是对此进行了规范化。你可以绘制图表,将其作为发布的门禁,并在其发生漂移时察觉。
  • 独立的 SLO。 “过度弃权率低于 5%”和“校准错误的答案低于 2%”是两个不同的数字,对应两种不同的补救措施。前者通过放宽弃权阈值来修复;后者通过收紧阈值来修复。如果没有类型化通道,你无法区分它们。
  • 独立的用户体验(UX)界面。 “我无法回答是因为文档中没有说明”与“我遇到了系统错误”是不同的消息。用户可以针对前者采取行动——他们可以附上文档、完善问题或询问同事。对于后者,他们无能为力。
  • 路由交接。 路由器将 abstain 视为一个信号,而不是终点状态。现在它有了选择。

路由层才是真正的杠杆效应所在

一旦弃权(abstention)成为一种类型化信号(typed signal),路由器就能完成 Prompt 永远无法做到的事情:

  • 升级到不同的模型。 小巧快速的模型选择弃权;路由器则使用更强大的推理模型进行重试。这只在需要处理的那部分输入切片上权衡了延迟和成本,而不是为每一个输入都支付昂贵模型的费用。
  • 升级到工具路径。 “我不知道”可能意味着“我现在还不知道”。在放弃之前,可以路由到检索(retrieval)、代码执行沙箱或结构化搜索。模型的弃权变成了一个工具调用的触发器。
  • 升级到人工。 对于高风险或低置信度的案例,将带有缺失信息上下文的任务移交给人工。行业指南将可持续的人工审核率设定在 10–15% 之间;路由器决定哪部分流量值得消耗这份预算。
  • 向用户提出澄清问题。 有时缺失的信息正是输入本身。Abstain-R1 及类似的 2025 年研究明确训练模型在弃权时识别 缺失了什么,这正是澄清问题路由器所需的信号。

核心点在于,这四条路径在 Prompt 的世界里都不存在。Prompt 的弃权是一个死胡同;而路由器的弃权是一个分叉路口。

对照反事实为弃权定价

一旦弃权变得可观测,你就可以对其定价。真正关键的成本核算不是“我们在每次弃权上花了多少钱”,而是“相比于自信的错误答案这一反事实(counterfactual),弃权为我们节省了多少钱”。

一个合理的模型是:每一次弃权都产生了“规避的补救成本”(即没有发生的客服工单、回滚、客户信任受损),减去“重试成本”(第二次模型调用、人工审核的时间、用户付出的延迟)。当规避成本超过重试成本时,弃权就是净收益。如果不是,说明你的阈值设置得过于激进。

由此产生两个推论:

  • 弃权率不是一个需要最小化的指标。 它是一个需要校准(calibrate)的指标。一个将弃权率降至零的团队,要么已经解决了知识获取问题(他们并没有),要么就是接受了幻觉作为整洁仪表面板的代价(他们确实这么做了)。
  • 正确的阈值是工作流的函数,而非模型的函数。 金融服务的路由可能需要 90–95% 的置信度才能执行;而一个低风险的摘要工作流可能 70% 就足够了。路由器掌握这些数字,而不是 Prompt。当工作流变化时,阈值随之改变 —— 无需重新训练模型。

这与 FinOps 团队应用于缓存命中率和重试预算的逻辑完全相同。弃权只是该电子表格中的下一个列项。

评估弃权质量,而非仅仅是弃权率

支撑该体系的第三根支柱是一个评估框架,它将弃权作为一种独立行为进行评分。值得独立追踪的三个维度:

  • 校准度(Calibration)。 在模型弃权的案例中,实际上有多少比例是无法回答的?在无法回答的案例中,模型捕获了多少比例?
  • 过度谨慎(Over-cautiousness)。 模型在团队认为属于服务范围内的输入上弃权的频率是多少?这是经过全量微调的安全模型臭名昭著的“过度拒绝”故障。
  • 原因质量(Reason quality)。 当模型说它不知道时,它是否以某种下一层(路由器、用户、检索)可以采取行动的方式识别出 缺失了什么?Abstain-R1 明确对此评分;但大多数生产系统并未做到。

这三个数字是独立波动的。一个模型可能校准良好且从不产生过度谨慎,但提供的原因毫无用处 —— 团队只有在下游路由器静默失效时才会察觉,因为每个弃权原因都是“我不确定”。评估框架必须衡量这三个维度,理想情况下是在近期生产流量的分层切片上进行,以便追踪实时分布,而非固化的标准数据集。

这在生产环境中是什么样子的

最小可行方案(MVP)形态:

  • 类型化输出模式(Typed output schema),将 abstain 作为与 answer 并列的辨识联合(discriminated union)分支。在 SDK 边界进行验证,而非通过解析字符串。
  • 一个路由器,根据 abstain 进行分支,并配置了至少两条升级路径(更强的模型、人工队列或工具使用循环)。
  • 答案路径上的置信度信号 —— 不仅仅是弃权与否,还有一个路由器可以设置阈值的评分。选择性预测工作(SelectLLM、保形风险控制、SAFER)为你提供了原则性的校准方法;即使是一个简单的验证器模型也比没有好。
  • 一个弃权仪表盘,将弃权率、校准度、过度弃权和原因质量分开展示。并接入发布门控。
  • 一个成本项,对照反事实补救成本为弃权定价,使权衡对于选择阈值的人员可见。

你会注意到,这些都不存在于 Prompt 之中。Prompt 仍然会说“如果你不知道,请弃权” —— 它只是不再承担核心支撑作用。这种行为由类型化 Schema 强制执行,由路由器观测,由评估衡量,由 FinOps 定价,并在 CI 中进行门控。

架构上的启示

弃权是大多数智能体(Agent)没有构建的最高杠杆功能,因为它通常存在于 Prompt 中 —— 在那里它无法被测试、无法被明确归属、也无法扩展 —— 而不是存在于路由层,在那里它将同时具备这三点。那些将其移出的团队,将不再把“我不知道”视为模型输出的一个字符串,而是开始将其视为系统路由的一个信号。

接下来的 12 个月将进一步推动这一趋势。随着更多团队将智能体组合进多步工作流,那些无法返回清晰弃权信号的智能体将导致下游消费者静默地接受错误答案。随着监管机构收紧对 AI 驱动决策的要求,没有经过审计的弃权 SLO 的团队会发现,“模型说它很自信”并不是一种辩护理由。随着推理成本压力增加,那些在大型模型弃权时能回退到较小模型的路由器,将优于那些为每一次输入都支付大模型费用的路由器。

把它移出 Prompt。给它一个类型。给它一条路径。给它一个指标。然后,问题将不再是“模型今天是否说了足够多次‘我不知道’”,而是“系统对于它能回答什么是否诚实” —— 这最终变成了一个你的工程团队可以用代码回答的问题。

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