如何解决幻觉问题(使用RLCD)
摘要
文章解释了如何通过使用概率分布和校准来量化不确定性,而不是依赖不可靠的置信分数,以解决大型语言模型中的幻觉问题。
<p><a href="https://lobste.rs/s/kolgwk/how_solve_hallucination_with_rlcd">评论</a></p>
查看缓存全文
缓存时间: 2026/09/28 15:50
# 如何解决幻觉问题——罗伯特·W
来源:https://www.robw.fyi/2026/09/28/how-to-solve-hallucination/
询问大语言模型对某事有多大把握时,它给出的数字往往基于一种模糊的“直觉”。“我大概有90%的把握”这样的回答,与其生成其他内容的下一个词元预测机制如出一辙。这里的“90”只是一个词语选择,而非实际测量值——即使对虚构的内容,它也会同样自信地报出这个数字。
试看这个例子。给大语言模型提供近几天的天气数据,要求它预测明天的天气:
``
{
"09/27/2026": 59, // 日期与华氏温度
"09/26/2026": 57,
"09/25/2026": 64,
"09/24/2026": 63
}
``
最直接的方式是让模型预测具体数值,同时询问它的把握程度:
``
llm.generate(
prompt: "基于过去4天的温度,预测明天的气温:" + weather,
schema: {
"date": string,
"temperature": number,
"confidence": string
}
)
// => { "date": "09/28/2026", "temperature": 60, "confidence": "about 90%" }
``
60度,90%把握度。听起来不错。但追问这个“90”从何而来——这次调用并没有为模型提供任何衡量确信度的方法;它产生“约90%”的方式与生成“60”度相同,都是通过预测“自信的预报员接下来会怎么说”。其真实的不确定性来自两方面:一是模型掌握的数据量和先验知识量,称为**认知不确定性**(https://en.wikipedia.org/wiki/Uncertainty_quantification);二是未来本身固有的不可预测性,称为**偶然不确定性**(https://en.wikipedia.org/wiki/Uncertainty_quantification)。前者会随历史数据积累而减少,后者则永远存在。假设模型只有一天的历史数据,且那天恰好是异常高温日,那么模型对明天的预测应该非常不确定,但它仍会输出“约90%”这样的表述。
描述不确定性的标准语言是概率分布。与其要求预测单一温度,不如让模型涵盖该地区有记录以来的所有温度范围,划分区间,并为每个区间分配概率。这些概率之和为1,共同构成关于明日温度的概率分布。自信的模型会将大部分概率集中在一两个区间,而不确定的模型则会使概率分散。
``
// 每10华氏度一个区间,覆盖所有历史记录温度
llm.generate(
prompt: "昨日气温95°F。预测明日的最高气温。",
schema: {
"30-39": probability,
...
"100-109": probability
}
)
// => { "50-59": 0.20, "60-69": 0.30,
// "70-79": 0.22, "80-89": 0.15, ... }
``
明日最高气温预测分布示意图(每个10°F区间对应一个概率):30多度1%,40多度4%,50多度20%,60多度30%,70多度22%,80多度15%,90多度7%,100多度1%。各柱状概率总和为100%。预测分布只是模型对世界的一种陈述。要验证它,我们需要真实的分布:在所有模型做出相同预测的日子里,明日实际最高气温落入各区间的频率。我们并非评判模型对明日预测是否正确——因为未来本质上无法完全预测。我们是在评判模型对自身把握程度的**诚实度**。**校准良好**的模型,其预测概率与实际结果相符:例如,在所有它给“60-69°F”30%概率的日子里,确实约有30%的日期落在此区间。**过度自信**的模型会将概率集中在少数区间,而实际结果分布更广。**信心不足**的模型则分散预测概率,而实际结果往往集中。即使校准良好的模型仍会经常出错,但当它声称对某个结果比另一个更有把握时,你可以相信这个数字。
校准曲线图展示了模型声称的把握度与实际正确率的关系(虚线为完美校准的对角线)。低于50%置信度时,曲线位于对角线上方(信心不足区):当模型声称25%概率时,实际正确率为38%。高于50%时,曲线位于对角线下方(过度自信区):当模型声称75%概率时,实际正确率仅为62%。那么RLCD如何教会模型做到这点?方法与预报员的学习过程相同:通过将预测与实际结果进行对比。模型做出预测后,会尝试生成几个略有差异的版本:一个对“60多度”区间更确信,一个偏向更暖的温度,等等。次日实际最高温为70多度。每个版本根据它给“70多度”区间分配的概率得分;给实际发生事件分配的概率越高,得分就越高。模型会向超越平均水平的版本靠拢,远离表现不佳的版本,如此在成千上万个问题中重复迭代。
巧妙之处在于得分机制本身。总是表现得很确信的模型,一旦出错就会受到重罚。总是含糊其辞的模型,即使正确也得不到高分。要在大量问题中最大化得分,唯一的办法就是给出**恰好合理的把握度**:如果某事发生概率为60%,那么说60%能获得最高分,说40%或90%都不如它。因此模型不只是在学习如何正确,更在学习如何**诚实表达自己的正确概率**。以这种方式训练的Laya模型报告(https://dev.to/nandakishor_m_6cc0adfde9f/i-built-non-autoregressive-decision-models-a-year-ago-then-a-frontier-lab-called-it-a-18me)称,其自述的置信度平均偏差约为6个百分点。
平均对数得分奖励与模型对事件真实发生概率(60%)的分配概率关系曲线图。当模型给出60%时,奖励达到峰值-0.67。给出40%(保守)时平均为-0.75,给出90%(高估)时平均为-0.98。一旦概率得到校准,你就可以对其进行数学计算,而非仅凭直觉判断。未校准模型给出的“90%把握”只是一种措辞选择。而校准后的90%是一个你可以直接输入**期望值**(https://en.wikipedia.org/wiki/Expected_value)计算的数值。
为了用实际决策而非温度区间来说明这一点,设想将JEV作为预报员。给它提供某支股票的近期价格走势、期权流动和新闻,并要求它给出校准后的明日收盘价分布预测。
``
from typesafe_sdk import Choice, TypeSafeClient
client = TypeSafeClient()
response = client.system_one(
state="NVDA今日收盘价$180。过去5个交易日的价格走势、期权流动及新闻。",
questions={
"closing_range": Choice(
instructions="NVDA明日收盘价将落在哪个区间?",
criteria={
"165-170": "收盘价在$165至$170之间",
"170-175": "收盘价在$170至$175之间",
"175-180": "收盘价在$175至$180之间",
"180-185": "收盘价在$180至$185之间",
"185-190": "收盘价在$185至$190之间",
"190-195": "收盘价在$190至$195之间",
"195-200": "收盘价在$195至$200之间",
},
),
},
)
probabilities = response.answers["closing_range"].probabilities
# => {"165-170": 0.05, "170-175": 0.13, "175-180": 0.20,
# "180-185": 0.28, "185-190": 0.20, "190-195": 0.09, "195-200": 0.05}
``
NVDA收盘价为$180,因此“上涨”意味着价格落入高于该值的区间。将这些区间的概率相加,即可将整个分布压缩为凯利公式所需的一个数值:
``
p = sum(probabilities[b] for b in ["180-185", "185-190", "190-195", "195-200"])
# => 0.62
``
这个0.62只有在JEV经过类似RLCD的训练方式时才有意义;否则它只是一个听起来自信的数字。如果它是校准过的,我们可以直接将其输入**凯利准则**,该准则将“62%的概率上涨”转化为“如果参与交易,应投入账户资金的多少比例”:
``
def kelly_fraction(p, b=1):
return p - (1 - p) / b
kelly_fraction(0.62)
# => 0.24 → 买入,仓位为资金的24%
kelly_fraction(0.52)
# => 0.04 → 买入,仓位为资金的4%(勉强值得参与)
kelly_fraction(0.48)
# => -0.04 → 负凯利值:不买入,JEV自身的概率表明无优势
``
校准后的概率决定了某个选择是否值得行动,以及投入多大的力度。失去校准,你便没有可靠的方法来确定下注比例,或判断何时该保持观望。
因此我进行了实际测试。我将NVDA过去八个交易日的实际OHLCV数据(周五收盘价$225.07)输入JEV,添加了开放式尾部区间以确保覆盖所有可能的收盘价,并提出了同样的问题:
概率总和在所有运行中都精确等于1.0,且不同运行间答案几乎不变。但观察其分布形状:JEV将95%的概率集中于以周五收盘价为中心的一个5美元区间内。NVDA过去50个交易日的实际日波动率为2.46%,约为每日5.54美元,因此该区间理应分配约30%的概率。以下是JEV分布与经验分布(仅基于过去49个交易日收益率应用于周五收盘价)的对比:
区间 JEV 经验值(过去49天) 对数正态拟合
低于210 0% 0% 0%
210-215 0% 4% 2%
215-220 0% 12% 13%
220-225 5% 31% 30%
225-230 95% 27% 33%
230-235 0% 24% 17%
235-240 0% 0% 4%
240-245 0% 2% 1%
245及以上 0% 0% 0%
这正是校准曲线图中显示的过度自信形态:概率集中于单个区间,而实际结果分散在四个区间。将其代入相同计算,会得到p_up = 0.95,凯利比例为0.90,即建议将90%的资金押注于一个历史上胜率约为53/47的硬币。这个数字听起来很自信,但对此问题而言它是**未校准的**。这正是关键点:RLCD提供的校准覆盖的是模型**训练时所用的分布**,而次日的NVDA收盘价显然不在其中。你无法将JEV微调到你的领域——它是个封闭的API模型。但你可以使用像Laya这样的开源模型(https://github.com/NandhaKishorM/laya#fine-tuning),用自己的实际结果对其进行RLCD后训练——使用相同的“预报员-检验天气”循环——直到其概率针对你实际提出的问题完成校准。一个决策模型需要逐步赢得被接入凯利公式的资格,而你检验它是否合格的方法,与检验天气预报员完全相同:根据实际发生的结果进行评分。
简言之,校准正是将模型的把握度从一种**直觉**转变为**控制信号**的关键。这正是RLCD真正训练的内容:不是答案本身,而是与之关联的**数字的诚实度**。一个说60%且60%时间正确的模型,可以接入期望值计算、凯利公式或任何需要明确信任程度的下游决策。而一个说95%但只有30%时间正确的模型,无法接入任何系统;你只能回到凭直觉判断。正如NVDA测试所示,这种诚实度仅能达到训练数据所覆盖的范围,因此能够在开源模型上亲自运行该循环,其重要性与循环本身不相上下。
相似文章
关于幻觉率
本文讨论了前沿的LLM模型如何在降低幻觉率方面取得进展,并认为人类也经常产生幻觉,建议我们应该更多地信任先进的AI模型,同时保持批判性思维。
从架构到输出:大型语言模型中幻觉的结构根源及数据的放大作用
本文分析了大型语言模型中的幻觉,将其视为三个架构决策的结构性后果:自注意力的共现学习、最大似然估计训练目标以及自回归解码的左到右承诺。它将每种机制映射到特定的幻觉类型,并论证了数据集病态会放大但不会导致这些脆弱性。
MLLMs 在信息分布偏离协同头时产生幻觉
本文提出了HEAL,一种通过因果干预和反事实分析来分析和校准协同头中信息分布的方法,以减轻多模态大型语言模型中的幻觉。
HalluSAE:利用稀疏自编码器检测大型语言模型中的幻觉
北京航空航天大学等机构的研究人员提出了HalluSAE,这是一个结合稀疏自编码器与相变理论的框架。该框架通过将生成过程建模为穿越势能地形的轨迹,来检测大型语言模型(LLM)中的幻觉,并精准定位发生事实性错误的关键过渡区域。
使用分流解码的大语言模型幻觉检测
本文提出分流解码(diversion decoding)方法,通过在解码阶段主动挑战模型响应来提取特征,训练不确定性启发式模型,从而检测大语言模型中的幻觉,实现了更优的性能和更低的计算复杂度。