记忆点:先答、再问、独立查、按证据改;模型自证不等于事实核验。
💡 答案要点
CoVe = 让模型先写草稿,再自己出验证题,验证后再重写,形成闭环
CoVe vs CoT 的本质区别
| 维度 | CoT(逐步思考) | CoVe(链式验证) |
|---|---|---|
| 目标 | 提高推理准确性 | 减少幻觉/事实错误 |
| 流程 | 生成→输出答案 | 生成→质疑→验证→修正 |
| 自反思 | ❌ 没有自我批判 | ✅ 核心是自批评 |
| 适用场景 | 数学/逻辑推理 | 知识类问答/RAG生成 |
CoVe 四步流程
展开 Python 代码示例(47 行)
python
class ChainOfVerification:
def __init__(self, llm):
self.llm = llm
def run(self, query, context=""):
# Step 1: 基线响应 —— 生成初稿
initial_response = self.generate_initial(query, context)
# Step 2: 规划验证 —— 模型自己找初稿中的可疑点
verification_questions = self.plan_verifications(query, initial_response)
# Step 3: 执行验证 —— 独立回答每个验证问题(不参考初稿)
verification_answers = []
for vq in verification_questions:
answer = self.llm.call(f"用已知事实回答:{vq}")
verification_answers.append(answer.strip())
# Step 4: 最终重写 —— 基于验证结果修正初稿
final = self.rewrite_using_verification(
query, verification_questions, verification_answers
)
return final
def plan_verifications(self, query, draft):
"""让模型找出初稿中可能出错的地方"""
prompt = f"""
问题:{query}
当前回答:{draft}
请列出 3-5 个可以验证这个回答准确性的具体问题。
例如:某个日期是否正确?某个实体是否存在关系?某个数字是否合理?
只列问题,不要回答。
"""
return self.llm.generate(prompt).split("\n")[:5]
def rewrite_using_verification(self, query, v_questions, v_answers):
"""用验证结果重写最终回答"""
evidence_parts = [f"V{i}: {q} → {a}" for i, (q, a) in enumerate(zip(v_questions, v_answers), 1)]
prompt = f"""
问题:{query}
以下是验证过程中的发现:
{' '.join(evidence_parts)}
请用这些验证证据重写最终回答。如果某项证据与初稿矛盾,以验证证据为准。如果有信息无法确认,请明确说明。
"""
return self.llm.generate(prompt)论文结论应该怎么引用
CoVe 原论文由 Meta AI 等团队作者提出,在 Wikidata 列表问答、MultiSpanQA 和长文本生成等任务上报告了幻觉下降。不同任务使用的指标并不相同,不能把未经核对的数据拼成一张统一“准确率提升表”,也不能直接外推到自己的 RAG 系统。
原论文: Chain-of-Verification Reduces Hallucination in Large Language Models
何时使用 CoVe(面试加分点)
✅ 值得用的场景:
- 对外发布的事实性内容(百科、新闻摘要)
- 医疗/法律等高风险领域
- 下游会依赖此输出的关键链路
- 长列表(日期/地点/数量容易出错)
❌ 不值得用的场景:
- 日常聊天(cost/took too long)
- 创意写作(不需要事实校验)
- 实时性要求极高的场景(CoVe 延迟高,额外3次LLM调用)
与 RAG 结合效果更强
python
# CoVe + Retrieval 组合拳
# 第1遍验证:模型用内部知识自查
internal_v = verify_with_internal_knowledge(draft)
# 第2遍验证:检索外部文档做交叉验证
external_docs = search(query)
external_v = verify_with_retrieved_docs(draft, external_docs)
# 综合两层验证结果来修正
final = reconcile_and_rewrite(internal_v, external_v)
# 效果必须在自己的标注集上评估,不能预设固定下降比例30 秒回答
“CoVe 先生成草稿,再规划验证问题;验证问题需要独立回答,避免被原草稿锚定,最后根据验证结果重写。它增加了调用次数和延迟,而且模型自证不等于外部事实核验。高风险场景应把验证问题交给检索、数据库或规则工具,并在自己的评测集上比较事实性、拒答率、延迟和成本。”
