让 LLM 做置信度评分是个坏主意
基于大语言模型(LLM)的智能体(Agent)能够完成大量任务。或者说,至少它们看起来能完成。例如,它们可以写代码、总结论文、规划旅行以及填写表格。如果你让它给出一个概率或置信度分数,它也能给你一个。我看到许多智能体设计者就是这样利用 LLM 来生成置信度分数的。问题在于,我们没有任何理由去相信这个数字。这篇文章将探讨为什么我们不能依赖 LLM 来生成置信度分数。
置信度的含义
在理解为什么 LLM 无法提供可信的置信度分数之前,我们需要先弄清置信度到底意味着什么。
举个例子,想象一位天气预报员说:“我有 70% 的把握明天会下雨。”
这位预报员在预测明天会下雨,而 70% 是他对这个预测的确信程度。明天要么下雨,要么不下雨,而他今天的确信程度取决于他掌握了哪些信息。
他的置信度源于他所使用的信息。这些信息一部分关于明天:气压、湿度、风向以及雷达上的云层情况;另一部分来自过去:多年的气象记录,以及过去那些与今天天气相似的日子里,下雨发生的频率。掌握的信息越多,且这些信息指向同一方向的确定性越强,他的置信度就越接近 100% 或 0%。
理论上,将信息转化为置信度是一个计算过程,而非主观意见。假设这个计算过程可以用一个假设性的规则来表示。你从过去的信息出发,再结合关于明天的信息来更新它。如果两位预报员拥有完全相同的信息,并且都正确应用了这一规则,他们得出的置信度必须完全一致。当预报员之间存在分歧时,要么是因为他们掌握的信息不同,要么是因为其中一方错误地应用了该规则。
现在假设预报员被问及两周后的天气。他尚未掌握那天的任何信息,只有过去的历史数据。假设在这个季节,约有 30% 的天数会下雨。那么,他能给出的最佳预测只能是:“我有 30% 的把握那天会下雨。”随着日期临近,他会获得更多信息,其置信度也会相应地向 100% 攀升或向 0% 下降。
如何衡量置信度分数的准确性
既然了解了置信度的含义,让我们来看看如何判断一个置信度分数是否准确。
仅凭一天无法判断预报员所说的70%准确率是否属实,因为结果只有下雨或不下雨两种可能。我们只能长期观察,才能检验其置信度的可靠性。
统计所有预报员称下雨概率为70%的日子。如果其中约70%确实下雨,说明该置信度准确;若只有40%下雨,则说明其过于自信;若有90%下雨,则说明其信心不足。每个置信等级都可以这样验证。假设这是预报员一年的记录:
| 预报值 | 天数 | 实际下雨天数 | 比率 |
|---|---|---|---|
| 10% | 120 | 13 | 11% |
| 30% | 90 | 26 | 29% |
| 70% | 80 | 57 | 71% |
| 90% | 75 | 67 | 89% |
在各等级上,实际降雨比率都接近预报值。当置信度与实际比率如此吻合时,称其校准良好。这也体现了预报员遵循规则的程度。
仅靠校准还不够。一个无视次日天气、总是报告30%(即该季节常态比率)的预报员同样校准良好。一年内,其报告30%的那些日子中,约30%会下雨。但由于他们从未利用次日天气信息,其置信度毫无参考价值。表格中的预报员表现更好,因为其多数日子的预报值集中在10%或90%附近。他们利用了信息,且依然保持校准。
还有一个容易忽略的前提条件。要实现上述任何一点,必须有人记录所有预报及实际结果。没有这份记录,就无法判断置信度是否准确。
因此,可靠的置信度评分需要满足两点:
- 反映预测所依据的信息量。
- 在同一类问题上,经过实际结果的校验。
LLM 如何给出置信度评分
LLM 逐个生成文本,每个词元的选取都依赖于它前面已生成的词元。这正是“自回归”的含义。举个例子,当你问“你有多确定?”时,得到的“0.85”并非读取自模型内部某个仪表盘。模型只是逐个词元地写下这个数,与书写其他文本的方式无异。它只是对话中一个合乎情理的后续,而非任何事物的度量。 沿用上一节的术语来说,这个数字不具备上述任一属性。它并不反映模型掌握了多少信息,因为它是文本的延续,而非对证据的总结。它也从未经过校准。预训练阶段确实会将模型与结果进行评分,但这里的“结果”是指下一个文本词元。因此,模型在一定程度上被校准以回答“接下来是什么文本?”这个问题,却从未就其写出的置信度是否与实际正确率相符进行过评分。模型只是学会了文本中置信度分数的样子,并没有学会让自己的分数与实际准确率保持一致。 这会带来一些你可以亲身观察到的后果: * 再问一次,数字就会变。例如,同一个问题,一次得到 0.85,下次可能变成 0.7。信息本身并没有变化,如果模型是在执行某种规则,置信度理应保持不变。 * 换种措辞,数字也会变。例如,若你问“你确定吗?”,分数通常会移动,尽管问题本身没有任何不同。措辞的改变并不构成新信息。 * 数字之前的文本决定了这个数字。例如,如果模型已经写出了“这显然是正确答案”,那么一个高分数就是自然的延续。分数源于文字,而非源于证据。 模型总会给你一个数字。它看起来很精确。就像我在 上一篇文章 中提到的论文摘要一样,一个错误的数字和一个正确的数字看起来别无二致。只有通过将大量数字与标准答案进行比对评分,你才能判断这些数字是否可信。但大多数人向 LLM 索取置信度分数时,并不会这样做。不依赖 LLM 来测量置信度
如果无法让 LLM 直接输出置信度,我们从哪里获取它?方法可以借鉴预报员的做法:制定一条将信息转化为置信度的规则,并不断拿它与实际结果对比。LLM 依然可以执行任务,比如生成回答,但置信度分数由规则计算得出,而非来自 LLM 本身。
举个例,假设有一个用于客服场景的 Agent,它通过搜索帮助中心并撰写回复来解答用户问题。我们需要为每条回复生成一个置信度分数,以便将那些不确定的回复在发送前转交给人工处理。
1. 选定信息来源。列出我们在不询问 LLM “感觉如何” 的前提下,能观察到的关于每条回复的各项特征。搜索是否找到了相关主题的文章?找到了几篇?这类问题是否属于 Agent 曾经回答过的类型?如果对同一个问题提问两次,两次回复的内容是否一致?这些就是 Agent 版本的“气压”、“湿度”和“风速”。
2. 以历史数据为起点。在缺乏其他数据时,最好的置信度基准是常规正确率,就像预测两周后的天气一样。如果人工抽检了 200 条历史回复,其中 150 条是正确的,那么每条回复的初始置信度应设为 75%。
3. 记录每条回复及其结果。对于每条回复,保存第一步中提到的各项信息、规则给出的置信度,以及该回复最终是否准确。如果审核员批准了该回复,或者用户无需再次提问,则视为正确。这就是前文提到的需要建立的数据记录。
4. 根据记录更新规则。按信息特征对历史回复进行分组,观察每组中的正确率。例如,如果“有匹配文章且两次回答一致”的回复正确率为 95%,那么规则应对此类新回复赋予 95% 的置信度;如果“无匹配文章”的回复正确率仅为 40%,规则则应给出 40% 的置信度。初期数据量少,分组较小,规则也较为粗糙。随着数据积累,分组变大,规则便能利用更多信息进行优化。
5. 持续校验。大约每周一次,像对预报员那样制作一张表:在各个置信度区间内,回复的实际正确率是多少?如果置信度为 90% 的回复实际正确率只有 70%,说明规则过于自信,而新的记录将指导我们如何修正这一偏差。
这样的规则拥有 LLM 给出的置信度所不具备的特性。相同的信息始终对应相同的置信度;置信度取决于信息本身,而非表述方式。由于它是基于我们自身的记录构建的,因此天然契合我们这类问题的分布,实现了校准。随着使用,它的表现还会越来越好,因为每一次回复都会补充到记录中。
不过,规则的上限取决于记录的质量。如果没人去核实这些回复是否正确,就没有数据可供学习,我们依然停留在一个无人度量过的“数字”上。