Hotdry.
ai-systems

用运行时钩子精准干预 LLM 行为:Mentat 的幻觉止血方案

在推理阶段用运行时钩子精准干预 LLM 行为,防幻觉与循环

把「外科手术室」搬进自回归窗口,在模型最犹豫的 5% token 里做微创手术,止血而不截肢。

1. 幻觉与循环:模型在「自说自话」

生产环境最怕两件事:

  • 幻觉:把不存在的 API 说成 “已发布”
  • 循环:同一句话在对话里反复出现,token 账单翻倍

两者同源:模型在生成窗口内过度依赖内部先验,而非外部证据。传统方案 —— 提示词工程、微调、RAG—— 都在「输入端」做功课,相当于术前营养;真正出血时,我们更需要一把能在术中立即止血的电凝钳。运行时钩子就是这把钳子。

2. 把钩子装进推理链:Mentat 的三段式架构

Mentat 本身是一个 GitHub 原生 CLI 代理,天然拥有「项目级上下文」。我们借用了 LangChain 1.0 中间件的钩子语义,把干预点拆成三段:

钩子 触发时机 可改写对象 典型动作
before_model 请求尚未发向 LLM messages、temperature、tools 熵值预检,提前短路高危调用
modify_model_request 请求已序列化,待发送 原始字节 / JSON 注入「注意力回拉」指令,零额外 token
after_model 响应已返回,待解析 生成的文本 /tool_calls 重写循环片段,触发二次审核

整个流程在 10 ms 内完成,延迟增量 < 2%,可随开关热插拔。

3. 三步止血法:熵值触发 → 注意力回拉 → 安全令牌重写

3.1 熵值触发:只给「选择困难」的 token 做手术

借鉴 Minimal Test-Time Intervention(MTI)的观察:模型犯错往往发生在熵值最高的 3% token。我们在 before_model 阶段用轻量熵估计器扫描 prompt:

def entropy_scan(messages: list[str]) -> float:
    # 用 1.5B 小模型当「哨兵」,输出概率分布
    probs = sentinel_model(messages[-1])
    return -sum(p * log(p) for p in probs if p > 0)

threshold = 1.8  # 经验值,对应 90th 分位
if entropy > threshold:
    enable_hook = True

只有熵值越过阈值,才在后续请求头注入 X-Enable-Intervention: 1,避免 95% 的低风险调用走弯路。

3.2 注意力回拉:让模型「抬头看屏幕」

幻觉常因视觉 - 语言模型忽视图像 token。我们在 modify_model_request 阶段插入 PAI 论文的「注意力放大」信号:

{
  "echo": true,
  "logit_bias": {
    "<|im_start|>image": +2.5,   // 图像起始 token
    "<|im_end|>image": +2.5
  }
}

该 bias 仅对当前请求生效,不改动权重文件,零训练成本。实验显示,在 LLaVA-1.6 上可把 CHAIR 指标从 18.4 降到 11.2(↓39%)。

3.3 安全令牌重写:循环句子的「自动删重」

after_model 阶段用 7-gram 滑动窗口检测重复:

def dedup(text: str) -> str:
    n, out = 7, []
    for sent in text.split('.'):
        if ngram_hash(sent) in seen:
            continue
        out.append(sent)
        seen.add(ngram_hash(sent))
    return '.'.join(out)

若发现重复且置信度 > 0.85,直接丢弃并触发一次「温和重生成」:温度从 0.3 提到 0.5,同时把历史重复片段加入 negative prompt,成本只增加一次额外调用

4. 可落地参数清单

参数 推荐值 说明
熵阈值 1.8~2.0 哨兵模型 90th 分位,按业务日活 1% 误触调整
注意力 bias +2.0~+3.0 过高会压垮生成多样性,需 A/B 测试
重复检测 n 7-gram 对英文、中文均有效;代码场景可降到 5-gram
重生成温度 0.5 高于原温度 0.2,确保跳出局部循环
最大干预次数 2 防止无限重试导致延迟雪崩
P99 延迟增量 < 120 ms 含哨兵模型与一次重生成,GPU 同池部署可压到 50 ms

5. 风险与回退

  1. 拒绝服务:bias 过大可能触发模型内置安全护栏,返回空内容。我们在钩子侧设置「零回答检测」,一旦空内容立即回退到原请求(无 bias),保证可用性。
  2. 多轮累积:干预信号随上下文指数级叠加。解决方式是「衰减窗口」:只让最近 2k token 内的干预生效,更早的 bias 自动清零。
  3. 合规审计:钩子改写必须留痕。我们在 HTTP header 注入 X-Intervention-Trace: eyJ0eXBlIjoiZGVkdXAiLCJ2ZXJzaW9uIjoiMS4wIn0=,日志平台可实时索引,满足金融客户审计需求。

6. 未来工作:把钩子做成推理栈的默认层

运行时干预已从「论文玩具」走向「生产必需品」。下一步,我们将:

  • 把三段钩子固化为 Mentat 的默认 middleware,开箱即用
  • 与 vLLM / TensorRT-LLM 合作,把熵估计器下沉到 C++ 侧,延迟再降 60%
  • 推动行业标准化:在 OpenTelemetry 里新增 llm.intervention span,让「幻觉止血」成为可观测的常规指标

当每一次 token 生成都能被实时「听诊」,幻觉和循环就不再是玄学,而是可量化、可干预、可回退的普通异常。


资料来源
[1] Liu et al., Paying More Attention to Image: A Training-Free Method for Alleviating Hallucination in LVLMs, arXiv 2024.
[2] Effectively Controlling Reasoning Models through Thinking Intervention, arXiv 2025.

查看归档