基于 LLM 的智能体可以完成很多任务。或者说,至少它们表面上能完成。例如,它们会写代码、总结论文、规划旅行、填写表格。如果你向其中一个询问概率或置信度分数,它也会给你一个。我见过许多智能体设计者用这种方式让 LLM 生成置信度分数。问题在于,没有充分的理由去相信这个数字。本文要讨论的是,为什么我们不能依赖 LLM 来生成置信度分数。

置信度意味着什么

在理解为什么 LLM 无法给出可信的置信度分数之前,我们需要先理解置信度真正意味着什么。

例如,设想一位天气预报员说:“我 70% 确信明天会下雨。”

预报员在预测明天会下雨。70% 是他们对这一预测的确信程度。明天要么下雨,要么不下雨,而他们今天有多确信,取决于他们所掌握的信息。

他们的置信度来自所使用的信息。其中一些是关于明天的:气压、湿度、风以及雷达上的云层。另一些来自过去:多年的天气记录,以及在看起来像今天这样的日子之后下雨的频率。他们掌握的信息越多,且信息越强烈地指向某个方向,他们的置信度就越接近 100% 或 0%。

理论上,把这些信息转化为置信度是一个计算过程,而非主观意见。假设这个计算可以用一条假想规则来表示。你从过去告诉你的信息出发,再用关于明天的信息去更新它。如果两位预报员拥有完全相同的信息,并且都正确地应用了这条规则,他们必然得出完全相同的置信度。当预报员意见不一致时,是因为他们掌握的信息不同,或者其中一人把规则应用错了。

现在假设有人问预报员两周后某一天的情况。他们对那一天还没有任何信息。他们拥有的只有过去。假设在这个季节,大约 30% 的日子会下雨。那么他们能说的最好的话就是“我有 30% 的把握会下雨。”随着那一天越来越近,他们获得的信息越来越多,他们的信心可能会上升到接近 100%,也可能下降到接近 0%。

我们如何衡量置信度分数的准确性

现在我们知道了置信度意味着什么,接下来看看如何判断一个置信度分数是否准确。

单独一天无法说明预报员的 70% 是否正确,因为要么下雨了,要么没下。我们只能在许多天里检验他们的置信度。

取出预报员说他们有 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%。他们使用了信息,而且仍然是校准的。

还有一个条件,而且很容易被忽略。要做到这一切,必须有人记录下每一个预报以及实际发生的情况。没有这份记录,就无法知道一个置信度分数是否准确。

所以,一个你可以依赖的置信度分数需要两样东西:

  1. 它反映了预测所依据的信息量。
  2. 它已经在同类问题上对照实际发生的情况进行了检验。

LLM 如何给出置信度分数

LLM 一次生成一个 token 的文本。每个 token 都是基于它之前的 token 来选择的。这就是“自回归”的含义。例如,当你问“你有多确定?”时,答案“0.85”并不是从模型内部的某个仪表上读出来的。模型是一个 token 一个 token 地把它写出来的,就像它写任何其他文本一样。“0.85”是对话的一种合理延续。它不是对任何事物的测量。

用上一节的术语来说,这个数字两个属性都不具备。它并不反映模型掌握了多少信息,因为它是文本的延续,而不是对证据的总结。而且它从未经过校准。预训练确实会依据结果给模型打分,但结果是文本的下一个 token。所以模型在某种程度上是针对“接下来是什么文本?”这个问题校准过的。它从未因所写出的置信度是否与它正确的频率相符而被评分。模型学到的是置信度分数在文本中长什么样。它没有学会让自己的分数与准确率相匹配。

这带来了一些后果,你可以自己看到:

  • 再问一次,数字就会变。例如,同一个问题一次可能得到 0.85,下一次得到 0.7。信息没有变,所以如果模型是在应用某条规则,置信度也不会变。
  • 改变措辞,数字就会变。例如,如果你问“你确定吗?”,分数通常会变化,即使问题本身没有任何不同。不同的措辞并不是新信息。
  • 数字之前的文本决定了这个数字。例如,如果模型已经写出了“这显然是正确答案”,那么高分就是自然的延续。分数来自文字,而不是来自证据。

模型总会给你一个数字。它看起来会很精确。而且,就像我上一篇帖子中对论文的总结一样,错误的数字看起来和正确的数字一模一样。只有把大量数字对照答案键进行评分,你才能知道这些数字是否可信。大多数向 LLM 索要置信度分数的人并不会这么做。

在没有 LLM 的情况下衡量置信度

如果我们不能向 LLM 询问它的置信度,那该从哪里获得?我们可以像预报员那样做:建立一条把信息转化为置信度的规则,并持续用实际发生的情况来检验它。LLM 仍然可以完成任务,比如撰写答案。但置信度分数来自规则,而不是来自 LLM。

例如,设想一个智能体通过搜索帮助中心并撰写回复来回答客户支持问题。我们希望为每条回复给出一个置信度分数,以便把不确定的回复在发送前转交给人工处理。

1. 选择信息。列出我们能在每条回复上观察到的东西,而不去问 LLM 它感觉如何。搜索是否找到了关于该主题的文章?找到了几篇?这是该智能体以前回答过的问题类型吗?如果我们把同一个问题问智能体两次,两条回复是否一致?这就是该智能体版本的气压、湿度和风速。

2. 从过去开始。在我们拥有任何其他数据之前,最好的置信度就是通常的比率,就像对两周后的天气预报一样。如果一个人检查了 200 条过去的回复,其中 150 条是正确的,那么每条回复的起始置信度就是 75%。

3. 记录每条回复以及实际发生的情况。对每条回复,保存第 1 步中的信息、规则给出的置信度,以及该回复最终是否正确。如果审核者批准了该回复,或者客户不必再次询问,那么该回复就是正确的。这就是前面几节所说的我们需要的记录。

4. 根据记录更新规则。按信息把过去的回复分组,看看每个分组的正确频率。如果带有匹配文章且两条答案一致的回复有 95% 的时间是正确的,那么规则对下一条类似的回复就应该给出 95%。如果未找到匹配文章的回复只有 40% 的时间是正确的,规则就应该给出 40%。起初,分组很小,规则也很粗糙。随着数据增多,分组会变大,规则也能利用更多信息。

5. 持续检查。每隔一周左右,制作一张与我们为预测器所做的相同的表格:对于每个置信度水平,回复正确的频率是多少?如果 90% 置信度的回复只有 70% 的时候是正确的,那么这条规则就是过度自信的,而新的记录会显示如何修正它。

像这样的规则具有 LLM 给出的数字所不具备的性质。相同的信息总是给出相同的置信度。置信度取决于信息,而不是措辞。而且它是在我们自己这类问题上校准的,因为它是从我们自己的记录中构建出来的。它还会随着我们的使用而变得更好,因为每一次回复都会为记录增添内容。

不过,这条规则的好坏取决于记录。如果没有人检查回复是否正确,就没有可供学习的东西,我们又回到了一个没有人测量过的数字。