原文地址:Chain of Verification (CoVe) — Understanding & Implementation
2023 年 10 月 9 日
GitHub 存储库
介绍
在处理大型语言模型(LLM)时,一个重大挑战,特别是在事实问答中,是幻觉问题。当答案看似合理但实际上不正确时,就会出现幻觉。在高级别检查中检测这些幻觉可能具有挑战性,并且通常需要更详细的检查。
为了应对这一挑战,Meta AI 团队引入了一种称为验证链 (CoVe) 的方法,该方法由以下四个连续步骤组成:
- 创建初始基线响应:在此步骤中,生成对原始问题的初始响应作为起点。
- 验证问题生成:创建验证问题是为了对基线响应进行事实检查。这些问题旨在检查初始响应的准确性。
- 执行验证:独立回答验证问题,以最大程度地减少任何潜在的偏差。此步骤确保验证过程客观、彻底。
- 最终细化答案生成:根据验证过程的结果,生成最终细化答案。这个答案预计会更加准确和可靠,减少响应中出现幻觉的可能性。
验证链(CoVe)方法旨在通过系统地验证和细化响应以最大程度地减少不准确性来增强大型语言模型提供的答案的可靠性,特别是在事实问答场景中。
在本文中,我将尝试提供对 CoVe 流程的简单理解以及入门级实施。您可以在这里阅读该论文。
验证链
验证链 (Cove) 背后的概念基于这样的概念:大型语言模型 (LLM) 生成的响应可用于验证自身。这种自我验证过程用于评估初始响应的准确性并对其进行改进以获得更高的精度。实现这一目标依赖于熟练地设计和排序 LLM 提示。
根据研究论文,我们将深入研究创建连贯链所涉及的每个步骤,使LLMs能够自我验证其响应。
生成基线响应:当提出初始查询时,它会直接输入 LLM,无需任何其他特殊提示即可获得初始响应。这一初始步骤不仅作为 CoVe 管道的起点,而且作为旨在通过该 CoVe 管道进行增强的基线。由于像这样的基线反应往往容易产生幻觉,因此 CoVe 方法旨在在后续阶段检测并纠正这些不准确之处。
计划验证:给定原始查询和基线响应作为条件,指示模型生成一组验证问题,旨在评估初始基线响应中所做事实断言的准确性。需要强调的是,这些验证问题并不是预先定义的模板,而是预先定义的。相反,语言模型可以灵活地以它认为合适的任何方式表达它们。尽管如此,这些验证问题的构建方式应使其答案有助于完善基线响应。
执行验证:计划好验证问题后,下一步就是系统地回答这些问题,以确定是否存在幻觉。此验证过程可以包括工程技术/外部工具,例如通过网络搜索进行验证。此外,您可以在 CoVe 过程的所有阶段依赖 LLM 本身,这将验证其自身的响应。作者探索了几种不同的验证执行方法,包括联合、两步、因子和因子+修订变体。
1.联合:在此方法中,计划和验证步骤是使用向LLMs提出的单个提示请求联合完成的。不过,不建议使用这种方法,因为验证结果可能会产生幻觉并受到偏差的影响。
2.两步:此步骤与“联合”步骤完全相反。第一步生成验证问题,第二步回答验证问题。
3.因子:与其使用一个大的答案,不如单独回答每个问题。这样,答案将不仅仅是基线响应的副本。这种方法还有助于避免不同问题之间的混淆,并且它可能能够处理更多验证问题,尽管它的计算成本可能很高。
4.因子+修订:在我们得到验证问题的答案后,Cove管道需要检查答案是否与基线响应匹配。这是通过将答案与基线响应进行比较来完成的。这是通过使用 LLM 的附加提示作为一个单独的步骤。这个额外的步骤有助于系统更仔细地考虑这种比较。
实现
Cove管道
作者介绍的验证过程是使用一系列问题进行基准测试的。这些问题分为三大类(尽管作者最初将它们分为四类):
1. Wiki 数据和 Wiki 类别列表:此类别涉及期望以实体列表的形式得到答案的问题。例如,诸如“谁是出生在波士顿的政客?”之类的问题。或“说出一些越南特有的兰花?” 应该得到呈现特定实体列表的答案。
2.多跨度 QA:此类问题寻求多个独立答案,每个答案都来自文本的不同非相邻部分。一个例子是:“谁发明了第一台机械化印刷机,是在哪一年发明的?” 答案是“约翰内斯·古腾堡,1450”。
3.长篇生成:这一类别主要由传记问题组成,正如作者的基准所强调的那样。然而,它不仅限于传记。任何需要详细或冗长答复的问题都属于这一组。
我已经按照原始论文中概述的四个阶段实施了 CoVe 管道。根据前面提到的问题类型,我建立了三个不同的 CoVe 链。此外,我还整合了一种路由机制,将原始查询定向到适当的链。
请访问我的GitHub 存储库以使用代码和有关入门的更多详细信息。
路由器机制:当用户输入查询或问题时,此机制就会启动。它将用户的问题分类为前面提到的三个类别之一:Wiki 列表问题、多跨度问题或长格式问题。根据这种分类,路由器将问题引导到适当的链,每个链专门设计用于处理三种问题类型中的一种。这种分类是使用简单的几次提示设计来实现的。您可以在此处了解有关提示的更多信息。
基线响应:此阶段很简单,不需要任何即时制作。此时,用户的查询由 LLM 处理,产生我们所说的“基线响应”。随后将评估和完善此初始响应以产生最终答案。您可以进一步了解此处所有类型问题的提示。
验证问题生成:此阶段至关重要,需要精心设计和优化提示,以确保验证问题与原始查询无缝匹配。如果这些验证问题偏离了主要意图,整个链条的目的可能会受到损害。为了更好地理解这一点,让我们考虑一个例子。
原始问题:美国组织中印度裔首席执行官的姓名。
基准响应: 1. Satya Nadella(微软首席执行官),2. Sundar Pichai(Google 首席执行官) 3. Mark Zuckerberg(Meta 首席执行官)
验证问题(Set-1): 1. Satya Nadella 是 Microsoft 首席执行官吗?2. 桑达尔·皮查伊是谷歌首席执行官吗?3. 马克·扎克伯格是 Meta 的首席执行官吗?
验证问题(第二组): 1. 微软首席执行官 Satya Nadella 是印度裔吗?2. 谷歌首席执行官桑达尔·皮查伊(Sundar Pichai)是印度裔吗?3. Meta 首席执行官马克·扎克伯格是印度裔吗?
仔细检查两组验证问题后,我们可以观察到以下情况:
在Set-1中,所有三个问题都将得到“是”的验证答案。最终的改进响应将包括基线响应中提供的三个名称。这不是期望的结果,因为该问题的主要目的是确定印度裔首席执行官。Set-1中的问题未能捕捉到这一具体意图。
相反,Set-2更符合我们的目标。例如,第三个验证问题将正确排除马克·扎克伯格,因为虽然他是 Meta 的首席执行官,但他不是印度裔。
因此,精确的快速工程和彻底的实验在这个阶段至关重要。要进一步了解各种问题类型的提示结构,您可以参考此处。
执行验证问题:此阶段与前一阶段一样重要。即使有与主要目标一致的高度准确的验证问题,最终完善答案的质量很大程度上取决于此阶段。虽然作者仅依靠LLMs来解决生成的验证问题,但人们可以灵活地利用各种概念或外部工具来实现这一目的。在我的方法中,我使用了免费的搜索工具“duckduckgo-search”来寻找答案。然后,这些搜索结果将作为LLMs解决每个验证问题的参考上下文。替代方案包括更复杂的搜索工具、基于 RAG 的系统、数据库或其他检索工具和机制来回答之前提出的验证问题。要进一步了解提示结构,您可以参考此处。
最终完善的答案:这一步相对简单。它涉及利用所有先前的数据(原始查询、基线响应、验证问题及其各自的答案)来制定提供最终完善答案的提示。请参阅示例提示以供参考。
如何改进整体 CoVe 管道
1️. 提示词工程:提高任何 LLM 支持的应用程序性能的主要方法之一是通过提示词工程和提示词优化。大家可以查看我的GitHub实现中用到的所有提示。在您的用例中尝试您自己的即时工程和实验。
2️. 外部工具:由于最终输出很大程度上取决于验证问题的答案,因此根据不同的用例,您可以尝试不同的工具。对于事实问题和回答,您可以使用高级搜索工具,如 google 搜索或 serp API 等。对于自定义用例,您始终可以使用 RAG 方法或其他检索技术来回答验证问题。
3️. 更多链:我根据作者在研究中使用的三种问题类型(Wiki Data、Mutli-Span QA 和 Long-Form QA)实现了三个链。根据您的用例,您可以创建其他链来处理其他类型的 QA 方法以增加可变性。
4️. 人机交互 (HIL): HIL 是许多LLMs支持的应用程序中的重要步骤之一。在您的特定应用中,整个管道可以设计为合并 HIL,以生成适当的验证问题或回答验证问题,以进一步改进整体 CoVe 管道。
局限性
验证链 (Cove) 方法的主要局限性:
1.不完全消除幻觉: Cove 并不能完全消除生成内容中的幻觉,这意味着它仍然会产生不正确或误导性的信息。
2.缓解幻觉的范围有限: Cove 主要以直接陈述事实不准确的形式解决幻觉,但可能无法有效处理其他形式的幻觉,例如推理或观点中的错误。
3.增加计算成本:在 CoVe 中生成和执行验证以及响应会增加计算成本,类似于思想链等其他推理方法。
4.改进上限: Cove 的有效性受到底层语言模型整体能力的限制,特别是识别和纠正自身错误的能力。
结论
该论文提出了验证链(Cove)方法,这是一种旨在制作大型语言模型的策略,更批判性地思考他们的答案,并在需要时进行自我纠正。人们发现这些模型比仅仅回答初始问题更擅长回答详细的验证问题。这是因为这种方法将验证分解为更简单、更易于管理的问题。此外,人们还发现,阻止模型重新审视之前的答案有助于避免重复任何错误或“幻觉”。简而言之,该技术只需仔细检查其答案就可以极大地提高模型的响应。一项潜在的改进可能是为 CoVe 提供额外的工具,例如允许它从外部来源提取信息,这可以进一步提高其性能。