减少 LLM 幻觉方法--CoVe

https://zhuanlan.zhihu.com/p/678902427

 

来自于 Meta AI,原文链接如下:

LLM 经常遇到的主要问题就是幻觉,减少幻觉的方法大致可分为三类:训练时校正、生成时校正和通过增强(使用工具)进行校正。

  • 在训练时校正的方法中,一种常见的方法是试图通过训练或调整模型权重来降低幻觉生成的概率,从而增强 encoder-decoder 或者 decoder-only 语言模型的生成结果。例如利用强化学习,对比学习方法等。
  • 在生成时校正的方法中,一个常见的方法是在基本 LLM 的概率最高的结果中做出推理决策,以使其结果更加可靠。本文也是属于这个类别。
  • 在通过增强(使用工具)进行校正的方法中,比较经典的方法就是 RAG。简单来说就是检索外部资料作为输入,传入到最后的生成器(LLM)中得到最终结果。因为有相关辅助资料的帮助,LLM 会很大程度上减少幻觉的出现。

Chain-of-VerificationCoVe

本文提出的方法中一个关键假设是,当使用合适的 prompt 时,大语言模型(LLM)可以做到生成并且执行如何验证自己结果的计划,以检查自己的工作,并最终将该分析纳入改进的响应中。(简单来说就是可以产生一个自我检查的方法判断自己的产出是否正确,最终会将所有结果输入 LLM 中得到最终输出)关键步骤如下:

这些步骤中的每一个都是对同一个 LLM 中执行不同的 prompt 获得所需的响应。

Baseline Response

对于一个给定的查询,作者使用正常的 LLM 生成,没有特殊的技巧。

Plan Verifications

以原始查询和基线响应为条件,通过 prompt 生成一系列验证问题,以检测原始基线中的内容是否属实。

例如,对于一个 longform 模型的返回结果包含“墨西哥-美国战争是1846年至1848年间,美国和墨西哥之间的武装冲突”,那么检查这些日期的一个可能的验证问题可能是“墨西哥-美洲战争何时开始和结束”。

Execute Verifications

PS. 在这个过程中可以使用 RAG 或者检索验证的方法来判断回答内容是否存在幻觉。作者在 CoVe 的所有步骤中不打算使用任何工具只使用 LLM 本身。

作者提出了 4 种检查的方法:

Joint

通过使用一个 LLM prompt 得到第二步和第三步(即 Plan Verifications 和 execute verification )的结果。LLM 的 prompt 包含 few-shot 样例,包括验证问题及其答案。在这个方法中不需要单独的 prompt。

其中一个潜在的问题是,由于验证问题必须以 LLM 上下文中的基线响应为条件,并且该方法是将两个内容联合在一起查询到。因此验证问题的答案也必须以初始响应为条件,可能会增加重复的可能性。这意味着验证问题可能会产生与原始基线响应类似的幻觉。

2-Step

为解决 Joint 方法中提到的问题,作者提出将第二步和第三步分开,分别用不同的 prompt 得到最后的结果。具体步骤如下:

  • 通过第一步中的基线响应构建第二步的 prompt, 从而生成验证问题。
  • 对验证问题进行回答的 prompt 中只包含问题,而不包含原始基线响应。这里会用同一个 prompt 回答所有的问题。

 

Factored

为解决 Joint 方法提到的问题,另一种更复杂的方法是所有问题都生成不同的 prompt 来回答。其特点在于:

  • 消除基线反应中的任何潜在干扰
  • 消除答案上下文之间的任何潜在影响
  • 可以潜在地处理更多的验证问题,因为它们不必都符合同一个上下文
  • 虽然这可能在计算上更昂贵,并且需要执行更多的LLM提示,但它们可以并行运行,因此可以进行批处理

 

Factor+Revise

在回答验证问题后,必须隐式或显式交叉检查这些答案是否与原始响应一致。

此方法中,作者新增了一个额外的 LLM prompt 执行交叉验证。与回答验证问题不同,交叉验证阶段需要以基线响应和验证问答为条件。

因此每个问题都有一个交叉检查 prompt,其中包含 few-shot 样例显示所需的输出。例如,如果最初的基线回复包含短语“1845年美国吞并德克萨斯州之后……”,会产生了一个验证问题,即德克萨斯州何时脱离墨西哥?如果答案是1836,则应通过该步骤检测到不一致。

Final Verified Response

最后的 prompt 会包含 few-shot 样例,其中上下文考虑了之前的所有推理步骤、基线响应和验证问答对,以便进行更正。

实验结果

作者使用 Llama 65B 作为基础模型,对比了 Zero-shot,Zero-shot with Chain-of-thought 以及 few-shot 的方法。

PS. 在 zero-shot with CoT 的实验中,作者发现指令微调模型在被查询时往往会生成无关的内容。因此作者在提示中增加了一行:“List only the answers separated by a comma” 来限制输出。

实验结果如下:

通过实验可以发现:

  • CoVe 在三个任务的准确性上都有明显提高
  • CoVe 的表现优于 ChatGPT 等模型
  • 指令调整和 CoT 不能减少幻觉
  • 进一步的明确推理有助于消除幻觉
  • 与长格式查询相比,短格式验证问题的回答更准确
  • 基于 LLM 的验证问题优于启发式方法(Table 4)
  • 开放式验证问题优于基于是/否的问题 (Table 4)

限制

  • 虽然 CoVe 方法试图减少幻觉,但并没有完全消除幻觉。这意味着 CoVe 仍然可以为给定的查询生成不正确或误导性的信息,即使它比基线有所改进。
  • 实验中作者用直接陈述事实的形式来处理幻觉。然而,幻觉也可能以其他形式出现,例如在不正确的推理步骤中,作为观点的一部分等。
  • CoVe 都带有验证,如果人工查看,这些验证会为其决策增加更多的可解释性,但由于在输出中生成更多的 token,计算费用会增加,这与思维链等其他推理方法类似。

 

 

 

CoVe(Chain-of-Verification)是一种通过 prompt(提示) 方式实现减少幻觉的方法。其核心思想是让语言模型在生成回答后,通过自我验证来检查回答的准确性。具体流程如下
  1. 生成初始回答:模型根据用户输入的问题生成一个初步的回答。
  2. 生成验证问题:模型基于初始回答生成一系列验证问题,用于检查初始回答中的事实性内容。
  3. 独立回答验证问题:模型独立回答这些验证问题,避免受到初始回答的影响。
  4. 生成最终回答:模型根据验证问题的回答结果,对初始回答进行修正,生成最终经过验证的回答。
通过这种方式,CoVe利用了模型自身的推理能力,通过精心设计的提示(prompt)引导模型进行自我检查和纠正,从而有效减少幻觉现象
以下是一个具体且易于理解的 CoVe(Chain-of-Verification)示例,展示如何通过提示(prompt)方式减少语言模型的幻觉问题:

示例场景

假设用户向语言模型提出了一个问题:“《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰叫什么名字?”

CoVe 的具体实现步骤

1. 生成初始回答

模型根据问题直接生成一个初步回答: 初始回答:“《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰叫‘海德薇’。”

2. 生成验证问题

模型根据初始回答生成一个或多个验证问题,用于检查回答的准确性: 验证问题:“在《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰的名字是否确实叫‘海德薇’?请确认。”

3. 独立回答验证问题

模型独立回答验证问题,避免受到初始回答的影响。这里可以假设模型在回答验证问题时会检索相关的知识或事实: 验证回答:“是的,哈利·波特的宠物猫头鹰确实叫‘海德薇’。在电影和原著中,海德薇是哈利的忠实伙伴,经常帮助他传递信件。”

4. 生成最终回答

模型根据验证问题的回答结果,确认初始回答的准确性,并生成最终回答: 最终回答:“《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰确实叫‘海德薇’。海德薇是哈利的忠实伙伴,经常帮助他传递信件。”

CoVe 的效果

通过上述步骤,模型不仅给出了初始回答,还通过自我验证的方式确认了回答的准确性。如果在验证过程中发现初始回答有误,模型可以在最终回答中进行修正,从而减少幻觉现象。

如果验证发现问题的示例

假设初始回答是错误的,例如: 初始回答:“《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰叫‘雪球’。”
验证问题:“在《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰的名字是否确实叫‘雪球’?请确认。”
验证回答:“不,哈利·波特的宠物猫头鹰不叫‘雪球’。它实际上叫‘海德薇’。”
最终回答:“抱歉,我之前的回答有误。《哈利·波特》系列电影中,哈利·波特的宠物猫头鹰叫‘海德薇’,而不是‘雪球’。”
通过 CoVe 的验证机制,模型能够及时纠正错误,避免输出错误的信息。
 
 
 

场景设定

假设我们有一个大型语言模型(LLM),用户希望了解关于“美国独立战争结束年份”的信息。然而,模型在直接回答时可能会产生幻觉,给出错误的信息。为了解决这个问题,我们将使用CoVe(Chain-of-Verification)方法,通过Prompt方式引导模型进行自我验证和修正。

步骤演示

1. 生成基线响应(Generate Baseline Response)

  • Prompt输入:
复制代码
  用户查询:美国独立战争是哪一年结束的?
  请直接给出你的回答。
  • 模型输出(基线响应):
复制代码
  美国独立战争在1783年结束。

(注:此处假设模型初始回答正确,但在实际应用中,模型可能会给出错误答案,如1776年等。)

2. 规划验证(Plan Verifications)

  • Prompt输入:
复制代码
  基于用户查询“美国独立战争是哪一年结束的?”和你的基线响应“美国独立战争在1783年结束。”,请列出几个验证问题,用于检查你的回答是否正确。
  • 模型输出(验证问题):
复制代码
  1. 美国独立战争的主要条约是什么,它是在哪一年签订的?
  2. 1783年与美国独立战争相关的重大事件有哪些?
  3. 是否有其他历史资料支持美国独立战争在1783年结束?

3. 执行验证(Execute Verifications)

  • 针对第一个验证问题:

    • Prompt输入:
    复制代码
      请回答验证问题:美国独立战争的主要条约是什么,它是在哪一年签订的?
    • 模型输出:
    复制代码
      美国独立战争的主要条约是《巴黎条约》,它是在1783年签订的。
  • 针对第二个验证问题:

    • Prompt输入:
    复制代码
      请回答验证问题:1783年与美国独立战争相关的重大事件有哪些?
    • 模型输出:
    复制代码
      1783年,英美签订《巴黎条约》,正式承认美国独立。
  • 针对第三个验证问题(此处可简化为引用已知历史资料):

    • Prompt输入(假设模型已接入历史知识库或可模拟此过程):
    复制代码
      是否有其他历史资料支持美国独立战争在1783年结束?请简要说明。
    • 模型输出:
    复制代码
      是的,多本历史书籍和资料均记载,美国独立战争在1783年随着《巴黎条约》的签订而正式结束。

4. 生成最终验证响应(Generate Final Verified Response)

  • Prompt输入(综合前面步骤的结果):
复制代码
  基于你的基线响应和验证问题的回答,请给出最终验证后的响应。
  • 模型输出(最终验证响应):
复制代码
  经过验证,美国独立战争确实在1783年结束,这一结论得到了《巴黎条约》的签订和其他历史资料的证实。

总结

通过这个Demo,我们可以看到CoVe方法如何通过Prompt方式引导模型进行自我验证和修正。在实际应用中,即使模型的初始回答存在幻觉,通过规划验证、执行验证和生成最终验证响应等步骤,模型也能够纠正错误,给出更准确的答案。这种方法不仅提高了模型的准确性,还增强了用户对模型回答的信任度。

posted on 2025-03-19 17:25  ExplorerMan  阅读(244)  评论(0)    收藏  举报

导航