前言
首先为什么选择这篇文章,因为我目前在做事实验证,在此之前也并没有看过这篇文章,这篇文章的引用量很高,还挂在arivx上,也算是比较新,本以为是我的遗漏,但是通读下来发现并不是这样。
这篇文章实际上在讲如何提高LLM的性能,读下来工业气息很重,类似于在基础的LLM上向上封装了一些组件,形成一个商用的对话系统:类似于网页端的ChatGPT(可能有更多组件)。
论文读下来比较吃力,可能是我对这部分接触较少,或者作者写作有一些省略,所以论文整体感觉较复杂,另外源码还并未release,所以理解起来更为困难。感觉文章的图片不够清晰。还有一个问题在于某些技术它并未实现,比如人工评估。
网络上的资源也相对较少,所以我尽量把我理解的部分讲述清楚,如有问题或者您有更深的理解,欢迎联系我交流。
Information
- Microsoft Research
- Columbia University
- 3.8 2023
- 论文链接
Introduction
目前大模型已经可以生成流畅的,类似人类的语言。但是LLM的应用仍然存在幻觉和无法接受外界知识的问题。本文提供了一个LLM-AUGMENTER的模块,通过一个插件系统使得LLM可以接受到外部知识来提高模型的回答质量,作者在面向任务的对话和开放域问答两个任务上进行了评测,发现该方法在不损失流畅度和信息的情况下减少了幻觉发生。
幻觉问题的引起是由于LLM的知识是在模型训练中存储在权重之中的,其中知识数量庞大,而训练数据中又存在一定的噪声,所以模型权重的知识是会有损失的,会出现“记忆失真”,造成了幻觉,导致影响模型性能。其次LLM无法存储所有的知识,例如按时间维度来看,随着时间的推移,就会出现大量的新知识和时事数据,而LLMs无法快速的获取它们(因为没有投入训练)。所以作者认为需要一个即插即用的模块来解决这些问题,就是本文提出的方法动机。
作者提出了 LLM-AUGMENTER 模块,如下图所示,通过引入外部知识和反馈机制使得模型的回答更加为完善。例如关于 2013 年洛杉矶银河球员转会的问题,LLM-AUGMENTER优先从外部知识中检索证据,比如左边的web页面,还可以将其中的实体链接增强信息,例如实体“2013 Los Angeles Galaxy”的信息,并进行推理形成证据链(例如图中的表格),然后通过LLM初步形成一个回答,对于此回答,还会验证是否存在问题或者幻觉并给出一个反馈(feedback),如果检查不通过将在回顾上述过程,如通过将回答返回给用户。这样就会得到高质量的回答了。
作者在information seeking dialog和open-domain Wiki QA两个任务上做了实验,验证了模型有利于提高回答质量。
LLM-AUGMENTER
LLM-AUGMENTER结构如下图所示,它使用Working Memory, Policy, Action Executor, Utility这几个结构来增强LLM的性能。
作者将对话系统设计成为一个马尔可夫决策过程(Markov Decision Process (MDP))通过一个五元组表示 ( S , A , P , R , γ ) (S,A,P,R,\gamma ) (S,A,P,R,γ)
- S S S表示对话状态的集合,对存储在working Memory中的信息进行编码,包括对话历史记录、用户问题、证据、候选回答。
- A A A表示一个动作集合,包括两个动作:(1)调用知识整合器来整合外部知识的证据(2)调用提示引擎让LLM生成一个回答。
- P ( s ′ ∣ s , a ) P(s'|s,a) P(s′∣s,a)给定状态 s s s和动作 a a a转化为新状态 s ′ s' s′的概率。
- R ( s , a ) R(s,a) R(s,a)是一个给定状态 s s s,选择执行动作 a a a的外部奖励,这个奖励是由外部环境提供的,例如,用户或者模拟的用户。
- γ ∈ ( 0 , 1 ] \gamma \in (0, 1] γ∈(0,1]是一个随时间步递减的因子。
可以看到这里套用了强化学习的框架,通过RL训练LLM-AUGMENTER使得他于人类对齐,将一些不够完善的回答过滤掉。下面详细介绍以下子模块。
Working Memory
该模块跟踪对话状态存储一些对话中重要的信息。他的状态用一个六元组表示 ( q , e , o , u , f , h q ) (q, e, o, u, f, h_q) (q,e,o,u,f,hq):
- q q q表示目前用户的提问
- e e e是对于 q q q从外部知识整合的一些证据,通过知识整合器得到
- o o o是一个由LLM生成的对于 q q q的回答集合
- u u u 是评估 o o o每个元素效用(Utility)的分数, f f f是对 o o o的口头反馈,指导LLM提高其效用,两者由 Utility 模块生成
- h q h_q hq是在 q q q之前的对话历史
给定用户查询 q q q,LLM-AUGMENTER 进行多次迭代,修改回答,每次迭代生成基于证据、反馈(feedback)的候选回答和效用函数(Utility),然后将最终回答发送至用户,如图 LLM-AUGMENTER示例 所示。
Policy
强化学习的核心在于学习Policy,该模块决定整个系统的下一步选取的行动,使得Reward最大化,这些行动包括(1) 从外部知识中获取 q q q的证据 e e e,(2) 调用 LLM 生成候选回答,(3) 将通过Utility验证的回答向用户提供。
该策略可以通过手动制定规则(manually crafted rules),或通过人机交互的方式训练。(这里我不知道(manually crafted rules)是何种训练方式,按照ChatGPT的训练逻辑应该是人提供交互的才可以训练参数)。
这里的Policy网络 π \pi π选用的是T5模型,作者认为不仅仅可以提供大模型的的能力还可以微调。因为在Policy训练中需要大量人机交互的数据,这些数据是很贵的,所以作者提出如下三个阶段解决这个问题:
- Bootstrapping from a rule-based policy:领域专家编码特定于任务的知识,并将逻辑转化为 IF-THEN 规则。
例如,用户向客服询问产品名称时,明智之举调用 Knowledge Consolidator 从产品数据库收集产品信息。 - Learning with user simulators:使用语言模型来模拟人类如何用户与 LLM-AUGMENTER 进行交互。允许
LLM-AUGMENTER 自我完善。比如训练一个好的模拟器,然后训练决策器,在迭代。。。 - 最后LLM-AUGMENTER 直接和用户交互,做最后的完善。
Action Executor
动作执行者包括两个组件Knowledge Consolidator 和 Prompt Engine。
Knowledge Consolidator
知识整合器以模块化方式设计,包括知识检索器(retriever)、实体链接器(entity linker)和证据链接器(evidence chainer)。
首先,检索器基于 q q q和 h q h_q hq生成一系列询问(search queries),这些询问将会通过API(Bing Search APIs)询问Web得到需要的证据文档。
因为在网络上得到的文本可能是noisy的,所以需要引入一些干净的知识数据,通过引入每个实体维基百科的实体描述,构成证据图。实体链接可以使得实体有丰富的上下文知识。
最后修剪掉不想管的证据,形成与查询相关的证据 e e e,将其发送到working memory中。
Prompt Engine
生成一个字符串序列来提示LLM生成想要的回答,prompt由如下元素组成
q
,
h
q
,
e
,
f
q, h_q, e, f
q,hq,e,f , prompt也是面向任务的,不同的任务会有不同的prompt。
如下所示:
Utility
对于一个候选的回答 o o o, 生成一个效用分数 u u u和一个相关的反馈 f f f。该Utility模块用于对齐模型和特定任务的需求,比如在餐厅服务行业中,对话都应该是针对菜单或者菜品服务的,如果LLM回答了不相关的答案,应该不能通过效用函数的验证,并给出一个合适的反馈。本文提供了两种效用函数:
- Model-based utility functions: 将偏好分数分配给回答的不同维度,例如流畅性、信息性和事实性。 这些函数根据预先收集的人类偏好数据或带注释的数据进行训练。
- Rule-based utility functions: 使用启发式或编程函数,衡量回答是否符合规则。
然后通过生成模型生成反馈:
f = Q ψ ( q , e , o , h q ) f = Q_\psi(q, e, o, h_q) f=Qψ(q,e,o,hq)
Q Q Q为生成模型 ψ \psi ψ为模型参数。
Information Seeking Dialog
Datasets
News Chat: 作者仿照DSTC7 Track 2 task制作数据集,评估模型,目的在于使得模型生成和外部知识关联的回答而不是闲谈。其中的内容是从 2021 年至 2022 年期间各种新闻相关的 Reddit 子版块中爬取的。
Customer Service: 使用 DSTC11 Track 5作为对话式客户服务场景中示例。 它除了来自常见问题解答的事实知识之外,还结合了来自客户评论的主观知识。
Experiment Setup
Language Model: 本文使用ChatGPT, 该方法也很容易迁移到其他LLM上,例如Llama, PlaM
Knowledge Consolidator: 对于News Chat使用BM25检索器 检索Reddit posts。dui’yuCustomer Service 使用 BM25检索的 FAQ 和 Yelp。
Prompt Engine: 如上表格7,8所示
Utility: 使用 ChatGPT 作为效用函数,通过要求 ChatGPT 评估候选回答的反应来收集有关如何改进的反馈。
Policy: 由于chatGPT的带宽有限,作者在设计实验时采用了基于规则的策略(???为什么会是基于规则的策略,这里表述,没有看懂,我理解的是当GPT第一次给出答案时,倾向于去外部查找数据)。另外作者使用离线的RL方法训练了策略网络(T5-based)。
Evaluation: 作者在评估方面准备了两大类评估,机器自动评估和人工评估。自动评估使用了Knowledge F1 (KF1),BLEU-4,ROUGE-1,METEOR,BLEURT,BERTScore,chrF,BARTScore。并根据 (1) useful(2) humanlike两个方面进行人工评价。
Automatic Evaluation Results
The impact of using external knowledge: 尽管LLM表现已经很好,但是可以看到加入外部知识可以提高LLM的性能,减少模型产生的幻觉,还可以看到KF1指标明显提高,说明引入外部知识的有效性。
The impact of using automated feedback: 同时可以看到上表中使用feedback会提升模型效果。
The impact of using trainable Policy: 下图为LLM-AUGMENTER在Customer Service上的学习曲线。因为无法真的收集人类反馈作为指导因素,在这里定义的奖励
R
R
R是KF1效用函数。可以看到随着训练KF1值会上升,目前实验为单轮交互,因此不需要设置折扣因子γ,但是未来工作可能需要设置。 可以看到 LLM-AUGMENTER 对测试数据的奖励随着训练数增加,在 600 次交互后超越随机策略,并最终达到 KF1 分数约37.5。 通过这些交互,LLM-AUGMENTER 能够有效地选择动作以最大化奖励,这使得系统减少幻觉,同时生成流畅且信息丰富的回答。
Human Evaluation Results
从customer service数据集中随机选取948个样例来用作人工评测,结果如下表。
Ablation Study
针对以下几个方面构建了消融实验1) no-knowledge consolidator:不使用知识整合器 2) Self-ask: LLM自己向自己提问,当自己建议要用外部知识整合器时才会调用外部知识整合器 3)Always-use:一直使用外部整合器。
如下图所示,可以看到使用self-ask后模型KF1值要显著高于不使用知识整合器,Always-use policy效果最佳,说明让策略模型倾向于要求利用外部知识是正确的。
另外,下表列出了LLM-AUGMENTER不同类型反馈影响的评估结果。我们观察到自我批评反馈提高了回答质量,使其更加知识化。它的性能相近于基于规则的反馈。
对于效用函数的影响如下图所示,使用效用(Utility)和反馈增强提示的结合,即 2 ,实现最佳性能。 此外,始终提供反馈(如4)也提高了性能,尽管它需要额外的模型提示。 5代表提示 ChatGPT 两次并根据效用函数对响应重新排序,这会导致 KF1 稍高,但性能明显比 2 差。
Wiki QA
作者同样在开放域问答领域错了评估测试。因为多跳信息可能会使得LLM更加的倾向于生成幻觉,因此从外部获得信息可能使得LLM有更好的表现。另外,不同于对话任务,问答任务的回答风格更倾向于简洁,所以作者做了回答风格的调整。
Dataset
OTT-QA: 该数据集是一个开放域问答benchmark,大概存在40k个样例,包括400k表格和6M段落,其中包括多跳信息:single-hop questions (13%), two-hop questions (57%), multi-hop questions (30%)。
Experiment Setups
Knowledge Consolidator: 这里的知识整合器采用了dense model DPR作为检索器。使用来自 CORE 的附加中间模块,即linker and chainar 整合原始证据,包括连接相关文件、重新排序证据,并将它们拼接成证据链。
Prompt Engine: 如下表所示
Utility: 因为希望给定的回答利用了更多知识源,所以采用召回率recall作为效用分数,即希望模型回答和相关证据之间的交集更多。
Evaluation Metrics: 使用token-level精度、召回率和 F1 分数与带注释的答案来评估生成的答案。
Results
首先可以看到close-book的情况确实会差,从任一途径获得知识都可以提高模型的f1,CORE方法提高的更多,并且反馈也有利于于体改模型性能。
Limitations and Future Directions
首先一大限制就是需要更多的计算量,本该一次问答,现在需要多轮迭代得到一个最优解,但是作者给出了一个解决方案就是在实际用户使用的时候,如果用户比较不耐烦,就可以直接给出回答,如果用户希望得到高质量的回答就可以等待并拿到更好的回答。
本文使用手动设计策略,由于强化学习效率非常高,所以我们训练使用T5使用,随着ChatGPT的更新可以使用ChatGPT + LR 的策略实现改论文。另外,人工交互的强化学习也并没有实现,当前使用的是KF1。最后可以在插件中加入安全策略使得模型更安全。