Enoki:幻觉检测不再二选一,一份事实同时判真假、标位置

如果你让一个 LLM 写一段关于 Suede 乐队的文字,它给出这样一句:

"Suede, an influential English rock band formed in Bath, Somerset, in 1992, played a significant role in the Britpop movement..."

这句话里有真有假。"influential English rock band"、"played a significant role in the Britpop movement"——这些大致是对的,但 "formed in Bath, Somerset, in 1992" 这一短片段是错的(Suede 实际于伦敦组建)。一个事实性护栏需要做两件事:第一,告诉用户"哪条声明没证据"(claim-level 验证);第二,告诉用户"原文哪几个字是编的"(span-level 定位)。

过去三年,这两件事通常需要两套系统分别去做。2026 年 9 月,一篇标题为 Enoki: Efficient Multi-Level Hallucination Detection 的 arXiv 论文 Enoki 提出了一个关键洞察:用同一种"文本锚定的关系事实"作为中间表示,可以让一份抽取结果同时扛起两层粒度的工作。

幻觉检测为什么长期只能"二选一"

先把"二选一"的具体形态看清楚。

第一条路是 claim-level 验证。代表工作是 FActScore FActScore。它把长文分解成 atomic facts("独立、单一、可验证"的最小事实单元),逐条对照 Wikipedia 打 Supported / Not-supported / Irrelevant 三分类,最终输出一个 supported 占比——InstructGPT 42.5%、ChatGPT 58.3%、PerplexityAI 71.5% 是它给出的早期实证数字。FActScore 给出了"哪条声明错了",但不知道"具体哪几个字错了"。

FActScore 把长文分解为 atomic facts,逐条打 Supported / Not-supported / Irrelevant 三分类,并聚合为 FActScore 比例分数

图注:图上展示一段 LM 生成的人物传记被拆解为多个 atomic facts,每个 fact 右侧用色块标签(绿 Supported / 红 Not-supported / 灰 Irrelevant)逐条标注;图下给出两个示例 generation 的 FActScore 分数(上 66.7%、下 10.0%),并指出"先前工作会给两段都打 0 分"。来源:FActScore。

第二条路是 span-level 定位。代表工作是 RAGTruth RAGTruth。它在生成 response 上做 word-level 标注,把每段幻觉文字高亮出来——比如图里的 "December 2021" 这种短片段——并按 Evident Conflict / Subtle Conflict / Evident Introduction / Subtle Introduction 四类分类。GPT-4-turbo 在 RAGTruth 上 span-level F1 仅 28.3,fine-tuned Llama-2-13B 可达 52.7——这组数字说明 span-level 即使最强 LLM 也做得不好,但有了高质量 word-level 标注,小模型微调可以超过 SOTA LLM。RAGTruth 给出了"哪几个字是编的",但不附 atomic claim 的 verified / not-verified 标签。

回到 Suede 那句话,claim-level 检测会把整句标红,span-level 检测只标 "formed in Bath, Somerset, in 1992" 这一短片段。两种标注都有价值,但同一段文本想要同时得到"哪条声明错了 + 哪几个字错了"就要付出额外代价:LLM-heavy 流水线要多次"分解-验证"调用,模块化系统还要额外的 claim-to-span 对齐模块。

RAGTruth 在 LLM response 上做 word-level span 标注,右侧高亮的 "December 2021" 即人评标注的幻觉 span

图注:三阶段横向流水线——左 Structured Data(餐厅 JSON 字段)→ 中多个 LLM 生成 response → 右同一 response 中 "December 2021" 被高亮为人评标注的 hallucination span。来源:RAGTruth。

这就是 Enoki 想解决的真问题:能不能找到一种中间表示,让一份输出同时承担两种粒度的工作,省掉那个昂贵的对齐模块?

一份"事实 + 锚点"如何同时扛起两层粒度

Enoki 的答案是 text-anchored OpenIE relational fact。把每个事实抽成 (subject, relation, object) 三元组,并锚定回原文 token。

Open Information Extraction(OpenIE)是一类从文本中抽 schema-free 三元组的方法,不依赖预定义知识库或关系表。Enoki 的关键动作不是发明新模型,而是在三元组之上加一个"原文锚点":每条 (subject, relation, object) 同时记录"它由原文哪几个 token 产生"。这一步把抽取从"语义层面的事实单元"升级为"语义 + 位置绑定的中间表示"。

落到 Suede 这句话上,一条 text-anchored fact 会长这样:

  • (Suede, formed in, Bath) → 锚定原文 token [formed in Bath, Somerset, in 1992]
  • (Suede, played significant role in, Britpop movement) → 锚定原文 token [played a significant role in the Britpop movement]

第一条事实验证失败(不支持 Bath 组建),span 直接投影回 "formed in Bath, Somerset, in 1992"。第二条验证通过,保留。同一份 facts 既给出了 claim-level 判断("Suede 组建地点"错了),又给出了 span-level 位置("formed in Bath, Somerset, in 1992"这段文字是错的)。那个昂贵的 claim-to-span 对齐模块——消失了。

Enoki 还引入了 incremental decomposition(增量分解):把一条事实拆成由粗到细的嵌套三元组,比如 Dutse | is | city → Dutse | is | capital city → Dutse | is | capital city of Jigawa State。这样验证可以区分"被支持的粗粒度事实"与"不被支持的精炼",把错误投影到新引入的 span 上——粒度更细,定位更准。

那 Enoki encoder 路线所蒸馏的 IGL 架构长什么样?来自 OpenIE6 OpenIE6——它把 OpenIE 建模为 2-D grid labeling:行是不同的抽取,列是输入词,单元格打 S/R/O/N 标签。逐轮 BERT 嵌入 + 迭代 self-attention + 标签反馈;每轮的标签嵌入再喂回下一轮,保留前一轮抽取的依赖信息。Enoki-Encoder 把这一形式蒸馏到 ModernBERT-large——这是后面会讲的工程实现,但 IGL 的"逐行迭代 + 标签反馈"机制正是它能被 encoder 化、保留 OpenIE 抽取质量的形式基础。

IGL 架构:BERT 嵌入 + 迭代 self-attention + 标签反馈;附加 [is]、[of]、[from] 三个特殊 token 作为辅助占位

图注:图左 BERT 词表示进入迭代 self-attention;图右每轮经全连接层产生一条抽取的标签,并把生成标签的嵌入反馈到下一轮。来源:OpenIE6。

读者带走的核心洞察:Enoki 的关键想法不是新模型,而是把"中间表示"从"一组句子级判断"换成"一组带原文锚点的事实"。这一换,对齐模块就可以消失。

三段式管线 + 三档可切换的抽取后端

Enoki 的管线分成三段:Fact Extraction(抽三元组 + 锚点)→ Fact Verification(用 NLI 验证)→ Span Projection(不支持事实投影回原文 span)。三段串联之后,自然产出 claim-level 与 span-level 两层标签。

具体机制:Fact Extraction 用 OpenIE-style 后端从 response 每一句抽取 schema-free relational triples,并强制 text anchoring(hallucination-relevant arguments 必须与 response span 对齐,用 spaCy 做 sentence segmentation)。Fact Verification 把每条 triple 转成 textual hypothesis,用 NLI-style verifier 打分。

以那个典型的长 answer 为例:"Suede, an influential English rock band formed in Bath, Somerset, in 1992, ..."——其中 "formed in Bath, Somerset, in 1992" 整段都是需要被检测出来的 hallucination(Suede 实际于 1989 年在伦敦组建)。Fact Extraction 从同一句里抽出多条由粗到细的 incremental triples(都源自待核验原句,并非另起事实):粗粒度 (Suede, is, English rock band)、中间层 (Suede, formed in, Bath)、精炼 (Suede, formed in, Bath, Somerset, in 1992)。粗粒度被证据支持,意味着"Suede 是英国乐队"这一最粗骨架成立;从中间层开始则进入待核验的组建信息,精炼层再叠加"Somerset"与"1992"这两段新文本。Fact Verification 对每条 triple 跑 NLI 后判定:粗粒度通过,涉及组建信息的那几条则整条不被支持——精炼 triple 因其 object "Bath, Somerset, in 1992" 缺乏证据而整体判为 unsupported。这里要讲清楚"object delta"到底指什么:它指精炼 triple 相对上一层较粗 triple,新引入且不被支持的那段 object 文本。投影规则跟着锚点走:精炼 triple 的 object token 在抽取阶段就登记了它由原文哪些 token 产生("Bath, Somerset, in 1992"),所以 unsupported 判定一旦落到这条精炼上,Span Projection 直接把这段不被支持的 object 文本按锚点回写到原句对应的字面位置,于是"formed in Bath, Somerset, in 1992"被打成 hallucination span——错误被精确地圈在组建信息这段文字上,而不是把整句一并拉下水。context 超长时按 max context window 切 chunk,相邻 chunk 用 1-sentence overlap,最终取所有 chunk 的最大 entailment 分数。Span Projection 把 unsupported facts 的 object delta 直接投影回 answer 中对应的文字——这正是"共享表示"的关键收益:claim-level label 和 span-level localization 从同一份 facts 派生。

Enoki 主架构图:三 regime 共享统一接口的 pipeline,产出 text-anchored OpenIE facts → verification → 投影回 span → claim + span 双层标签

图注:横向三 regime(Enoki-LLM / Enoki-Encoder / Enoki-Rule)并联做 OpenIE 抽取,输出 text-anchored 关系事实,进入 verification 层对照 reference context 后回投影到 span,并产出 claim-level 与 span-level hallucination 标签。来源:Enoki。

Enoki 的另一个反直觉设计是:同一套接口支持 LLM-based / encoder-based / rule-based 三种 regime,用户在精度和成本之间换挡而不重写代码。

抽取后端实现精度上限延迟是否需训练典型部署成本
Enoki-LLMCycleOIE prompt + 三条 incremental guideline最高高否(但需 LLM API)GPT-5 / GPT-OSS-120B 推理成本
Enoki-EncoderModernBERT-large + IGL + max_depth 14,蒸馏自 Enoki-LLM中低是(蒸馏)单卡 GPU,0.4B 参数
Enoki-Rule35 条 dependency-parse 规则跑在 spaCy en_core_web_trf中低最低否(deterministic)仅 spaCy 推理,无训练成本

Enoki-LLM 是精度最高的版本;Enoki-Encoder 是蒸馏自 Enoki-LLM 的中间档;Enoki-Rule 是 deterministic 无训练最低延迟档。三种 regime 共享同一套接口——EnokiPipeline(method=...)——意味着用户可以按预算选最便宜或最准的那一档。

Encoder-based 路线在 2025-2026 的同期工作中并不孤立。LettuceDetect LettuceDetect 同样基于 ModernBERT,做的是 token-level 二分类(每个 answer token 预测 supported / hallucinated),在 RAGTruth 上 example-level F1 达到 79.22%。两者的共同点是"用 encoder-only 替代 LLM 来降低成本";差异在于 LettuceDetect 输出 binary 标签,Enoki 的 encoder 路线输出结构化三元组——下游验证与回投影由 Enoki 的其余模块负责。

LettuceDetect 架构:(Question, Context, Answer) 三元组 → ModernBERT token classifier → per-token hallucination 概率;context 与 question 的 token 在 loss 计算时被 mask

图注:左到右的数据流——三元组拼接后做 tokenization,送入 ModernBERT 做 token 级分类;红线指示 context 与 question 的 token 在损失计算时被屏蔽;输出对每个 answer token 给 hallucination 概率,span-level 输出由连续高置信度 token 聚合。来源:LettuceDetect。

工程实现细节来自官方 Hugging Face 页面 Enoki assets 与 GitHub 仓库 Enoki repo:s-nlp/enoki-openie-encoder 的模型卡明确写出 ModernBERT-large + IGL + max_len128 + 0.4B params + 蒸馏自 Enoki-LLM;调用时必须 trust_remote_code=True;建议 min_confidence=0.7–0.8 用于 smaller, higher-precision result set。GitHub README 直接命名三种后端为 Enoki-Encoder / Enoki-Rules / Enoki-LLM,并通过 EnokiPipeline(method=...) 统一调用。

EnokiQA:为什么需要一份"双粒度对齐"的标注数据

方法再漂亮,没有合适的评测基准也讲不清"统一表示"是否真的有效。EnokiQA EnokiQA 是 Enoki 团队专门为此发布的标注数据集。

现有评测数据集多为单粒度。FActScore 仅 claim-level,RAGTruth 仅 word-level span,PsiloQA 仅多语 span-level PsiloQA。这意味着如果一个系统想同时输出 claim 验证 + span 定位,现有的 benchmark 要么只能量 claim、要么只能量 span,无法直接做"统一接口"的横向比较。

EnokiQA 的设计动机是:同一份标注同时带 claim-level 验证标签和 span-level 定位标签,支撑三层评测(sentence / claim / span)共用同一字段。具体做法:按句切分 answer,从每句抽取 incremental (subject, predicate, object) triples,用 NLI-style verifier 在 full Wikipedia article 上验证 verbalized triple,输出 entailment / neutral / contradiction 概率;hall_prob = neutral + contradiction,> 0.5 视为 hallucinated;Unsupported triple 直接投影回 answer span,从而同一份 intermediate facts 同时输出 claim-level decision 与 span-level localization。

EnokiQA 有两个不同的 artifact,必须分开讲。labeled 端 3,990 个样本(dev 1,995 + test 1,995),每个含 NLI 标注;test split 在 7 个生成模型上严格均衡(每个 285 条);dev/test 各含约 6 万句(58,454 / 57,987)、约 50 万 triples(499,923 / 492,268,triple 级 hallucination 率 78.9% / 77.2%);平均 answer 长度 5,682 字符、context 长度 14,879 字符,明显长于 RAGTruth(QA only 650/1332)、PsiloQA-en(381/551)、MuSHROOM-en(239/8011)等单粒度数据集。unlabeled 端 19,594 个 QA 样本(train split),不含 hallucination labels,仅含 question / answer / paragraph_context / full_page_context / popularity_tier 等字段,用于训练或自监督。Wikipedia popularity tier 分布:low(<100 views/day)11,423;medium(100–1,000 views/day)7,079;high(>1,000 views/day)1,092。七个生成模型是 Qwen2.5-7B/14B/32B-Instruct、Qwen3-4B、Qwen3-8B、Llama-3.1-8B-Instruct、Mixtral-8x7B-Instruct(按 Enoki assets 官方数据集卡列明)。

PsiloQA 是 EnokiQA 在"多语言"维度上的同期对照 PsiloQA。PsiloQA 跨 14 种语言(Arabic、Basque、Catalan、Chinese、Czech、English、Farsi、Finnish、French、German、Hindi、Italian、Spanish、Swedish),用 GPT-4o 自动标注(成本约 $535),共 63,792 训练样本。但 PsiloQA 只标注 span-level,不标注 claim-level——它和 EnokiQA 在"单语 + 双粒度" vs "多语 + 单粒度"两个维度上互补。

PsiloQA 四步标注 pipeline:GPT-4o 生成多语 QA → no-context 诱发幻觉 → [HAL] 标签圈 span → 过滤

图注:横向四步流程图——Step 1 多语 QA 生成(GPT-4o + Wikipedia);Step 2 无上文设置下诱发幻觉;Step 3 GPT-4o 用 [HAL] 标签圈出 span-level 不一致;Step 4 过滤不完整 / 主观 / 拒答样本。来源:PsiloQA。

人工核验(test split 抽 100 例):human-human character-level agreement = 0.80;automatic pipeline vs human sentence-level F1 = 0.87;automatic pipeline vs human span-level Coverage F1 = 0.57。这里要把两组数据分开读。句级(sentence-level)维度上,自动流程与人工的 F1 达到 0.87,说明句子级的二分类判断已经基本稳定。Span 边界(span-level Coverage F1)则只有 0.57——这暴露了一个尚未解决的局限:自动流程能在大致位置圈出幻觉文字,但 span 的精确边界与人工标注仍有明显落差。换句话说,自动标注在"这条声明有没有错"上已经可用,但在"错的是哪几个字"上仍不够精细,双粒度对齐的真实门槛正是这 0.57 与 0.87 之间的差距。

EnokiQA 不只是新数据,而是评测基础设施的填空——没有双粒度对齐标注,"统一接口"这条路就没法被系统比较。

三层实测 + 精度成本权衡

三层主结果放在 entity-level、span-level、sentence-level 三种粒度上分别报:

Entity-level(HalluEntity AUROC / AUPRC):Enoki-LLM(增量)79.70 / 55.09 居首;Enoki-LLM(非增量)78.11 / 54.78;Enoki-Rule 76.41 / 46.81;Enoki-Encoder 70.47 / 44.25。强基线对照:LettuceDetect(ModernBERT-large)68.61 / 35.70;FT on PsiloQA(ModernBERT-large)70.98 / 38.68;ZS RAGTruth Prompt(GPT-5.2)77.63 / 36.63;OpenIE MinIE 67.14 / 39.77——Enoki-LLM 比 MinIE 高约 +15 AUPRC。

Span-level(Span Coverage F1):MuSHROOM 上 Enoki-LLM 52.07 居首,Enoki-Rule 49.18,Enoki-Encoder 46.96。RAGTruth(QA only)上 FT on RAGTruth(Qwen3-8B)42.20 居首,haldetect 41.54,Enoki-LLM(非增量)41.35。PsiloQA 上 Enoki-LLM 71.15 居首,Enoki-Rule 65.73,Enoki-Encoder 65.51。MuSHROOM 上 LettuceDetect(ModernBERT-large)仅 1.23——LettuceDetect 这个 token classifier 在 MuSHROOM 上迁移表现很差。

Sentence-level(Factcheck-Bench / ANAH-250 / RAGTruth-250 F1):Factcheck-Bench 上 Claimify(GPT-5.2)F1 72.71 居首,Enoki-Encoder 63.04。ANAH-250 上 NLI 74.80 居首(被排除在 top-3 之外,因为是无 decomposition 的 reference)。RAGTruth-250 上 Enoki-LLM 76.42 居首,RefChecker(GPT-5.2)76.31,Enoki-Encoder 69.09。Sentence-level 上 Enoki 没有全面胜出——这是 Enoki 自陈的 tradeoff:sentence-level 不需要 exact localization 时 decomposition-free NLI 也能很强;Enoki 的真正优势在"同时要 verification 又要 localization"。

成本-精度权衡是 Enoki 标题里 "Efficient" 一词的实证。RAGTruth 上 Enoki-Encoder 在 0.13s 处达到 69.1% F1,比强基线 4–10× 快;Enoki-LLM 达到最高 F1 76.4%,相对 Claimify(66.6%)在相近 latency 下 +9.8 points。rule-based / encoder-based 路径相对 multi-stage LLM pipeline 达到 two orders of magnitude lower latency。

RAGTruth 上 accuracy-efficiency trade-off:Enoki-Encoder 0.13s / 69.1% F1,Enoki-LLM 76.4% F1,rule/encoder 路径比多阶段 LLM 流水线快两个数量级

图注:横轴 latency、纵轴 F1、点大小表示 FLOPs per sentence。Enoki-Encoder 在左下角低延迟区拿到 69.1% F1,Enoki-LLM 拿到最高 F1 76.4%。"4–10× faster"归属 Enoki-Encoder,"two orders of magnitude lower latency"归属 rule-based / encoder-based 路径——不要把这两组数字归给 Enoki-LLM。来源:Enoki。

读者要解读的是:Enoki 不是全面 SOTA。它的优势在"两层同时输出 + encoder 后端比 LLM 基线快一个数量级"。如果你的场景只需要 sentence-level 判断,不在乎 exact localization,decomposition-free NLI 已够用;如果你的场景同时需要 claim 验证和 span 定位,Enoki 的统一表示就是当前性价比最高的选择之一。

边界与可改进方向

Enoki 自陈四条边界(Enoki Limitations 章节):

  1. 依赖 fact extraction 的覆盖与粒度。extractor 漏掉相关 proposition、合并不同事实、或输出过于粗糙的 argument span 时,verifier 无法恢复——这是 explicit verification 的 trade-off。
  2. Incremental projection 的精度。依赖"相关 refinements 大致嵌套",当多部分同时不支持或错误 non-locally 交互时,projected span 可能比人工标注粗糙。
  3. Sentence-level scope。当前实现主要做 sentence-by-sentence 分解;现有的 decontextualization 模块在消融实验中没有稳定增益;cross-sentence 现象(coreference、ellipsis、discourse-level attribution)只被部分处理。
  4. Verifier 敏感性。Enoki 是 extraction–verification pipeline,最终决策仍依赖 verifier 的 calibration;robust verifier 可以容忍 extraction noise,brittle verifier 即便事实提得好也可能失败。

翻译成工程视角:抽取器覆盖不够 = 可能漏掉事实;增量投影在复杂事实结构下 span 可能粗糙;sentence 范围 = 跨句 coreference 处理不完整;verifier 敏感 = 上游验证器一差下游全垮。

Decontextualization ablation(Enoki §5.5)给出更细的判断:对 Enoki-Rule 加 FastCoref 去语境化(pronoun → antecedent),HalluEntity AUROC 76.41→75.83(-0.58);MuSHROOM F1 49.18→49.43(+0.25);PsiloQA F1 65.73→65.50(-0.23);RAGTruth F1 27.87→30.92(+3.05,显著增益);ANAH-250 F1 63.78→64.98(+1.20);RAGTruth-250 F1 63.45→65.00(+1.55)。论文结论:去语境化作为 optional 步骤,默认不开启。

多语言扩展仍是开放问题。PsiloQA PsiloQA 覆盖 14 种语言但只标注 span-level;EnokiQA 双粒度对齐但仅英文。Enoki 的统一表示是否能在多语场景下保持"两层同时输出"的优势,目前没有公开评测。

判断 Enoki 是否值得引入到你的工程:如果你的场景是高风险问答(医疗、法律、金融),事实性护栏必须同时给出"哪条声明错了"和"哪几个字错了",Enoki 的统一表示是当前性价比最高的路径之一。如果你的场景只需要"这段文字有没有幻觉"的二元判断,decomposition-free NLI 已够用,不必引入抽取-验证-回投影的复杂度。如果你的场景跨语种,Enoki 尚未验证多语能力,可以等下一代。

Enoki 的真正贡献不在某一项数字刷新了 SOTA,而在把"claim 验证"与"span 定位"整合进同一表示的设计思想——这是 FActScore 与 RAGTruth 范式之后的一次系统化整合尝试,也为后续评测基准和工程实践提供了可复现的脚手架。


参考文献

想深入可以读原文:Enoki: Efficient Multi-Level Hallucination Detection — arXiv:2609.00581

Enoki:幻觉检测不再二选一,一份事实同时判真假、标位置