reduce-hallucination 是做什么的?
将审讯科学用于让知情证人说出真相的验证技术,转化为LLM智能体的标准化审计流程。每个LLM节点都是一个证人。节点间的信息传递是证词记录。用户的修正和任务记录是物证。
理论和证据存在于 references/ 目录中。阅读 references/research-map.md 以了解每项主张背后的引用来源。
三条铁律
- 无证据不指控(韦尔曼规则)。每项发现必须引用其涉及的具体提示、模式或输出。没有引用的可疑点应放入“待验证”列表,而非纳入结论。
- 表面信号并不能证明真相。流畅、自信、详细的文本并不比简洁的文本更正确。人类从行为中识别欺骗的能力仅略高于随机水平。只评判内容本身:是否接地、是否一致、引用的片段是否存在。
- 自我修正需要新的外部信号。“你确定吗?再检查一遍”而没有新证据的做法会降低准确性。每次重新检查必须注入检索结果或验证器输出。
良好引用的三大支柱
引用质量可分解为三个维度的检查,按难度和价值递增排列:
| 支柱 | 问题 | 当前现状 |
|---|---|---|
| 忠实性 | 引用是否逐字真实,且主张是否非捏造? | 基本可解决:逐字字符串匹配 + 弃权机制。 |
| 相关性 | 来源是否与问题主题相关? | 基本可解决:检索质量 + 一致性探测。 |
| 支持性 | 来源是否支持主张,还是反对主张,或保持中立? | 前沿问题。难度大,且“反对”这一稀有类别是系统最薄弱的环节。 |
一个引用了真实、相关段落但实际并不支持主张的引用(“误导性接地”),比没有引用更糟糕,因为它为错误主张制造了信任,并解除了审阅者唯一有效的防御手段(核查内容)。展示一个引用而不在后台验证它,会使幻觉变得更危险,而不是减轻。
审计协议
阶段 1 — 审问每个证人(提示 + 模式红旗检查)
对每个LLM节点,执行红旗列表。每项标志代表一种审问违规。
| # | 红旗(要检查的内容) | 为何重要 | 危害 |
|---|---|---|---|
| R1 | 枚举字段没有 null / unknown 选项;单向指令“输出一个X的确认信息”。 | 强迫回答会产生服从(类似虚假自白的类比)。 | 强迫猜测,自信的事实捏造。 |
| R2 | 文本中授予了弃权权利(“如果缺失则使用null”),但模式中没有null。 | 模式优先,弃权无效。 | 静默的事实捏造。 |
| R3 | 提示要求提供证据/引用,但下游没有任何环节检查它。 | 告知而不验证,会教会模型捏造更逼真的引用。 | 虚假锚点。 |
| R4 | 方向性指令:“保守一点”、“假设”、“从……推断”、“默认”。 | 单向推定;与R1结合会产生系统性偏差。 | 输出向一个方向倾斜。 |
| R5 | 没有定义单位的聚合字段(“总年数”、“总体评分”)。 | 测量需要先声明其单位,然后才能锁定。 | 定义不匹配被解读为提取错误。 |
| R6 | 少量样本示例与任务无关或演示了无引用的推理。 | 示例设定了“好的”回答的期望。 | 教会错误的输出风格。 |
| R7 | 提示声称该节点可以做到它没有工具去完成的事情。 | 错误的前提。 | 捏造的过程叙述。 |
| R8 | 用户或上游节点传递的一个“事实”,被当作真相使用但没有来源标签。 | 只应用已验证的证据进行对质。 | 前提污染。 |
| R9 | 带有必填槽位且没有空值分支的模板。 | 模板版本的强迫回答。 | 空白被填充为最近的值。 |
| R10 | 激进的重检/重试指令(“你错了,修正它”)且没有新证据。 | 媚俗行为会翻转正确答案。 | 正确的答案被推翻。 |
每条记录格式为:节点 | R# | 引用文本 | 一句后果
阶段 2 — 审计转录过程(节点边界 / 数据流)
这是大多数管道幻觉发生的地方。绘制数据流并检查每条边:
- 不确定性是否跨越了边界? 上游的
confidence/missing_fields/null/ notes —— 下游是否有任何环节消费它们,还是模板将它们压平为断言?查找“死信”不确定性:被生成但从未被读取。 - 来源是否丢失? 上游推理中承认是“假设/推断”的值,在下游变成了没有标记的事实。模式应携带
stated | inferred | absent。 - 事实类别是否混淆? 配置或需求数据被呈现为用户/文档断言的内容。
- 聚合值是否改变了单位? 上游的“总医学年限”变成了下游的“担任X职位的年数”。
- LLM 是否在计算确定性内容? 提示中的日期计算、求和、计数应移至代码步骤。
阶段 3 — 匹配物证(当任务记录存在时)
- 提取一个任务样本的中间节点输出(优先选择有用户修正或失败的任务)。
- 逐字段比较最终输出与每个节点的中间输出和原始输入;定位第一个丢失真相的边界。
- 寻找先前不一致的陈述:同一字段在多个节点间自相矛盾。
- 如果修正是方向性的(系统性地指向一边),重新检查阶段1的R4方向性指令;随机错误更可能指向输入质量。
- 诚实分类:“从未在源数据中出现的信息”(流程缺口,而非幻觉)vs “输入中存在但表述错误的信息”(真正的幻觉)。
阶段 4 — 按投资回报率排序的修复方案
层级 1 — 提示 / 模式(零结构变化)
- 每个 R1/R2 → 添加一个
null/unknown枚举 + 一条去污名化语句(“X是一个正确、预期的答案”)。 - 每个 R9 → 为模板添加一个空值分支(断言变为开放性问题)。
- 每个 R5 → 拆分单位,或输出一个范围
{下限, 上限}。 - 每个 R3 → 为关键字段添加
{value, source, evidence_quote}三元组。
层级 2 — 确定性代码验证器(零LLM成本)
| 验证器 | 检查内容 |
|---|---|
| 枚举白名单 | 字段值在允许集合中。 |
| 引用字符串匹配 | evidence_quote 在引用的源数据中逐字存在;若不存在,则拒绝或降级。 |
| 跨字段一致性 | 总数吻合;missing_fields 不与已填充的值矛盾。 |
| 单位计算 | 日期差 / 求和由代码完成;LLM只做语义提取。 |
| 退出契约 | 每个用户可看到的事实槽位非空,且来自允许的源字段。 |
将其置于任何产生用户可见内容的节点之前。失败时,写入一个回退标志并路由到开放性问题或人工。
层级 3 — LLM 交叉审问节点(LM vs LM)
- 一个单独的节点,只接收待审查的输出和源文档(不含污染的上下文)。
- 将任务表述为反驳:“尝试反驳:这个输出中的每项主张都能追溯回源文档吗?列出那些不能的主张。”
- 输出
{verdict, offending_claims[]};对于高风险的流程,重新排序后再次提问并获取一致性投票。 - 成本:每个任务额外一次 LLM 调用 —— 仅对用户可见的出口或高风险决策启用。
阶段 5 — 报告
# 幻觉审计 — {agent}
## 一句话结论
## 证据概览(节点 / 审计版本 / 任务样本 / 修正样本 + 方向)
## 发现项(每项:位置 | R# | 引用文本 | 后果 | 修复编号)
## 数据流图与死信通道
## 修复建议(层级1/2/3,每项标注其消除的发现项)
## 待验证项(证据不足的可疑点 + 如何获取证据)
## 诚实边界(哪些修正是流程缺口而非幻觉;本次审计未覆盖的内容)
支持性:前沿问题(可选扩展)
忠实性 + 相关性是基础。开放的问题是支持性:引用的来源是支持、反对还是中立对待主张?研究中的两点说明:
- 将其建模为立场加程度。三值立场(蕴含 / 反对 / 中立)忽略了部分或条件性支持,而这正是大多数监管和法律文本的情况。添加一个“部分/条件性”标志,路由到人工审查。
- 支持性是相对于意图而言的。同一段落可能支持“我们合规”也可能反对“我们有缺口”,具体取决于用户在论证什么。当立场或意图不确定时,同时展示支持和反对的来源,让用户选择。将方向呈现为邀请审查的标志,而非最终裁决。
备忘
- 如果某个提示“糟糕得令人震惊”,首先检查它是否是自动生成的模板(重复的“角色/目标/任务”是其标志)。像“这个生成器存在系统性问题”这样的结论,比在每个智能体上列举相同的缺陷更好。
- 在同一智能体内部进行对比:哪些字段是干净的,哪些是失败的。差异通常就是答案(带有
unknown选项的字段往往是干净的)。 - 以通俗语言对报告进行编辑润色:每项发现必须能让未阅读理论的人理解。
相关技能
属于一个小型开放智能体技能家族,专注于可信、清晰的沟通:
- reduce-hallucination — 审计LLM智能体;接地、引用、弃权。
- better-doc — 经典风格 + 智能简洁。
- numbers — 让数字有意义,并清晰呈现。