跳转至

幻觉与事实性

“幻觉”通常指输出流畅,却与输入证据、可验证事实、任务约束或真实工具状态不一致。它不是单一故障:事实错误、引用错误、时间过期、推理错误和状态误报需要不同分母、证据与修复。

评测协议

先冻结判定参照:

类型 参照 示例
内在一致性 给定上下文 摘要改变原文数字
外部事实性 指定权威来源集合 编造不存在的论文
引用支持 被引用页面与主张 链接存在但不支持结论
完整性 题目要求或参考事实集 漏掉关键限制
时效性 查询时间与对象版本 用旧任职信息回答当前问题
推理/计算 规则、程序或 verifier 中间计算与答案矛盾
工具状态 实际环境终态 声称已保存但对象未变化
多模态 grounding 图片、音频、视频 将画面外对象写进描述

开放域评测还需冻结检索源、索引时间、网络访问和证据质量规则。若来源集合本身不完整,结果只能表示“在该证据范围内未找到支持”,不能直接判定世界事实为假。

统计对象:原子主张

将回答拆成原子主张

\[ C(y)=\{c_1,\ldots,c_m\}. \]

每个 \(c_i\) 关联零个或多个证据,并标为:

supported
contradicted
not supported
unknown / insufficient evidence
stale for the requested time
not factual / not applicable

FActScore 提出将长文本分解为 atomic facts,并计算可靠知识源支持的比例。LongFact / SAFE 进一步研究搜索增强的长文本事实评测。两者提供可复用框架,但 claim extraction、检索和 judge 都是可能出错的测量组件。

原子事实聚合必须保留 unknown,并把引用覆盖与事实支持分开。下面每个 item 已是 claim extractor 输出的最小事实;citations 只表示答案声称的 evidence edge,不代表该边已经被判定为支持。

def atomic_fact_report(claims):
    factual = [claim for claim in claims if claim["label"] != "not_factual"]
    allowed = {"supported", "contradicted", "not_supported", "unknown", "stale"}
    if any(claim["label"] not in allowed for claim in factual):
        raise ValueError("unknown factuality label")
    supported = sum(claim["label"] == "supported" for claim in factual)
    negative = {"contradicted", "not_supported", "stale"}
    unsupported = sum(claim["label"] in negative for claim in factual)
    unknown = sum(claim["label"] == "unknown" for claim in factual)
    decidable = supported + unsupported
    support_precision = supported / decidable if decidable else None
    decidable_rate = decidable / len(factual) if factual else 1.
    cited = sum(bool(claim["citations"]) for claim in factual)
    citation_coverage = cited / len(factual) if factual else 1.
    return support_precision, decidable_rate, citation_coverage, unknown
claims = [
    {"label": "supported", "citations": ["e1"]},
    {"label": "contradicted", "citations": ["e2"]},
    {"label": "unknown", "citations": []},
    {"label": "not_factual", "citations": []},
]
precision, decidable, coverage, unknown = atomic_fact_report(claims)
assert precision == .5 and decidable == 2 / 3
assert coverage == 2 / 3
assert unknown == 1

若所有事实都是 unknown,support precision 返回 None 而不是零或满分。生产 pipeline 还要版本化 claim extraction、检索截止时间、evidence span 与 entailment judge,并用人工标注量化每一层误差;citation coverage 高不等于 citation correctness。

分母与指标

设 \(S\)、\(U\)、\(K\) 分别为 supported、unsupported/contradicted 与 unknown 的可判定计数,\(A=S+U+K\) 为全部事实主张。

Support precision

\[ \operatorname{support\ precision} =\frac{S}{S+U}. \]

unknown 不应静默从报告中消失,因此同时报告可判定率:

\[ \operatorname{decidable\ rate} =\frac{S+U}{A}. \]

若将 unknown 一律算 unsupported,会把检索覆盖不足混入生成事实性;若全部排除,又会奖励无法验证的主张。

Completeness

有独立参考需求或事实集 \(G=\{g_1,\ldots,g_q\}\) 时:

\[ \operatorname{completeness} = \frac{|\{g\in G:\text{answer covers }g\}|}{|G|}. \]

没有近似完整的 \(G\) 时,不应把回答长度或 claim 数称为 recall。支持率高的短回答可能极不完整,因此 support precision 与 completeness 必须分开。

Freshness

对有时间要求的主张,记录证据时间 \(t_e\)、对象版本 \(v_e\) 与查询截止 \(t_q\)。freshness 不是“网页能打开”,而是证据是否在目标时间窗内支持同一对象和版本。至少报告:

  • 有时间要求的 claim 数;
  • 具备可核验证据时间的比例;
  • stale claim 比例;
  • 未披露更新时间的 unknown 比例。

引用正确性

引用评测分开:

  1. citation validity:目标可访问且对象正确;
  2. citation entailment:证据支持主张;
  3. citation completeness:需要证据的 claim 是否都覆盖;
  4. source quality:来源是否适合该主张;
  5. source freshness:时间与版本是否匹配。

“有引用”不等于“引用支持”,引用多也不等于事实完整。

检测机制

有参考或 verifier

exact match、结构化比较、计算器、编译器、测试和数据库状态适合确定性任务。parser 应保留 invalid、timeout 和 infra error,不能全部归入事实错误。

多次采样

SelfCheckGPT 用多次采样的一致性检测可能不可靠的陈述。直觉为

\[ \operatorname{risk}(c)\uparrow \quad\text{when}\quad \operatorname{semantic\ disagreement} (c_1,\ldots,c_k)\uparrow. \]

表面字符串差异不是语义冲突;多个样本也可能稳定复述同一错误。一致性是 uncertainty signal,不是事实 verifier。

检索增强

RAG 将外部文档带入生成。端到端错误可按阶段审计:

\[ P(E) \le P(E_{\text{retrieve}}) +P(E_{\text{read}}\mid \neg E_{\text{retrieve}}) +P(E_{\text{generate}}\mid \text{usable evidence}). \]

这是错误上界式的诊断分解,不假设事件独立。应分别测 retrieval recall、evidence selection、entailment 和有证据时的 generation。

RAG 深读解释原作的 latent-document marginalization 与今天 retrieve–rerank–generate 管线的区别;检索增强提供可更新证据路径,却不自动保证引用支持或来源追踪。

实现契约

逐 claim 保存:

answer and claim IDs
claim extractor/version/span
query and retrieved evidence IDs
source URL/object/version/timestamps
entailment label, judge/verifier version and confidence
supported/contradicted/unknown/stale status
human audit and disagreement

网页内容会变化,证据需保存 digest 或合法可重放 snapshot。judge 升级后应在同一 claim/evidence 上 bridge,而不是覆盖旧标签。

缓解分层

数据与训练

  • 去重、时间标注与来源质量;
  • 反例和“证据不足”行为;
  • 引用、工具状态与长上下文监督;
  • 区分事实、推断和未知。

推理与工具

  • 先拆主张,再逐条检索和验证;
  • 数字、代码和状态使用确定性工具;
  • 允许澄清、abstain 和人工升级;
  • 写操作后读取真实对象,不以文本声明为完成证据。

系统

  • 来源、时间和 ACL 随 chunk 传播;
  • 检索空结果与冲突证据显式进入模型状态;
  • 高风险输出需要独立 verifier;
  • 监控支持率、unknown、stale、拒答和 coverage,而不是只看接受率。

正确性与攻击失效

  • claim 拆得越细分数越高/低:原子化规则改变分母。
  • 只检索支持证据:confirmation bias,未搜索反证。
  • unknown 被删除:检索失败样本从分母消失。
  • 引用外观欺骗 judge:链接格式被当作支持。
  • 旧网页覆盖新事实:freshness 与对象版本未核对。
  • 同一模型生成并评判:共享偏差和记忆。
  • 检索文档含 prompt injection:评测器或 Agent 被不可信文本劫持。
  • 无限拒答降低错误率:coverage 和 usefulness 崩溃。
  • 工具返回成功码即视为成功:业务终态未重读。

何时不用自动事实分数

法律、医疗、金融、实时政治、复杂科学争议和高影响状态变化,不能只依赖自动 claim/judge 总分。应使用领域专家、权威原始来源和明确时间边界。纯创作、意见或不可证伪陈述也不应被强行转换为事实 claim。

验证与报告卡

  1. 在人工双盲子集上测 claim extraction、retrieval 和 entailment 各自误差。
  2. 按 claim 数、领域、来源、时间、回答长度和可回答性分层。
  3. 同时报 support precision、decidable rate、completeness、freshness 和 refusal。
  4. 对 supporting/contradicting evidence 顺序交换,检查 judge 稳定性。
  5. 用过期、无关、伪引用和注入文档做攻击测试。
  6. 记录检索和 judge 预算,避免更大搜索成本被写成模型事实能力。
target domain and reference/source policy
model, retrieval index and execution date
claim extraction and atomicity protocol
evidence snapshot and source-quality rules
support/unknown/stale denominators
completeness reference set
judge/verifier/human audit and confidence intervals
coverage, refusal, latency and cost
known source gaps and contamination

概率与 abstention 见校准与不确定性,引用与 judge 攻击见生成式评测与 LLM Judge,实现入口见评测工具。

Reference