不确定性与校准。
你系统里每一条升级规则、每一次路由决策、每一道"交给人"的关卡,都压在一个模型从未被训练去诚实产出的置信数字上——而让它变得健谈可亲的那一步对齐,正是把这个数字弄坏的那一步。有三种不同的信号共用"置信度"这个词,其中只有一种值点钱,而且没有一种是照着你的数据校准好送来的。好消息是:修好它只需要一个带标注的数据集加一个下午,不是一个研究项目——而且你造出来的不是一个拿去显示的数字,而是一个决定智能体何时停手的阈值。
三种不同的信号,共用一个词。
"模型有多确信?"至少有三个机械层面的答案,而它们量的是不同的东西。把它们混为一谈,是大多数置信度 bug 的源头——因为每一种看上去都挺像回事,而只有一种真的跟"答案对不对"有关。
- 令牌概率。模型给自己吐出的每个令牌所赋的概率。它确实有信息量——但那是关于给定前缀下的下一个令牌,而不是关于那个断言是否为真。把一整段的对数概率平均一下,你量到的很大程度上是流畅度:一个写得顺滑的捏造得分很高,一个措辞别扭的正确答案得分很低。它还经常压根拿不到,因为有几家提供商在推理模型上完全不暴露对数概率;而在智能体里,你真正在意的那个决定往往是一次工具调用,而不是一段散文。
- 口头置信度。让模型自己说它有多确信。这是从文本里学来的一种写作风格,不是一次测量:输出会扎堆在整数上、整体偏高,而且你换个问法它就变。它几乎不要钱,所以值得收集——但要把它当成一个需要被校准的弱特征,绝不能当成概率。
- 多次采样之间的一致性。把同一个输入在非零温度下跑 k 次,量一量答案彼此有多一致。这一种的预测力远远甩开另外两种,因为"不一致"是直接证据,说明这个问题正落在模型分布真正散开的地方。它要花 k 倍的钱,而这恰恰是你只把它花在值这个价的决定上的理由。它和自洽性是同一套机器,只是读法不同。
还有第四种信号,常常比上述三种都好,却总被忽略:这个断言是否有据可依。"检索回来的文档真的支撑这句话吗?"是一个可核查、答案还很便宜的问题,而且在所有人最担心的那类失败上,它打败任何内省式的置信度估计。见幻觉与接地。
校准是一个可测量的属性,而后训练会把它毁掉。
一个系统是校准的,当它声称的置信度与它实测的准确率相符:在它说 70% 的所有那些次里,它大约有 70% 是对的。这件事有一个带标注的数据集就能查——按声称的置信度分桶,画准确率对置信度的图,看那个缺口。汇总统计量是期望校准误差,即各桶间两者距离的平均;但图比数字有用,因为图告诉你模型在哪里撒谎。
- 基座模型往往校准得还行,对齐后的模型则不然。OpenAI 就 GPT-4 直接报告过这一点:预训练基座模型的置信度在多选知识题上与其准确率贴合得很紧,而经过后训练与 RLHF 的版本明显更差。这个结果后来被证明是一个普遍模式,而不是某一次发布的怪癖。
- 机制并不神秘。偏好优化奖励的是人类标注者喜欢的答案,而标注者喜欢果断、流畅、听上去有帮助的文字。含糊其辞读起来像回避,于是输掉。你要了一个听起来很笃定的模型,你就得到了一个。这是后训练的一项常态代价。
- 因此你无法从供应商那里继承校准。一个模型带有的任何校准,都是在它的评测分布上的校准,而不是在你的工单、你的文档、你的工具调用 schema 上的。从原始分数到真实概率的那个映射,得由你来拟合。
- 拟合它是件小事。收集几百条带真值标注的结果,然后从原始信号到概率拟合一个单参数的温度缩放或一个保序回归。这是十来行代码,而它决定了你手上是一个可以设阈值的数字,还是一个不能设阈值的数字。
有用的产出是一次弃答,而不是一个百分比。
团队常常花几周改进置信度估计,然后拿它什么也不做——这个顺序反了。想要校准置信度的理由,是为了造一道闸门:低于某个阈值时智能体停下,把任务交给人、交给更强的模型,或交给一条确定性的兜底路径。这个框架——选择性预测——把一个抽象的统计属性变成一个你能定价的决定。
- 先画覆盖率-风险曲线,再在上面挑一个点。扫过阈值,在每个阈值上记录覆盖率(你回答了多大比例的输入)与风险(在这些被回答的里面的错误率)。现在真实的取舍就摆在你面前,而不是一种模糊的感觉。
- 把结果说成一句业务的话。"在把错误率压到 2% 以下的阈值上,我们自动回答 61% 的工单,转出 39%"——这是一句运营负责人能据以行动的话。"我们的期望校准误差是 0.04"不是,而且正是这句话让人们忽视这项工作。
- 弃答得有地方可去。一道通向没人看的队列的闸门,比没有闸门更糟,因为它把一个看得见的错误变成了一次看不见的延迟。先定目的地——见人在回路——然后再去调阈值。
- 三种结局优于两种。回答、升级,以及带着理由拒绝,是三件不同的事,而第三件往往是最诚实的那件:"我没能找到覆盖此种情形的条款"对所有人都比一个含糊的答案或一次无声的移交更有用。把它做成结构化输出里的一个字段,好让下游代码能据此分支。
- 阈值是按任务定的,不是全局的。你允许智能体回答一个账单问题的置信度,和你允许它发起一笔退款的置信度,是两个不同的数字,因为出错的代价不同。一个全局阈值意味着你按最危险的动作设了它,然后在其他所有地方用覆盖率买单。
它在一个运行中的智能体里长什么样。
在生产里,置信信号很少只有一种。便宜的那版到处跑,贵的那版只在赌注值当的地方跑,而两者喂给同一个校准过的阈值。
- 用便宜信号做升级筛选,用昂贵信号做确认。先用一个低成本特征——接地检查、口头置信度、一个用你自己轨迹训练的小分类器——挑出那一小部分值得重采样的运行,再对它们用采样一致性。这样你能以远低于 k 倍的代价拿到接近 k 次采样的准确度,形状与模型路由一致。
- 也要校准你的裁判。如果有个 LLM 在给你的智能体输出打分,那个裁判有着一模一样的过度自信问题,在你据其设闸之前它需要同样的处理——如果裁判要决定任何事,裁判校准就不是可选项。
- 每次换模型都要重新校准。在某个模型版本上拟合出的校准不会迁移到下一个版本,而供应商侧一次静默更新会在不通知你的情况下把它挪走。把重校准这一步加进模型退役与迁移的检查清单,并在你的提示词发生实质变化时重跑一遍。
- 克制住把这个数字显示出来的冲动。屏幕上的一个置信百分比,等于邀请用户去做本该由你的代码做完的算术,而且它读起来像一种这个估计并不具备的精确。用它来路由;给用户看证据。UX 上的论证在为信任而设计。
在做任何精巧的事情之前,先做那个一下午就能做完的版本:取 200 条你已知真实结果的已完成运行,用你手上现有的任何信号给每条打分,按分数排序,然后沿着这个列表往下延伸并画出错误率。你会找到那个把错误率压在你需要之处的阈值,也会学到它要花掉多少覆盖率。这一张图比对置信度估计本身的任何改进都值钱,因为它才是那个把"模型好像没把握"变成一条你的系统能执行的规则的产物。
相关:评测入门讲带标注的数据集从哪来,智能体评测讲同一个问题在轨迹层面的版本,智能体风险讲为什么一个自信地犯错的智能体才是贵的那个。