模型置信度在实际中的应用
一、LLM 中的“置信度”本质是什么?
在大语言模型中,每一步生成的 token 都有一个概率分布:
P(ti∣t1,t2,…,ti−1) P(t_i | t_1, t_2, …, t_{i-1}) P(ti∣t1,t2,…,ti−1)
这个分布来自模型最后一层的 logits,经 softmax 后得到。
例如模型在生成句子:
“The cat sat on the mat.”
当生成到“mat”这个词时,模型可能认为:
候选词 概率
mat 0.81
bed 0.10
floor 0.04
sofa 0.02
这里,“mat”的概率 0.81 就是当前 token 的置信度。
如果要计算一句话的总体置信度,可以取所有 token 的平均或乘积(通常取 log 概率求和平均):
Confidence(sentence)=1N∑i=1NlogP(ti∣t<i) \text{Confidence(sentence)} = \frac{1}{N} \sum_{i=1}^{N} \log P(t_i | t_{<i}) Confidence(sentence)=N1i=1∑NlogP(ti∣t<i)
二、在 Qwen / DeepSeek / vLLM 中置信度的具体来源
在这些模型框架(尤其是部署在 vLLM / OpenAI API 兼容接口上)中,置信度通常可以通过两种方式获取:
✅ 1. logprobs 字段
API 调用时加上:
{"model": "qwen3-omni-30b","prompt": "天空是什么颜色?","logprobs": 5
}
返回结果中会包含每个 token 的 logprob(对数概率):
"tokens": [{"token": "蓝", "logprob": -0.12},{"token": "色", "logprob": -0.10},{"token": "的", "logprob": -0.25}
]
置信度可通过 exp(-logprob) 得出。
例如 logprob = -0.12 → 概率 ≈ 0.89,代表模型对这个 token 的置信度。
✅ 2. 平均 logprob 作为句子置信度
如果你想评估整个生成回答的可靠性,可取所有 token 的平均值:
import math
logprobs = [-0.12, -0.10, -0.25]
confidence = math.exp(sum(logprobs) / len(logprobs)) # ≈ 0.83
这表示:模型整体上“约有 83% 的把握”认为它的输出是合理的。
⸻
三、工程上的用途
- 答案可靠性判定(RAG / 多Agent 系统)
在知识检索、问答系统(如你在做的 yifa_rag 或 knowledge_base_service)中:
• 模型输出的每句话都可以计算置信度;
• 如果置信度低(例如 <0.6),可以:
• 请求第二轮模型确认;
• 或触发 “检索增强”;
• 或让系统返回“可能不确定,请人工审核”。
这可以显著降低幻觉(hallucination)风险。
⸻
- 多模型投票(Ensemble 或 Reranker)
你常用的 bge-reranker、DeepSeek-Rerank 等模型,其实就利用了置信度概念。
比如两个模型输出相同答案:
模型 答案 置信度
Qwen A 0.78
DeepSeek A 0.88
则可加权平均置信度,用来做集成判定或 rerank。
⸻
- 拒答机制(拒绝低置信答案)
在法条问答、医学问诊、调解语音分析等任务中:
• 若生成答案的平均置信度低于设定阈值(例如 0.55);
• 系统可自动输出:
“该问题缺乏足够依据,请核实后再回答。”
这类机制是企业级系统必须具备的“自我保护层”。
⸻
- 提示词(Prompt)优化
在多轮提示词优化时,可以分析:
• 哪些 prompt 模式会导致低置信度输出;
• 哪些会提升模型置信度(例如结构化问题、带上下文的提问)。
通过统计,可以自动调整提示词模板,提高整体性能。
⸻
四、置信度与温度(temperature)的关系
在调用参数中:
{"temperature": 0.7
}
• 低温度(0.2–0.5) → 输出更确定,置信度更集中;
• 高温度(>0.8) → 输出更随机,置信度更分散。
换句话说:
温度控制“模型信心的分布”,而置信度反映“模型信心的值”。
工程实践中,你可以用温度 + 置信度 联合控制生成质量:
• 对于事实类任务(如法律条文问答):温度低,置信度阈值高;
• 对于创意类任务(如生成教学网页):温度高,置信度阈值可宽松。
⸻
五、实战案例(结合你的系统)
你在部署的 knowledge_base_service(法律检索问答系统)中可以这样集成置信度机制:
response = llm.generate(prompt, logprobs=True)
tokens = response['tokens']
# 计算平均置信度
avg_conf = sum(math.exp(t['logprob']) for t in tokens) / len(tokens)if avg_conf < 0.65:return "⚠️ 模型对此答案信心不足,请人工审核。"
else:return response['text']
配合前端显示一个信心条:
🟩🟩🟩🟨⬜ 置信度:0.78
⸻
六、总结对比表

