把「外科手术室」搬进自回归窗口,在模型最犹豫的 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. 风险与回退
- 拒绝服务:bias 过大可能触发模型内置安全护栏,返回空内容。我们在钩子侧设置「零回答检测」,一旦空内容立即回退到原请求(无 bias),保证可用性。
- 多轮累积:干预信号随上下文指数级叠加。解决方式是「衰减窗口」:只让最近 2k token 内的干预生效,更早的 bias 自动清零。
- 合规审计:钩子改写必须留痕。我们在 HTTP header 注入
X-Intervention-Trace: eyJ0eXBlIjoiZGVkdXAiLCJ2ZXJzaW9uIjoiMS4wIn0=,日志平台可实时索引,满足金融客户审计需求。
6. 未来工作:把钩子做成推理栈的默认层
运行时干预已从「论文玩具」走向「生产必需品」。下一步,我们将:
- 把三段钩子固化为 Mentat 的默认 middleware,开箱即用
- 与 vLLM / TensorRT-LLM 合作,把熵估计器下沉到 C++ 侧,延迟再降 60%
- 推动行业标准化:在 OpenTelemetry 里新增
llm.interventionspan,让「幻觉止血」成为可观测的常规指标
当每一次 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.