Chain of Verification (CoVe)
验证链(CoVe)让 LLM 先起草答案,再提出有针对性的事实核查问题,独立回答每个问题,然后修改草稿。
验证链(CoVe)是一种提示方法,它通过让模型检查自己的草稿,减少大型语言模型(LLM)输出中的幻觉。模型先撰写初步答案,再规划简短的验证问题来检验其中的每个事实主张,独立于草稿回答这些问题,最后只保留验证结果支持的主张并撰写最终答案。Meta AI 的 Shehzaad Dhuliawala 及其同事在 2023 年的论文《验证链降低大型语言模型中的幻觉》中提出了该方法。它之所以有效,是因为相比在长答案中陈述同样的事实,模型回答简短而聚焦的问题时准确度更高:在论文的列表问题实验中,Llama 65B 列出的实体只有约 17% 正确,但同一模型正确回答单个验证问题的比例约为 70%。
验证链的工作方式#
CoVe 使用同一个模型完成四个步骤:
- 起草基准答复:模型照常回答查询。若要求列出出生于纽约市的政治人物,它可能会列出 Hillary Clinton、Donald Trump 和 Michael Bloomberg。
- 规划验证问题:模型阅读草稿,并为每项可核实的主张编写一个问题,例如“希拉里·克林顿出生在哪里?”和“迈克尔·布隆伯格出生在哪里?”
- 独立回答每个问题:模型会在不包含草稿的新提示中回答这些问题,以免只是重复之前的错误。克林顿出生于芝加哥,布隆伯格出生于波士顿,而特朗普出生于皇后区。
- 撰写修订后的最终答复:模型会根据答案修改草稿,删除或纠正所有未通过核实的主张;在这个例子中,最终名单只剩下特朗普。
第三步隔离各个问题的严格程度很重要。论文比较了四种变体:联合式会在仍包含草稿的同一个提示中完成规划和回答;两步式会在第二个不含草稿的提示中回答所有问题;分解式会为每个问题单独使用一个提示;分解加修订式则会额外明确检查每个答案是否符合原始主张。所有在验证提示中排除草稿的变体,其幻觉都少于联合式,因为模型一旦能看到自己的草稿,就倾向于重复其中的错误。
结果#
使用 Llama 65B 时,CoVe 将 Wikidata 列表问题的精确率从 0.17 提高到 0.36,并将闭卷 MultiSpanQA 基准上的 F1 从 0.39 提高到 0.48。在长篇人物传记任务中,factor+revise 变体将 FActScore(即有 Wikipedia 支持的原子事实所占比例)从 55.9 提高到 71.4,超过了 ChatGPT 报告的 58.7 和基于检索的 PerplexityAI 的 61.6。这些提升也带来了推理延迟方面的代价:因子化变体对每个验证问题都需要额外调用一次模型。
CoVe 与相关技术的比较#
- 思维链提示:让模型在回答前逐步推理,有助于解决逻辑和数学问题。CoVe 会在草稿生成后核查其中的事实陈述。
- 检索增强生成(RAG):从一开始就以检索到的文档作为答案依据。原始 CoVe 只依赖模型自身的知识;如果通过搜索引擎或文档索引来回答验证问题,两者就能自然结合。
- 语义熵:通过采样多个答案并衡量它们的含义差异,检测可能存在的幻觉。CoVe 则更进一步,会修正答案。
- AI 辩论:两个模型分别为相反立场辩论,让裁判找出错误。CoVe 则由单个模型自行检查,不需要对手。
借助工具验证陈述#
验证问题不必依靠模型的记忆来回答。管线会将这些问题交给掌握真实信息的工具:查询公开事实的搜索引擎、存储公司文档的向量数据库,或用于验证图像相关陈述的视觉模型。当视觉语言模型生成图像描述时,Ultralytics YOLO26目标检测模型可以独立于草稿,根据图像描述回答每个“有多少”问题:
from collections import Counter
from ultralytics import YOLO
# Claims extracted from a draft caption: "A bus, four people, and a bicycle on a street"
draft_counts = {"bus": 1, "person": 4, "bicycle": 1}
# Answer each verification question with a detector that never sees the draft
model = YOLO("yolo26n.pt")
results = model("https://ultralytics.com/images/bus.jpg")
result = results[0]
detected = Counter(result.names[int(c)] for c in result.boxes.cls)
# Keep claims the detector confirms and mark the rest for revision
for name, claimed in draft_counts.items():
verdict = "keep" if detected[name] == claimed else f"revise to {detected[name]}"
print(f"How many '{name}'? Draft: {claimed}, detector: {detected[name]} -> {verdict}")每一行输出都对应一个验证问题,其中包含草稿中的陈述、检测器独立给出的答案,以及最终图像描述采用的判定结果。
实际应用#
- 医疗健康:总结医学文献的助手会在临床医生查看摘要前,通过单独提问核实药物名称、剂量和相互作用。
- 问答:搜索和支持助手会检查列表答案、日期和人物传记事实;论文测得最大提升的正是这些类型的陈述。
- 制造业报告:负责起草交接班报告的 LLM 会在提交报告前,将其中提及的每个缺陷与检查系统的日志进行核对。
- 文档处理:从合同或发票中提取的值会逐个字段重新询问,并与首次提取结果进行比较。
局限性#
CoVe 能发现模型前后不一致地犯下的错误,但无法发现模型在所有上下文中都持有的错误认知,因为独立答案会重复同一个错误。它会检查事实陈述,却不会处理正确事实之间的错误推理,而且会增加每个答案所需的模型调用次数。论文中表现最好的变体仍有 28.6% 的传记原子事实缺乏支持,这是其 71.4 FActScore 的剩余部分。










