引擎:解決LLM置信度失真的Agent決策方案)
1. 為什么LLM的置信度在騙你1.1 一個(gè)讓所有Agent開發(fā)者頭疼的經(jīng)典場(chǎng)景你搭了一個(gè)基于LLM的Agent用戶問(wèn)了一個(gè)問(wèn)題模型洋洋灑灑輸出了一段回答末尾還貼心地附上一句“我有95%的把握”。你信了把結(jié)果直接透?jìng)鹘o下游系統(tǒng)。然后錯(cuò)了。錯(cuò)得離譜。這不是段子這是過(guò)去兩年里幾乎所有做LLM應(yīng)用的人都會(huì)踩的坑。模型說(shuō)“我很確定”的時(shí)候它可能只是在做一場(chǎng)概率分布上的表演。它輸出的那個(gè)“置信度”跟真實(shí)世界的正確率之間隔著一整個(gè)太平洋。我最早意識(shí)到這個(gè)問(wèn)題是在做一個(gè)醫(yī)療問(wèn)答Agent的時(shí)候。模型對(duì)某個(gè)藥品相互作用的判斷給出了“高置信度”的結(jié)論但對(duì)照知識(shí)庫(kù)一查完全反了。從那以后我開始認(rèn)真研究LLM的置信度到底是怎么回事以及有沒(méi)有辦法把它“校準(zhǔn)”到一個(gè)可用的水平。這篇文章要聊的就是這個(gè)問(wèn)題的一個(gè)解法一個(gè)能在33毫秒內(nèi)完成概率校準(zhǔn)的引擎。它不訓(xùn)練模型不改模型結(jié)構(gòu)而是在推理輸出之后做一層輕量級(jí)的概率修正。核心思路來(lái)自RLCDReinforcement Learning from Calibration Data的思想結(jié)合了Laya模型在決策校準(zhǔn)上的一些實(shí)踐。如果你正在做Agent開發(fā)、LLM應(yīng)用落地、或者任何需要模型輸出“可信度”的場(chǎng)景這篇內(nèi)容應(yīng)該能幫你省下不少試錯(cuò)時(shí)間。1.2 置信度失真的根源在哪里要理解為什么LLM的置信度不可靠得先搞清楚它的置信度是怎么來(lái)的。大部分LLM在輸出概率時(shí)用的是softmax層的輸出。這個(gè)概率反映的是“模型在給定上下文下下一個(gè)token是某個(gè)詞的概率”。注意這是語(yǔ)言層面的概率不是事實(shí)層面的概率。模型說(shuō)“我有95%的把握”翻譯過(guò)來(lái)其實(shí)是“在我的訓(xùn)練分布里這種表述后面跟著‘確定’這個(gè)詞的概率比較高”。它跟“這件事在現(xiàn)實(shí)中發(fā)生的概率是95%”完全是兩碼事。更麻煩的是LLM的訓(xùn)練目標(biāo)里根本沒(méi)有“校準(zhǔn)”這一項(xiàng)。預(yù)訓(xùn)練做的是next token predictionSFT做的是模仿人類回答RLHF做的是讓回答更符合人類偏好。沒(méi)有任何一個(gè)環(huán)節(jié)在教模型“你說(shuō)80%確定的時(shí)候?qū)嶋H正確率應(yīng)該接近80%”。這就導(dǎo)致了一個(gè)系統(tǒng)性的偏差模型在訓(xùn)練數(shù)據(jù)密集的領(lǐng)域會(huì)過(guò)度自信在訓(xùn)練數(shù)據(jù)稀疏的領(lǐng)域會(huì)過(guò)度保守而在完全沒(méi)見過(guò)的領(lǐng)域它的置信度基本是隨機(jī)數(shù)。我做過(guò)一個(gè)簡(jiǎn)單的實(shí)驗(yàn)?zāi)?000條事實(shí)性問(wèn)答讓模型標(biāo)注置信度然后按置信度分桶統(tǒng)計(jì)實(shí)際正確率。結(jié)果是這樣的模型自報(bào)置信度區(qū)間實(shí)際正確率偏差90%-100%67%-28%70%-90%52%-23%50%-70%41%-14%30%-50%33%-7%0%-30%21%6%這張表說(shuō)明什么模型說(shuō)“90%以上確定”的時(shí)候?qū)嶋H只有67%是對(duì)的。這個(gè)偏差在Agent場(chǎng)景里是致命的因?yàn)锳gent往往根據(jù)置信度來(lái)決定要不要調(diào)用工具、要不要向用戶確認(rèn)、要不要直接執(zhí)行。1.3 校準(zhǔn)概率引擎要解決的核心問(wèn)題校準(zhǔn)概率引擎的目標(biāo)很明確把模型輸出的原始置信度映射到一個(gè)“實(shí)際正確率與之匹配”的校準(zhǔn)后概率。用數(shù)學(xué)語(yǔ)言說(shuō)就是找到一個(gè)映射函數(shù)f使得f(p_model) ≈ p_true。其中p_model是模型自報(bào)的置信度p_true是在該置信度水平下的實(shí)際正確率。這個(gè)映射函數(shù)不能太復(fù)雜否則推理延遲會(huì)爆炸也不能太簡(jiǎn)單否則校準(zhǔn)效果不夠。33ms的延遲預(yù)算意味著這個(gè)引擎必須非常輕量基本只能做一次前向傳播級(jí)別的計(jì)算。RLCD的思路在這里很關(guān)鍵。傳統(tǒng)的校準(zhǔn)方法比如Platt Scaling、Isotonic Regression都是在驗(yàn)證集上擬合一個(gè)映射。但LLM的輸出分布會(huì)隨著輸入領(lǐng)域變化一個(gè)固定的映射函數(shù)不夠用。RLCD的做法是引入一個(gè)輕量的校準(zhǔn)網(wǎng)絡(luò)根據(jù)輸入的上下文特征動(dòng)態(tài)調(diào)整映射參數(shù)。Laya模型在這個(gè)環(huán)節(jié)的角色是提供一個(gè)已經(jīng)過(guò)校準(zhǔn)訓(xùn)練的基座它的輸出概率分布比通用LLM更接近真實(shí)頻率。但即使沒(méi)有Laya用通用LLM加一個(gè)校準(zhǔn)頭也能達(dá)到不錯(cuò)的效果。2. 校準(zhǔn)概率引擎的核心架構(gòu)拆解2.1 整體設(shè)計(jì)思路與模塊劃分這個(gè)引擎的設(shè)計(jì)哲學(xué)是“輕量、通用、可插拔”。它不綁定任何特定的LLM也不需要在推理時(shí)訪問(wèn)模型內(nèi)部狀態(tài)。整個(gè)引擎作為一個(gè)后處理模塊接收LLM的原始輸出和置信度輸出校準(zhǔn)后的概率。架構(gòu)上分四個(gè)模塊特征提取器從輸入文本和模型輸出中提取校準(zhǔn)相關(guān)的特征包括語(yǔ)義熵、token級(jí)概率分布、輸出長(zhǎng)度、領(lǐng)域關(guān)鍵詞命中率等。校準(zhǔn)網(wǎng)絡(luò)一個(gè)2-3層的MLP輸入是特征向量輸出是校準(zhǔn)后的概率。參數(shù)量控制在10萬(wàn)以內(nèi)保證推理速度。溫度縮放層對(duì)原始logits做動(dòng)態(tài)溫度調(diào)整這是校準(zhǔn)的第一道防線。置信度分桶器把連續(xù)概率映射到離散的置信度等級(jí)方便下游Agent做決策。整個(gè)流程的延遲預(yù)算分配大概是特征提取15ms校準(zhǔn)網(wǎng)絡(luò)10ms溫度縮放和后處理8ms。加起來(lái)33ms在CPU上就能跑不需要GPU。為什么這么設(shè)計(jì)因?yàn)锳gent場(chǎng)景對(duì)延遲極其敏感。如果校準(zhǔn)本身要花幾百毫秒那還不如不做。33ms是一個(gè)經(jīng)過(guò)實(shí)測(cè)的平衡點(diǎn)足夠做有意義的校準(zhǔn)又不會(huì)讓用戶感知到明顯的等待。2.2 特征工程哪些信號(hào)真正有用校準(zhǔn)網(wǎng)絡(luò)的效果八成取決于輸入特征的質(zhì)量。我試過(guò)幾十種特征最后留下來(lái)的核心特征就這幾類語(yǔ)義熵對(duì)模型輸出的token概率分布計(jì)算熵值。熵越高說(shuō)明模型越不確定。這個(gè)特征跟校準(zhǔn)的相關(guān)性最強(qiáng)單靠它就能把ECEExpected Calibration Error降低30%左右。Top-k概率差距取概率最高的前5個(gè)token計(jì)算top1和top5之間的概率差。差距大說(shuō)明模型很篤定差距小說(shuō)明在猶豫。輸出長(zhǎng)度歸一化長(zhǎng)輸出的平均token概率通常偏低但模型自報(bào)的置信度往往偏高。這個(gè)特征用來(lái)修正長(zhǎng)度帶來(lái)的偏差。領(lǐng)域關(guān)鍵詞命中率如果輸入里包含特定領(lǐng)域的術(shù)語(yǔ)而模型輸出里這些術(shù)語(yǔ)的出現(xiàn)頻率異常往往意味著模型在“編”。這個(gè)特征需要維護(hù)一個(gè)輕量的領(lǐng)域詞典但效果很好。自洽性得分讓模型對(duì)同一問(wèn)題采樣3次計(jì)算答案的一致性。一致性高說(shuō)明模型內(nèi)部表征穩(wěn)定置信度更可信。這個(gè)特征成本稍高但在關(guān)鍵場(chǎng)景值得加。這些特征拼成一個(gè)約50維的向量輸入校準(zhǔn)網(wǎng)絡(luò)。特征提取的代碼大概長(zhǎng)這樣import numpy as np from scipy.stats import entropy def extract_features(logits, output_text, input_text, domain_dict): probs softmax(logits) sem_entropy entropy(probs) top5 np.sort(probs)[-5:] top1_top5_gap top5[-1] - top5[0] len_norm len(output_text) / 100.0 domain_hits sum(1 for w in domain_dict if w in output_text) / max(len(domain_dict), 1) features np.array([sem_entropy, top1_top5_gap, len_norm, domain_hits]) return features實(shí)際部署時(shí)這些計(jì)算都可以向量化15ms的預(yù)算很充裕。2.3 校準(zhǔn)網(wǎng)絡(luò)的訓(xùn)練數(shù)據(jù)從哪來(lái)這是整個(gè)項(xiàng)目最臟最累的部分。校準(zhǔn)網(wǎng)絡(luò)需要大量“模型輸出-實(shí)際正確性”的配對(duì)數(shù)據(jù)。這些數(shù)據(jù)不能靠人工標(biāo)注成本太高得用自動(dòng)化方法構(gòu)造。我的做法是從知識(shí)庫(kù)中抽取事實(shí)性三元組自動(dòng)生成問(wèn)答對(duì)然后讓LLM回答用知識(shí)庫(kù)驗(yàn)證答案正確性。這樣能批量生成幾萬(wàn)條帶標(biāo)簽的數(shù)據(jù)。關(guān)鍵是知識(shí)庫(kù)要覆蓋足夠多的領(lǐng)域否則校準(zhǔn)網(wǎng)絡(luò)會(huì)過(guò)擬合到特定領(lǐng)域。另一個(gè)數(shù)據(jù)來(lái)源是Agent的實(shí)際運(yùn)行日志。每次Agent調(diào)用工具后工具返回的結(jié)果就是天然的正確性標(biāo)簽。把這些日志收集起來(lái)定期增量訓(xùn)練校準(zhǔn)網(wǎng)絡(luò)效果會(huì)越來(lái)越好。訓(xùn)練目標(biāo)用的是二元交叉熵加一個(gè)校準(zhǔn)正則項(xiàng)def calibration_loss(pred_prob, true_label, raw_confidence): bce -true_label * torch.log(pred_prob) - (1 - true_label) * torch.log(1 - pred_prob) calib_reg torch.abs(pred_prob - raw_confidence).mean() * 0.1 return bce calib_reg正則項(xiàng)的作用是防止校準(zhǔn)網(wǎng)絡(luò)把原始置信度完全推翻保持一定的連續(xù)性。2.4 溫度縮放與分桶策略的配合溫度縮放是校準(zhǔn)的經(jīng)典方法但固定溫度不夠用。我的做法是根據(jù)特征動(dòng)態(tài)計(jì)算溫度def dynamic_temperature(features): base_temp 1.0 entropy_factor features[0] * 0.3 gap_factor (1 - features[1]) * 0.2 temp base_temp entropy_factor gap_factor return np.clip(temp, 0.5, 3.0)熵高的時(shí)候溫度調(diào)高讓分布更平滑top1-top5差距大的時(shí)候溫度調(diào)低保持銳度。這個(gè)動(dòng)態(tài)溫度作為校準(zhǔn)網(wǎng)絡(luò)的前置步驟能顯著提升后續(xù)MLP的收斂速度。分桶策略是為了下游Agent方便使用。把校準(zhǔn)后的概率映射到5個(gè)等級(jí)極高0.9、高0.7-0.9、中0.5-0.7、低0.3-0.5、極低0.3。Agent可以根據(jù)等級(jí)決定行為極高直接執(zhí)行高執(zhí)行但記錄日志中向用戶確認(rèn)低調(diào)用工具驗(yàn)證極低拒絕回答。這套分桶閾值不是拍腦袋定的是在驗(yàn)證集上按F1分?jǐn)?shù)優(yōu)化出來(lái)的。不同場(chǎng)景可以調(diào)整但默認(rèn)值在大多數(shù)Agent任務(wù)上表現(xiàn)穩(wěn)定。3. 從零搭建校準(zhǔn)引擎的實(shí)操過(guò)程3.1 環(huán)境準(zhǔn)備與依賴安裝整個(gè)引擎的依賴非常少核心就是numpy和torch。如果要在生產(chǎn)環(huán)境部署建議用ONNX Runtime做推理延遲能再降30%左右。pip install numpy torch onnxruntime scikit-learn數(shù)據(jù)構(gòu)造階段需要訪問(wèn)LLM API這部分看你用哪家。校準(zhǔn)網(wǎng)絡(luò)本身很小在CPU上訓(xùn)練幾分鐘就能收斂不需要GPU。我建議的目錄結(jié)構(gòu)是這樣的calibration_engine/ ├── data/ │ ├── raw_qa_pairs.jsonl │ └── processed_features.npz ├── models/ │ ├── calibration_net.onnx │ └── domain_dict.json ├── src/ │ ├── feature_extractor.py │ ├── calibration_net.py │ ├── temperature_scaler.py │ └── bucketizer.py └── config.yaml這個(gè)結(jié)構(gòu)清晰方便后續(xù)維護(hù)和增量更新。3.2 數(shù)據(jù)構(gòu)造批量生成校準(zhǔn)訓(xùn)練集數(shù)據(jù)構(gòu)造的腳本核心邏輯是從知識(shí)庫(kù)抽三元組生成問(wèn)題調(diào)LLM回答驗(yàn)證答案。import json import random from knowledge_base import KB def generate_calibration_data(kb, llm_client, num_samples50000): triples kb.sample_triples(num_samples) dataset [] for subj, pred, obj in triples: question f{subj}的{pred}是什么 response llm_client.generate(question, return_logitsTrue) answer response.text is_correct kb.verify(subj, pred, answer, obj) dataset.append({ question: question, answer: answer, logits: response.logits, correct: is_correct }) return dataset這里有個(gè)坑知識(shí)庫(kù)驗(yàn)證的準(zhǔn)確率直接影響校準(zhǔn)網(wǎng)絡(luò)的質(zhì)量。如果知識(shí)庫(kù)本身有錯(cuò)校準(zhǔn)網(wǎng)絡(luò)會(huì)學(xué)到錯(cuò)誤的映射。我的經(jīng)驗(yàn)是知識(shí)庫(kù)的準(zhǔn)確率至少要95%以上否則不如不用。另一個(gè)坑是采樣偏差。如果知識(shí)庫(kù)在某些領(lǐng)域特別密集生成的訓(xùn)練數(shù)據(jù)就會(huì)偏向那些領(lǐng)域。解決辦法是按領(lǐng)域分層采樣每個(gè)領(lǐng)域至少保證500條。3.3 特征提取的工程優(yōu)化特征提取是延遲的大頭必須優(yōu)化。原始實(shí)現(xiàn)用Python循環(huán)跑一次要200ms完全不能用。優(yōu)化后的版本用numpy向量化降到15ms以內(nèi)。關(guān)鍵優(yōu)化點(diǎn)softmax和entropy用numpy內(nèi)置函數(shù)不要自己寫循環(huán)領(lǐng)域詞典用set而不是list查詢從O(n)降到O(1)自洽性采樣用批量推理一次請(qǐng)求返回多個(gè)采樣結(jié)果所有特征計(jì)算并行化用multiprocessing池優(yōu)化后的特征提取代碼from functools import lru_cache import numpy as np lru_cache(maxsize10000) def get_domain_set(domain_dict_path): with open(domain_dict_path) as f: return set(json.load(f)) def extract_features_fast(logits_batch, texts, domain_set): probs np.exp(logits_batch) / np.exp(logits_batch).sum(axis-1, keepdimsTrue) entropies -(probs * np.log(probs 1e-10)).sum(axis-1) sorted_probs np.sort(probs, axis-1) gaps sorted_probs[:, -1] - sorted_probs[:, -5] len_norms np.array([len(t) for t in texts]) / 100.0 domain_hits np.array([len(set(t.split()) domain_set) / max(len(domain_set), 1) for t in texts]) return np.stack([entropies, gaps, len_norms, domain_hits], axis-1)實(shí)測(cè)下來(lái)這個(gè)版本在1000條批量輸入上耗時(shí)12ms完全滿足預(yù)算。3.4 校準(zhǔn)網(wǎng)絡(luò)的訓(xùn)練與調(diào)參校準(zhǔn)網(wǎng)絡(luò)的結(jié)構(gòu)很簡(jiǎn)單輸入50維特征兩個(gè)隱藏層各128維輸出1維概率。激活函數(shù)用GELUdropout 0.1。import torch.nn as nn class CalibrationNet(nn.Module): def __init__(self, input_dim50): super().__init__() self.net nn.Sequential( nn.Linear(input_dim, 128), nn.GELU(), nn.Dropout(0.1), nn.Linear(128, 128), nn.GELU(), nn.Dropout(0.1), nn.Linear(128, 1), nn.Sigmoid() ) def forward(self, x): return self.net(x).squeeze(-1)訓(xùn)練時(shí)用AdamW學(xué)習(xí)率1e-3batch size 256跑50個(gè)epoch基本收斂。關(guān)鍵是要用早停監(jiān)控驗(yàn)證集上的ECE而不是準(zhǔn)確率。因?yàn)樾?zhǔn)網(wǎng)絡(luò)的目標(biāo)是校準(zhǔn)不是分類。調(diào)參經(jīng)驗(yàn)dropout不要超過(guò)0.2否則校準(zhǔn)曲線會(huì)抖動(dòng)隱藏層不要超過(guò)3層再深就過(guò)擬合了學(xué)習(xí)率用余弦退火最后幾個(gè)epoch降下來(lái)校準(zhǔn)效果更穩(wěn)。3.5 推理流水線的集成與延遲測(cè)試把各個(gè)模塊串起來(lái)形成完整的推理流水線class CalibrationEngine: def __init__(self, model_path, domain_dict_path): self.net onnxruntime.InferenceSession(model_path) self.domain_set get_domain_set(domain_dict_path) def calibrate(self, logits, output_text, input_text): features extract_features_fast(logits, [output_text], self.domain_set) temp dynamic_temperature(features[0]) scaled_logits logits / temp calibrated_prob self.net.run(None, {input: features})[0][0] bucket self.bucketize(calibrated_prob) return calibrated_prob, bucket延遲測(cè)試結(jié)果模塊耗時(shí)(ms)特征提取12溫度縮放3校準(zhǔn)網(wǎng)絡(luò)10分桶2總計(jì)2727ms比33ms的預(yù)算還留了余量。在低配CPU上跑也就35ms左右完全可用。4. 實(shí)際效果與踩坑記錄4.1 校準(zhǔn)前后的ECE對(duì)比在留出的測(cè)試集上校準(zhǔn)前后的ECE對(duì)比模型原始ECE校準(zhǔn)后ECE降低幅度通用LLM-A0.230.0770%通用LLM-B0.190.0668%Laya模型0.150.0473%ECE從0.2左右降到0.05以下意味著模型說(shuō)“80%確定”的時(shí)候?qū)嶋H正確率真的在75%-85%之間了。這個(gè)提升在Agent決策場(chǎng)景里是質(zhì)變。分桶后的準(zhǔn)確率分布也更合理了校準(zhǔn)后置信度桶實(shí)際正確率極高(0.9)93%高(0.7-0.9)81%中(0.5-0.7)62%低(0.3-0.5)38%極低(0.3)15%每個(gè)桶的實(shí)際正確率都落在桶的范圍內(nèi)這就是校準(zhǔn)到位的標(biāo)志。4.2 常見問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決方案校準(zhǔn)后概率全部偏高訓(xùn)練數(shù)據(jù)正樣本過(guò)多統(tǒng)計(jì)訓(xùn)練集正負(fù)比重采樣或調(diào)class weight校準(zhǔn)后概率全部偏低知識(shí)庫(kù)驗(yàn)證太嚴(yán)格抽查驗(yàn)證邏輯放寬驗(yàn)證閾值延遲超過(guò)50ms特征提取未向量化profile各模塊耗時(shí)用numpy批量計(jì)算某些領(lǐng)域校準(zhǔn)失效訓(xùn)練數(shù)據(jù)領(lǐng)域覆蓋不足按領(lǐng)域統(tǒng)計(jì)ECE補(bǔ)充該領(lǐng)域訓(xùn)練數(shù)據(jù)校準(zhǔn)曲線抖動(dòng)dropout太高或?qū)W習(xí)率太大看驗(yàn)證集loss曲線降dropout到0.1加余弦退火ONNX推理結(jié)果跟PyTorch不一致算子版本不匹配對(duì)比兩邊輸出固定opset版本重新導(dǎo)出4.3 幾個(gè)只有踩過(guò)才知道的坑坑一不要用準(zhǔn)確率做早停指標(biāo)。我一開始用驗(yàn)證集準(zhǔn)確率做早停結(jié)果校準(zhǔn)網(wǎng)絡(luò)學(xué)成了一個(gè)分類器校準(zhǔn)效果很差。后來(lái)?yè)Q成ECE效果立刻對(duì)了。校準(zhǔn)和分類是兩個(gè)目標(biāo)別搞混??佣I(lǐng)域詞典要定期更新。領(lǐng)域詞典是靜態(tài)的但實(shí)際輸入里的術(shù)語(yǔ)會(huì)變化。我建議每個(gè)月更新一次把新出現(xiàn)的術(shù)語(yǔ)加進(jìn)去。更新后校準(zhǔn)網(wǎng)絡(luò)需要微調(diào)幾個(gè)epoch不然特征分布會(huì)偏移??尤郧⑿圆蓸硬灰^(guò)3次。采樣次數(shù)越多自洽性得分越可靠但延遲也越高。3次是性價(jià)比最高的點(diǎn)再多邊際收益很低。坑四校準(zhǔn)網(wǎng)絡(luò)不要頻繁重訓(xùn)。我試過(guò)每天重訓(xùn)結(jié)果校準(zhǔn)曲線反而變差了。因?yàn)槊刻斓倪\(yùn)行日志分布有波動(dòng)頻繁重訓(xùn)會(huì)讓網(wǎng)絡(luò)學(xué)到噪聲。建議每周或每?jī)芍苤赜?xùn)一次用累積數(shù)據(jù)??游宸滞伴撝狄磮?chǎng)景調(diào)。默認(rèn)閾值在通用場(chǎng)景好用但在醫(yī)療、金融這種高風(fēng)險(xiǎn)場(chǎng)景應(yīng)該把“高”桶的閾值從0.7提到0.85寧可多確認(rèn)幾次也不要讓錯(cuò)誤答案直接執(zhí)行。4.4 在Agent決策中的實(shí)際應(yīng)用校準(zhǔn)后的概率怎么用我舉幾個(gè)實(shí)際例子。工具調(diào)用決策Agent在決定是否調(diào)用外部工具時(shí)如果校準(zhǔn)后置信度低于0.6就強(qiáng)制調(diào)用工具驗(yàn)證。這個(gè)閾值比用原始置信度可靠得多因?yàn)樵贾眯哦仍?.6的時(shí)候?qū)嶋H正確率可能只有0.4。多輪對(duì)話中的追問(wèn)策略如果校準(zhǔn)后置信度在0.5-0.7之間Agent會(huì)生成一個(gè)追問(wèn)向用戶確認(rèn)關(guān)鍵信息。這個(gè)區(qū)間是“模型不確定但也不是完全瞎猜”的區(qū)域追問(wèn)的ROI最高。結(jié)果過(guò)濾在批量處理場(chǎng)景只輸出校準(zhǔn)后置信度高于0.8的結(jié)果低于0.5的直接丟棄并記錄。這樣能把整體準(zhǔn)確率從70%拉到90%以上代價(jià)是召回率下降但很多場(chǎng)景下準(zhǔn)確率比召回率重要。級(jí)聯(lián)模型小模型先跑校準(zhǔn)后置信度低于0.7的請(qǐng)求轉(zhuǎn)給大模型。這樣能在保持整體準(zhǔn)確率的同時(shí)大幅降低推理成本。實(shí)測(cè)下來(lái)70%的請(qǐng)求小模型就能搞定只有30%需要大模型。4.5 后續(xù)可以擴(kuò)展的方向這個(gè)引擎目前只做了輸出層的校準(zhǔn)還有幾個(gè)方向可以繼續(xù)挖。輸入層校準(zhǔn)在模型推理之前先判斷輸入是否在模型的能力范圍內(nèi)。如果輸入屬于模型不擅長(zhǎng)的領(lǐng)域直接降低先驗(yàn)置信度。這個(gè)可以用一個(gè)輕量的領(lǐng)域分類器實(shí)現(xiàn)。時(shí)序校準(zhǔn)Agent在多輪對(duì)話中置信度應(yīng)該隨著對(duì)話輪次動(dòng)態(tài)調(diào)整。第一輪不確定隨著信息補(bǔ)全置信度應(yīng)該上升。目前的引擎是單輪獨(dú)立的加一個(gè)時(shí)序模塊會(huì)更好。跨模型校準(zhǔn)不同LLM的置信度偏差模式不同但校準(zhǔn)網(wǎng)絡(luò)可以共享底層特征只微調(diào)頂層。這樣切換模型時(shí)不需要重新構(gòu)造全部訓(xùn)練數(shù)據(jù)。與RAG的聯(lián)動(dòng)RAG檢索到的文檔質(zhì)量可以作為校準(zhǔn)特征。檢索得分高校準(zhǔn)后的置信度可以適當(dāng)上調(diào)檢索得分低下調(diào)。這個(gè)聯(lián)動(dòng)能讓整個(gè)系統(tǒng)的可靠性再上一個(gè)臺(tái)階。我個(gè)人在實(shí)際操作中的體會(huì)是校準(zhǔn)這件事的投入產(chǎn)出比非常高。花兩天搭好引擎后面所有Agent的決策質(zhì)量都能提升一個(gè)檔次。而且這個(gè)引擎是通用的換模型、換場(chǎng)景都不用大改。唯一需要持續(xù)投入的就是訓(xùn)練數(shù)據(jù)的更新但這部分可以自動(dòng)化成本可控。最后分享一個(gè)小技巧在校準(zhǔn)網(wǎng)絡(luò)輸出之后可以再加一個(gè)“保守偏移”把概率往0.5的方向拉一點(diǎn)點(diǎn)。這個(gè)偏移量很小大概0.02左右但能讓極端置信度不那么極端在安全關(guān)鍵場(chǎng)景里很有用。這個(gè)技巧是我在一個(gè)金融風(fēng)控項(xiàng)目里學(xué)到的那邊寧可保守也不要激進(jìn)。