Logprobs 零成本测谎仪——从分母抹杀理论到软预警协同裁决

0 阅读1分钟

摘要:在金融报表、医疗医保、政务合规等对数字极度敏感的严肃 RAG 场景中,大模型常常以极其笃定自信的语气,吐出完全捏造的虚假事实或被篡改的金额数字。传统的 Prompt 约束与端到端质检因无法穿透模型生成黑盒,往往陷入“事后盲猜”的被动局面。本文基于开源系统 Aegis-RAG 的底层工业实践(rag_eval/verifiers/logprobs_analyzer.py),深入剖析大模型生成过程中底层的原始对数概率(Logprobs)、Softmax 归一化竞争机理、局部实体置信度与动态困惑度(PPL)。尤为关键的是,本文系统性揭示了当前火热的基于状态机 Logit Masking 强制约束在物理层面造成的**“分母抹杀致盲陷阱”,并提出“测谎仪剥离一票否决权 + 上下文协同裁决 + 生产/评测双链路物理隔离”**的工业级解决方案。


目录


一、生活比喻:大模型的“测谎仪”与“心虚脉搏”

1.1 笃定的骗子与流汗的微表情

在刑事侦查中,经验丰富的审讯专家常常面对两类嫌疑人:

  • 第一类人做贼心虚,说话支支吾吾,眼神闪烁;
  • 第二类人则是受过反侦察训练的高智商罪犯,即便在编造弥天大谎,表面上也能做到神态自若、谈吐流利、语气笃定。

大语言模型(LLM)恰恰就是最顶级的“第二类说谎者”。 当你向它提问:“某医保目录中三级医院普通门诊报销比例是多少?”,如果检索召回的上下文中只提到了“二级医院 75%”,根本没有出现三级医院的比例,模型极有可能直接输出:“三级医疗机构的报销比例为 60%,政策规定明确,请放心报销。”从排版、语法到文采挑不出任何毛病,语气严肃权威。

但是,大模型无法隐藏它在吐字那一瞬间的生理脉搏与微表情——这就是对数概率(Logprobs)。

1.2 为什么黑盒文本测不出“心虚”?

在传统 RAG 流水线中,客户端通过 HTTP 接口调取大模型时,默认只拿到了纯文本。这就像隔着水泥墙听交代案情,看不到嫌疑人满头大汗、心率飙升。 在自回归解码的每一步,模型实际上是在整个几万词的 Vocabulary(词表)上计算了所有可能 Token 的概率分布。当模型真正“知道”答案时,注意力集中,预测概率高达 90% 以上;而当开始“脑补”虚构数据时,候选词概率断崖式离散,被采样的 Token 原生概率可能只有 3% ~ 5%。 Logprobs,就是穿透这堵黑盒水泥墙的无损“数字听诊器”。


二、数学底层:从 Logit 到 Logprob 的概率链条

2.1 生成式自回归的物理本质

在时间步 t,大模型输出最后一个隐藏状态向量 h_t。随后通过 LM Head 投影到整个词表大小 |V| 的向量空间中,得到未归一化的原始打分 Logits: z_t = h_t * W_vocab^T

2.2 Softmax 概率归一化公式

P(w_i) = exp(z_i) / sum(exp(z_j)) 分母 sum(exp(z_j)) 代表全词表能量总和,每个 Token 都在分母中与其他候选者展开激烈的“注意力竞争”。

2.3 为什么取自然对数(Logprob)?

  1. 防数值下溢(Underflow):100 个 Token 连乘概率会导致浮点数归零。
  2. 计算加和性(Additivity):logprob(w_i) = ln P(w_i),将乘法转为加法。

数值对照:

  • 绝对确信:P = 99.9%, Logprob = -0.0010(原文白纸黑字)
  • 高度稳定:P = 85.0%, Logprob = -0.1625
  • 中度动摇:P = 50.0%, Logprob = -0.6931
  • 严重心虚:P = 20.0%, Logprob = -1.6094(高风险)
  • 胡编乱造:P = 5.0%, Logprob = -2.9957(致命幻觉)

三、核心算法:数字心虚度探针的双轮驱动

3.1 指标一:局部实体最小置信度(Token Minimum Confidence)

全篇平均概率存在盲区(大量高概率的助词、介词会掩盖关键数字只有 3% 置信度的险情)。 Aegis-RAG 引入局部木桶短板原则: Confidence(E) = min_{w in E} P(w) 只要关键实体内任何一个 Token 概率低于阈值(如 0.40 ~ 0.50),立刻报警!

3.2 实体对齐跨度映射(Span Mapping)算法

大模型分词会把数字切片(如 "1500元" -> ["15", "00", "元"])。 通过建立字符级滑动映射窗口,准确定位哪个 Token 属于哪个敏感实体,抓取短板 Token。

3.3 指标二:全文困惑度(Perplexity, PPL)与滑动窗口

PPL = exp(-1/N * sum(logprob_t))

  • PPL in [1.0, 3.0]:流畅严谨,逻辑高度收敛
  • PPL in [3.0, 8.0]:正常业务区间
  • PPL > 8.0:拼凑虚假逻辑或生搬硬套
  • PPL > 20.0:严重语病或复读发散

四、惊天机制碰撞:Logit Masking 的“分母抹杀致盲陷阱”

4.1 什么是 Logit Masking?

Outlines、vLLM、SGLang 等框架使用 FSM 状态机追踪生成。当某一步只能输出数字时,将非数字 Token 的 Logit 设为 -inf,保证 100% 格式合法。

4.2 数学推导:分母抹杀(Denominator Eradication)

  1. 未开启 Masking 时: z_"6" = 2.0, z_"具体" = 8.0 P("6") = exp(2.0) / (exp(2.0) + exp(8.0) + ...) ≈ 0.15% (Logprob = -6.50) -> 测谎仪报警!
  2. 开启 Logit Masking 后: 所有非数字候选被设为 -inf,exp(-inf) = 0。 P("6") = exp(2.0) / (exp(2.0) + 0 + ...) = 100% (Logprob = 0.0000) -> 测谎仪致盲!

4.3 虚假繁荣:100% 置信度的致命幻觉

Logit Masking 人为抹杀了 Softmax 分母中的全部竞争者,使得模型哪怕对某个数字只有 0.01% 的把握,算出的 Logprob 也会被硬生生拉到 0.0(100% 概率)。测谎仪被人工致盲!


五、破局设计:为什么 Logprobs 绝不能拥有一票否决权?

5.1 分词碎片化(BPE Fluctuation)导致的冤假错案

空格、全角符号、近义词分流会导致局部 Token 概率骤降,直接一票否决会导致极高的误杀率。

5.2 软预警与协同裁决(Joint Verification)机制

  • 禁用单独立即否决:allow_sole_veto = False
  • 双重确凿才触发硬否决:低置信度(内心心虚) + 上下文查无实据(证据缺失) -> 触发协同否决(Joint Rejection)。

5.3 协同判决真值表

  • 高置信度 + 有出处 -> 放行 (Pass)
  • 低置信度 + 有出处 -> 软预警,放行(避免误杀)
  • 低置信度 + 无出处 -> 协同击毙 (Veto,双重确凿)
  • 高置信度 + 无出处 -> Tier-1 确定性硬规则一票否决(防笃定胡说)

六、工业落地方案:双链路物理隔离架构

  1. 链路 A:线上实时生产主链路
    • 开启 FSM Logit Masking 保证 100% 结构合法
    • 关闭 logprobs=True 节约带宽与延迟
    • 由 Tier-1 纯代码确定性 Verifier 守门,以原文出处与量纲核验作为一票否决标准
  2. 链路 B:线下/异步可观测性沙盒链路
    • 彻底剥离 Logit Masking,恢复自由竞争
    • 开启 logprobs=True 接入 LogprobsLieDetector 探针
    • 输出心虚度热力图与审计工单,反哺 Prompt 与知识库治理

七、代码实战:logprobs_analyzer.py 核心精髓

  • TokenLogprobItem 契约:自动由 logprob 转为 prob (math.exp)
  • LieDetectorReport 报告:承载 overall_ppl, flagged_entities, rejection_reasons
  • 协同裁决逻辑: if not _is_entity_supported_in_context(fe["entity"], context): # 既心虚又无凭据,执行协同拦截

八、总结与心法

  1. 看字不如看脉:文字可以装得冠冕堂皇,对数概率记录着真实的神经元犹疑。
  2. 警惕虚假繁荣:切记 Logit Masking 会造成分母抹杀,不要在受限解码链路上挂载概率探针。
  3. 软硬协同致胜:Logprobs 作为敏锐哨兵提供软预警,Tier-1 纯代码规则矩阵作为执法铁卫,双剑合璧构建高可靠防线。