微信扫码
与创始人交个朋友
我要投稿
导言
做RAG的同学都知道,检索质量直接决定了RAG系统回答问题的质量, 但很多场景下,如果检索出来的内容和问题其实不相关, 反倒会降低输出的质量。本文就介绍了另外一种RAG方法:Self-RAG, 由大模型决定是否需要检索, 以及在最终输出结果前自己评估答案的质量保证输出最佳答案。
通过阅读本文你能够了解:
Self-RAG的基本原理和方法
获取Self-RAG论文和代码
关注公众号,后台发送"Self-RAG"获取 Self-RAG相关论文和Self-RAG实现源代码
Self-RAG是检索增强生成(RAG)的另一种形式。
与其他RAG检索策略不同,它不会增加RAG过程中的特定模块。相反,它优化了RAG框架中的各个模块,以改善整体的RAG过程。
Self-RAG 概述
Self-RAG 是一种新的 RAG 方法,它利用经过训练的LLM(大型语言模型)进行检索、生成和评估任务,以提高生成结果的准确性和质量。
研究团队通过实验证明,Self-RAG 在开放领域问答、推理和事实验证任务中表现非常好。
它在基础RAG模型的基础上,优于商业模型如ChatGPT和开源模型如Llama2
Self-RAG 旨在解决基础RAG存在的几个问题:
过度检索: 基础RAG总是对输入问题进行知识检索,这可能引入无关或离题的内容,影响输出结果。
不准确的输出: 因为LLM并不总是根据检索到的知识来回答问题,输出可能与检索到的信息不一致。
在接下来的部分中,我们将了解为什么Self-RAG能够解决这些问题。
Self-RAG流程
为了更好地理解自我RAG,让我们将其与基础RAG进行比较,从基础RAG流程图开始:
这个流程图省略了文档存储和建立索引部分,侧重于检索和生成过程。
对于每个查询,基本RAG检索相关文档,并将所有文档和查询输入LLM,然后生成结果。
生成结果的提示需要所有检索到的文档作为查询的上下文,通常要求LLM基于上下文知识进行回答。
现在,让我们看看Self-RAG流程图:
Self-RAG最初使用LLM为查询生成初步结果(这个LLM是经过特殊训练的,我们稍后会讨论)。基于生成的结果,它决定是否需要检索。如果不需要,就直接返回结果。
如果需要检索,Self-RAG检索相关文档,并将每个文档与查询一起输入LLM,以获得每个文档的生成结果。生成结果的提示只使用单个文档作为查询的上下文。
然后评估每个文档的生成结果,选择得分最高的结果作为最终答案返回。
Self-RAG和基础RAG之间的区别
从上面的两个流程图中,我们可以看到自我RAG和基本RAG之间的主要区别
基础RAG对每个查询执行检索,而自我RAG可以根据生成的结果确定是否需要检索。
基础RAG使用所有检索到的文档作为上下文,而Self-RAG只使用单个文档作为上下文,但为每个文档生成结果。
Self-RAG对生成的结果进行评估和选择过程,而基础RAG缺乏这一过程,因为它只生成一个结果。
基础RAG使用通用的LLM,而Self-RAG使用经过特殊训练的LLM
按需检索
在了解了Self-RAG的整体流程之后,深入研究每个阶段的实现原理,从初始查询阶段开始。
与基础RAG不同,自我RAG使用训练有素的LLM,在文本生成过程中输出称为反思标记的特殊标记。在RAG过程中,Self-RAG使用反思标记进行不同的操作。
当Self-RAG开始使用LLM生成结果时,它会输出Retrieve类型的反思标记。这些标记有三个值:
检索: 表示需要检索。
无需检索: 表示不需要检索。
继续使用证据: 表示模型可以继续使用先前检索到的证据。
看一些自我RAG生成反思标记的例子。首先是一个不需要检索的问题:
问题:写一篇关于你最好的暑假的文章。
答案:当然![无需检索] 作为人工智能,我没有个人经历或记忆,但我可以写关于暑假对个人和家庭的重要性和意义。[无需检索]......
在回答中,我们看到了[无需检索]关键词,表示对于这个问题不需要检索。
现在,一个需要检索的问题:
问题:美国的雕像是如何得到它们的名字的?
答案:其中一些。[检索]<段落>[无关] 一些是以最初赞助它们的人命名的,一些是以它们代表的事件或问题命名的,还有一些是以神话人物命名的。[实用性:4]
在这里,回答包括了[检索]<段落>关键词,表示需要外部知识,即检索。
当然,基本RAG也可以通过其他方式实现按需检索,例如首先使用LLM确定查询是否需要检索,返回是/否的结果。如果不需要检索,则LLM生成最终结果。这意味着如果查询不需要检索,基本RAG会调用两次LLM,而自我RAG只会调用一次LLM。
如图所示,Self-RAG在无需检索分支上比基本RAG更有效率。
检索和生成
当Self-RAG在初始查询后确定需要检索时,它使用检索器根据查询找到文档。在检索方面,Self-RAG和基本RAG类似,都使用向量相似性来检索文档。
在检索到文档后,将每个文档和查询输入LLM以为每个文档生成结果。
在这第二代阶段,Self-RAG LLM生成三种类型的反思标记:
IsREL: 检查检索到的文档是否为查询提供了有用信息,值为[相关]和[不相关]表示相关性。
IsSUP: 检查检索到的文档是否支持生成的答案,值为[完全支持],[部分支持]和[无支持/矛盾]表示支持水平。
IsUSE: 表示生成的答案是否对查询有帮助,值为[实用性:5],[实用性:4],[实用性:3],[实用性:2],[实用性:1],表示答案的质量,数字越高表示质量越高。
以下是自我RAG在这个阶段生成的结果的示例:
问题:洛基在试图征服地球时使用了什么神秘物体?
答案1:[相关] 洛基在试图征服地球时使用的神秘物体是无法预知潜力的强大能源——Tesseract。[完全支持] [实用性:5]
答案2:[相关] 塔诺斯使用时间宝石躲避了洛基的攻击。[无支持/矛盾] [实用性:5]
每个生成的结果都包括上述三种反思标记,这些标记在下一个评估阶段中使用。
优化生成效率
尽管这个阶段需要LLM为每个文档生成结果,可能会降低与基础RAG相比的效率,但并发可以提高效率。
在这个图表中,虽然Self-RAG调用LLM三次,但并发执行使执行时间等于调用LLM一次。因此,尽管消耗更多的标记,但Self-RAG在这个阶段的效率与基本RAG相匹配。
评估和选择
在为每个文档生成结果后,Self-RAG 使用反思标记来评估每个结果,计算每个文档的分数,然后选择得分最高的文档作为最终答案。
评估参数:logprobs
在深入研究评估方法之前,让我们先了解一下 logprobs 参数。该参数指的是在结果生成过程中由LLM输出的每个生成标记(单词或子单词)的对数概率,用于计算每个标记的分数。
以下是来自OpenAI API的示例结果:
{"id": "cmpl-6yE4TGqItUpYJ6xYcIzY6","object": "text_completion","created": 1623073722,"model": "davinci","choices": [{"text": " I'm good, thanks!","index": 0,"logprobs": {"tokens": [" I'm", " good", ",", " thanks", "!"],"token_logprobs": [-0.1, -0.05, -0.2, -0.3, -0.15],"top_logprobs": [{" I'm": -0.1," I am": -2.3," I": -3.1},{" good": -0.05," fine": -1.5," great": -2.0},{",": -0.2,".": -2.5,"!": -3.0},{" thanks": -0.3," thank you": -1.8," thank": -2.6},{"!": -0.15,".": -1.9,"?": -2.7}],"text_offset": [5, 9, 14, 15, 21]},"finish_reason": "length"}],"usage": {"prompt_tokens": 5,"completion_tokens": 5,"total_tokens": 10}}
在这个例子中,logprobs 参数的输出如下:
tokens: 生成标记的列表 [" I'm", " good", ",", " thanks", "!"]
token_logprobs: 每个生成标记的对数概率值 [-0.1, -0.05, -0.2, -0.3, -0.15]
top_logprobs: 每个生成标记的前几个候选项及其对数概率。例如,第一个标记 I'm 的前几个候选项为 {" I'm": -0.1, " I am": -2.3, " I": -3.1}
text_offset: 生成文本中每个标记的偏移量 [5, 9, 14, 15, 21]
在Self-RAG中,评估函数使用logprobs参数来计算IsREL、IsSUP和IsUSE反射标记的分数。
例如,如果输出包括标记[Fully supported],这意味着LLM计算了可能的标记如[Fully supported]、[Partially supported]等的概率,但最终选择了[Fully supported]。
因此,在评估IsSUP分数时,评估是基于logprobs中这些标记的概率。
评估公式
在了解了 logprobs 参数之后,让我们来看一下 Self-RAG 的三个评估指标的计算公式。首先是 IsREL 的计算公式:
s(ISREL) = p(ISREL = RELEVANT) / (p(ISREL = RELEVANT) + p(ISREL = IRRELEVANT))
•p(ISREL = RELEVANT): 模型预测 ISREL 为 Relevant 的概率。
•p(ISREL = IRRELEVANT): 模型预测 ISREL 为 Irrelevant 的概率。
接下来是 IsSUP 的计算公式:
s(ISSUP) = p(ISSUP = FULLY) / S + 0.5 * p(ISSUP = PARTIALLY) / S
•p(ISSUP = FULLY): 模型预测 ISSUP 为 Fully Supported 的概率。
•p(ISSUP = PARTIALLY): 模型预测 ISSUP 为 Partially Supported 的概率。
•S: 三种可能值的概率之和:S = ∑t∈{FULLY,PARTIALLY,NO} p(ISSUP = t)
最后是 IsUSE 的计算公式:
s(ISUSE) = (∑i wi * p(ISUSE = i)) / S
•wi: 分别对应每个级别的权重:{-1, -0.5, 0, 0.5, 1},分别对应 ISUSE={1, 2, 3, 4, 5}。
•p(ISUSE = i): 模型预测 ISUSE 为级别 i 的概率。
•S: 五个级别的概率之和:S = ∑t∈{1,2,3,4,5} p(ISUSE = t)
这些计算公式基于 logprobs 参数,可以更好地评估每个文档的生成结果,并选择得分最高的文档作为最终结果。
模型训练
Self-RAG 需要训练两种类型的模型:评论模型(Critic)和生成模型(Generator)。评论模型使用 GPT-4 生成的数据作为训练材料,而生成模型使用检索数据和评论模型生成的数据作为训练材料。两者都可以基于基础模型进行训练。
Self-RAG 研究团队基于 Llama2–7b 和 Llama2–13b 训练了模型。训练好的模型可以在 Huggingface 上找到。然而,官方模型没有明确区分评论和生成模型,这意味着这些模型可以用于评估和生成。
让我们来看看模型的训练数据,首先是评论模型的训练数据。以下是一个片段:
{"task": "retrieval","instruction": "当提供指示时,请评估是否从外部来源(例如网络,如维基百科)获取额外信息有助于产生更全面的回应。以 [Retrieval] 或 [No Retrieval] 回应。","input": "任务指示:评估以下网站设计。https://example.com\n","output": "[Retrieval]"}
评论模型的每个训练数据条目都是一个任务,任务类型包括 retrieval、groundness、utility 和 multi_retrieval。
retrieval 任务训练生成 IsREL 评估指标。
groundness 任务训练生成 IsSUP 评估指标。
utility 任务训练生成 IsUSE 评估指标。
multi_retrieval 任务训练生成 Retrieve 类型的反思标记,即是否需要检索。
从训练数据中,我们可以看到评论模型主要训练如何评估这四种类型的任务,根据指示和输入数据输出正确的评估结果。
接下来,让我们来看生成模型的训练数据。以下是一个片段:
{"instruction": "问题:根据“游骑兵展示一些铁以扳平系列赛”编写文本\n文本:除了才华横溢、自信和高薪外,这些经验丰富的游骑兵还很体贴。\n\n问题:根据“联盟不会解除通用汽车加拿大总部的封锁”编写文本\n文本:尽管有可能将新车生产带到一家卡车工厂即将关闭的综合体,但加拿大汽车工人官员周五拒绝解除对通用汽车加拿大总部的封锁。\n\n问题:根据“六名阿塞拜疆反对派议会候选人宣布绝食”编写文本","output": "[No Retrieval] 六名阿塞拜疆反对派议会候选人周五宣布绝食,以向政府施压确保公平选举。[Utility:5]","input": "","id": "flan_v2_18667","dataset_name": "flan_v2"}
从训练数据中,我们可以看到生成模型主要训练如何使用反思标记生成全面的结果。
LlamaIndex Self-RAG包
目前,有一些开源的自助RAG实现,例如LlamaIndex上的自助RAG实现,在Llama Packs中可用。让我们看看如何使用LlamaIndex的自助RAG包。
Llama Packs是社区驱动的预打包模块或模板集合,用于快速构建基于LLM的应用程序。如果LlamaIndex就像VsCode,那么Llama Packs就像VsCode扩展。
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-07-18
2024-05-05
2024-06-20
2024-05-19
2024-07-09
2024-09-04
2024-07-09
2024-07-07
2024-07-07
2024-07-08
2024-12-14
2024-12-01
2024-11-27
2024-11-25
2024-11-06
2024-11-06
2024-11-05
2024-11-04