2026年7月12日 2 分钟阅读

Verbatimeter 实战:给你的 AI Agent 装上引用真实性检测

tinyash 0 条评论

AI Agent 越来越擅长写长回复、生成报告、引用来源。但一个问题始终悬而未决:它引用的内容真的在原文里出现过吗?

用过 RAG(检索增强生成)的朋友都遇到过模型凭空捏造引用、把上下文改写得分不清哪些是原文哪些是模型自由发挥的情况。传统方案靠一个”法官模型”(judge model)做二次评估——成本高、有偏见、不可复现。

Verbatimeter 走了另一条路:确定性字符串匹配。没有 LLM 调用、没有网络请求、不依赖任何评判模型——纯算法,每秒几十毫秒,告诉你答案中有多少字来自原文。

一句话使用

pip install verbatimeter

然后直接跑:

verbatimeter \
  --source "We propose a new simple network architecture, the Transformer, based solely on attention mechanisms" \
  --answer "We propose a new simple network architecture, the Transformer, based solely on attention mechanisms"

输出 matched=100% differing_tokens=0。把 solely 改成 partly,唯一不同的那个词会被标红。

三种用法,覆盖全部场景

1. CLI:一键验证

verbatimeter --source-file context.txt --answer-file answer.txt

verbatimeter --source-file context.txt --answer-file - < answer.txt

verbatimeter --source-file context.txt --answer-file answer.txt --quotes

verbatimeter --source-file context.txt --answer-file answer.txt --quotes --fail && publish

--quotes 是 Verbatimeter 最有特色的模式。它会只检查答案中用 "...""..."« ... »„..." 包裹的引用段——如果任何引号内的内容与原文不匹配,模型就是在编造引用

配合 --fail 后,可以把它放在 CI 流水线里做硬门控:

until verbatimeter --source-file ctx.txt --answer-file ans.txt --quotes --fail; do
  regenerate_answer > ans.txt
done

直到引用通过验证,才让答案进入下一环节。

2. Python 库:与 RAG 代码集成

from verbatimeter import check, check_answer, render_result

r = check(candidate_text, source_text, ngram=3)
print(r.matched_ratio)        # 0.79 — 79% 的词来自原文
print(r.longest_fragment)     # 最长连续匹配词数
print(r.total_differing_tokens)  # 不同 token 数

result = check_answer(answer, source, scope="quotes")
print(render_result(result))

返回的 Result 对象包含逐词匹配标记、连续片段、匹配率、不同 token 数、ROUGE-L 分数等完整细粒度指标。

3. 装饰器:一行集成进 Agent

最优雅的用法——用 @verify 装饰器一键包装你的生成函数:

from verbatimeter import verify

@verify(source_arg="context", scope="quotes")
def generate(question, context=None):
    return call_your_llm(question, context)

generate("What architecture does the paper propose?",
         context=retrieved_passages)

装饰器会自动处理流式输出——如果 generate() 是流式生成器,Verbatimeter 会在每个 chunk 到达时实时着色输出(绿色 = 原文匹配,红色 = 模型发挥),并且把完整的检测结果附加为 .result 属性:

answer = generate(question, context=ctx)
if answer.result.total_differing_tokens > 5:
    answer = regenerate_with_warning(question, ctx)

不需要改任何已有代码的接口——装饰器返回的仍然是 str,只是多挂了一个 .result

两种检测模式

Verbatimeter 用同一套词级对齐算法,提供两种检测视角:

模式匹配规则验证什么
逐词匹配(默认)连续 ≥3 个词完全一致模型有多少字是照抄原文的
子序列匹配--subsequence按顺序出现即可,可间隔新词模型是否用自己的话重述了原文

逐词匹配适合检测直接引用是否准确。子序列匹配适合检测改写后的忠实度——即使用词不同,只要核心词汇来自原文且顺序一致,就算忠实。

性能:毫秒级的确定性检查

Verbatimeter 的核心是词级动态规划对齐。实测数据(随机文本,取 5 次最佳):

原文词数候选词数逐词模式子序列模式
5001002.2 ms8.1 ms
1,00040014.9 ms65.9 ms
4,00040053.4 ms263.6 ms

对于大多数 RAG 场景(几千字的上下文、几百字的回答),每次检查在几十毫秒内完成。唯一的运行时依赖是 tiktoken(token 计数用),但也可以传入自定义计数函数,完全跳过 tiktoken

无障碍与配色

Highlight 配色支持四种主题:

verbatimeter --palette colorblind    # 蓝/橙 — 红绿色盲友好
verbatimeter --palette neon           # 亮绿/品红 — 暗色终端
verbatimeter --palette mono           # 粗体/反白 — 零色彩依赖

同时尊重 NO_COLOR 环境变量、自动检测终端能力,--json 输出纯机器数据。

适合谁用

  • RAG 应用开发者:确保 Agent 的回答确实基于检索到的上下文
  • AI 写作工具:自动标注哪些段落直接引用来源
  • CI/CD 流水线:在发布前阻断含伪造引用的内容
  • AI 安全研究者:确定性 metric 比 judge model 更可复现、更可审计

Verbatimeter 不做什么:不判断语义正确性、不检查"这个推理逻辑对不对"。它的职责非常狭窄——只回答一个问题:"这句话里的这些词,在原文中出现过吗?"——但回答得确定、瞬间、可复现。在 AI Agent 开始引用外部来源的时代,这层确定性验证是基础的水位线。

获取

发表评论

你的邮箱地址不会被公开,带 * 的为必填项。