上一篇的投票器只看答案,不看模型講得多有把握。今天替每條推理軌跡加上一個信心分數,再看看這個看似合理的改動會出什麼事。
先說結論:正向信心加權確實可能大幅贏過多數決,但它沒有免費的安全保證。信心和正確性一旦反向,原本只是「很有自信地答錯」的軌跡,會直接變成票數放大器。
沿用上一篇的答案正規化流程,我把一條軌跡縮成兩個欄位:最後答案和信心。信心先限制在 0 到 1;它可以來自模型自報,也可以由 token log probability 整理而成。
from dataclasses import dataclass
@dataclass(frozen=True)
class Trace:
answer: str
confidence: float
def __post_init__(self) -> None:
if not 0.0 <= self.confidence <= 1.0:
raise ValueError("confidence must be between 0 and 1")
這裡先故意不討論「0.8 到底準不準」。第三篇的目標很窄:假設手上已經有這個數字,最直覺的加權會發生什麼事?
對題目 q 的候選答案 a,我先用下面這個分數:
c 是單條軌跡的信心,β 控制加權強度。β=0 時,每一票的權重都是 1,結果退回上一篇的 Self-Consistency。β 越大,高信心票和低信心票的差距就越明顯。
式子裡減掉 1/2 只是把指數中心移到 0。所有票都乘上同一個常數,不會改變最後的贏家,數值卻比較好讀。
程式碼不長。我仍然把平手保留下來,沒有偷偷選字典序最小的答案。
from collections import defaultdict
from math import exp, isclose
def confidence_vote(
traces: list[Trace],
beta: float = 3.0,
) -> tuple[list[str], dict[str, float]]:
if not traces:
raise ValueError("traces must not be empty")
scores: dict[str, float] = defaultdict(float)
for trace in traces:
weight = exp(beta * (trace.confidence - 0.5))
scores[trace.answer] += weight
best = max(scores.values())
winners = sorted(
answer
for answer, score in scores.items()
if isclose(score, best, rel_tol=1e-12)
)
return winners, dict(scores)
假設 A 有三條軌跡,信心分別是 0.55、0.52、0.50;B 只有兩條,信心卻是 0.95、0.92。普通多數決會選 A。
traces = [
Trace("A", 0.55),
Trace("A", 0.52),
Trace("A", 0.50),
Trace("B", 0.95),
Trace("B", 0.92),
]
winners, scores = confidence_vote(traces, beta=3.0)
print(winners)
print({k: round(v, 2) for k, v in scores.items()})
輸出會是:
['B']
{'A': 3.22, 'B': 7.38}
如果正確答案是 B,這次翻盤很漂亮。若正確答案其實是 A,加權就把兩條高信心錯誤放大到足以推翻三票。光看投票結果,分不出是哪一種情況。
我另外跑了 5,000 題二元答案的玩具模擬。每題取樣 16 次,單條軌跡答對的機率設為 0.55。三組實驗共用完全相同的正誤票,只改信心的生成方式:正確軌跡信心較高、兩邊沒有差別,以及錯誤軌跡信心較高。
亂數種子固定為 1317,β=3,結果如下:
Self-Consistency 0.649
信心方向正確 0.914
信心沒有方向 0.640
信心方向相反 0.240
這組數字是壓力測試,不能當成真實模型的成績。它把同一個機制的兩面攤得很清楚:方向對時,加權能救回不少被票數壓住的正確答案;方向反了,原本的少數錯誤反而得到更大的聲量。
沒有方向的那組也略低於多數決。原因不神祕,隨機信心仍會改動接近票,有限樣本下自然可能換掉原本的贏家。即使平均而言信心毫無資訊,任意加權也不等於「做了沒差」。

圖:四種對抗信心條件的固定預算測試。信心加權在部分條件能接近 oracle,但遇到異質訊號時也可能明顯輸給 SC;因此不能預設高信心一定值得加票。
模型自報的 0.9 常常擠成一團,不同提示詞也會讓整條尺度平移。Token log probability 比較貼近模型內部的生成機率,但它描述的是某段文字多容易被生成,不能直接當成整條推理正確的機率。
跨題比較更麻煩。某題的 0.7 可能已經是該題最高值,另一題的 0.7 卻落在中間。直接把原始數字塞進指數,等於假設所有題目共用同一把尺;目前還沒有證據支持這個假設。
下一篇會先處理尺度問題。我會把每題內的信心改成排名,再轉成 van der Waerden 常態分數。這樣保留「同一題裡誰比誰有把握」,同時減少不同題目、不同模型信心刻度不一致的影響。
論文預印本:TACT: Trust-Anchored Confidence Tempering for Self-Consistency Voting in Large Language Models