GraphRAG学习小结(1)

wanxueyao 2024-10-20 12:01:01 阅读 51

1.概述

说明:因为内容比较多就拆成多个blog了,之前十四万字的博文我自己再读都害怕,更何况别人呢...这部分是例子概述与RAG简介,如果对RAG已经有一定了解可以跳过,只读概述的例子部分即可。

参考论文《From Local to Global: A Graph RAG Approach to Query-Focused Summarization》。

github仓库 GitHub - microsoft/graphrag: A modular graph-based Retrieval-Augmented Generation (RAG) system

官方说明网址 Welcome to GraphRAG

首先通过一个例子来引入GraphRAG。

测试文档与结果下载 https://pan.baidu.com/s/1ufEsBiakJuxrMU1WRqqCQA?pwd=i6v1

我们对LLM提这样一个问题。

“请概括小说的故事情节并分析故事的主旨。”

这是一个QFS任务,query- focused summarization (QFS) task。翻译过来就是一个以查询为重点的摘要任务,或者说查询聚焦任务。通常来讲大模型对于这种任务只能依赖上下文理解,那么具体表现如何呢?

### 故事情节概括

《冬日诗篇》讲述了一群高中生在艺术节前夕共同准备舞台剧《小王子》的故事。主人公和他的同班同学们为了准备这场表演,各自承担了不同的任务。在过程中,主人公的前桌展现了出色的组织和管理能力,与班长一起努力完成排练和准备工作。与此同时,故事也穿插了主人公和朋友们之间的日常生活,成长过程中面对的各种挑战和改变。最终,通过这次艺术节的活动,大家不仅完成了舞台剧的表演,也在这段过程中收获了珍贵的友谊和成长的体验【7:0†source】【7:1†source】。

### 故事主旨分析

《冬日诗篇》的主旨集中在青春成长、友谊和自我发现上。故事通过高中生们为艺术节舞台剧准备的过程,展现了他们在合作、互助中逐渐成长,学会承担责任和面对挑战。同时,小说还通过人物之间的互动,刻画了青春期的友情与爱情,描绘了青少年在成长过程中的心路历程。作者用细腻的笔触表现了主人公对未来的迷茫与期望,传达出在成长中勇敢追梦、不轻言放弃的重要性。整篇小说洋溢着对青春岁月的怀念和对未来的美好期待【7:5†source】【7:6†source】。

这些内容不仅丰富了小说的层次感,也让读者在阅读中感受到了青春的美好和成长的艰辛。通过这样的描写,作者希望传递出珍惜当下、勇敢面对未来的积极态度。

以上便是Chat-GPT-4o的回答,读起来似乎很有道理,不过我们先再来看一个回答。

### 故事情节概括

小说《AS 冬日诗篇》通过多个章节展开,讲述了一个男孩与一个神秘的雪做的女孩之间的故事。以下是故事的主要情节概括:

1. **第一章**:男孩在废弃公园的长椅上哭泣,因为一本珍贵的书被损坏。雪做的女孩出现并与他交谈,安慰他并邀请他回家。男孩对她产生了好奇。

2. **第二章**:男孩带着衣服再次来到公园,希望能给雪做的女孩穿上。他们一起讨论了雪绒花,并建立了更深的联系。

3. **第三章**:男孩和雪做的女孩一起建造了一个雪屋。过程中遇到了许多困难,但最终成功。他们的关系进一步加深。

省略了一部分...

### 故事主旨分析

1. **成长与变化**:故事通过男孩和雪做的女孩的相遇和相处,展示了成长过程中的变化和挑战。男孩从一个孤独的孩子逐渐成长为一个更成熟的人,学会了关心和理解他人。

2. **友情与爱情**:男孩和雪做的女孩之间的关系从最初的陌生逐渐发展为深厚的友情,甚至带有一丝爱情的萌芽。他们的关系展示了人与人之间情感的复杂性和深度。

3. **家庭与小镇的意义**:通过男孩的家庭生活和对小镇的描述,故事探讨了家庭和故乡对个人的意义。男孩对家庭的依恋和对小镇的熟悉感,体现了对归属感和安全感的追求。

4. **未知与神秘**:雪做的女孩象征着未知和神秘,她的出现给男孩的平凡生活带来了新的刺激和挑战。男孩通过与她的互动,学会了面对未知和接受变化。

5. **告别与承诺**:故事的结尾是一次告别,但同时也是对未来的承诺。男孩承诺会等待女孩的归来,这体现了对未来的希望和对过去的珍惜。

6. **生命的意义**:通过男孩和女孩的故事,作者探讨了生命的意义。尽管女孩是一个幽灵,但她的存在让男孩意识到生命的宝贵和有限。男孩学会了珍惜每一个瞬间,并努力成为更好的自己。

总的来说,《AS 冬日诗篇》是一个关于成长、友情、爱情和生命意义的故事,通过男孩和雪做的女孩的经历,展现了人类情感的复杂性和生活的多样性。

这个读起来是不是更厉害了,使用的是kimi。但是仔细对比两个答案会发现一个神奇的事。这两个回答竟然针对的是同一篇小说...

需要声明一点,这个小说是本人自己写的中篇,并未发表在任何地方,所以相关内容不可能出现在大模型的训练资料中。选择这篇小说做测试的一个原因就是它的叙事方式,交替采用了第一人称,第三人称,而且总共是三个互相关联又相互独立的故事结合而成。人类读者可以自然地随着故事进展理解情节,但是很显然大语言模型受限于上下文长度没法把握整体故事。为了后续内容,这里我们先给出故事的大纲。

本篇的三个故事相互独立又相互交织,在细节上有很多地方相连。

第一篇章(男主人公第一人称视角):在小镇的冬天里,哭泣的男孩在废弃的公园遇到了一个雪做的女孩。他们一起度过了一个难忘的冬天。春天到来,女孩在男孩的怀抱中消失了。

第二篇章:一直在独自一人的世界里旅行的少女(失去了记忆的雪做的女孩)跨越四个季节,来到一个小镇的车站,乘上了驶向远方的列车。

第三篇章(女主人公第一人称视角):他(第一篇章的男孩)在小学5年级转学到了她的学校,他们成了同桌。初中,他们又分到了一个班级,她隐约察觉到了自己的憧憬,追寻着他的步伐,考进了同一个高中。虽然高中见面的机会很少,但她还是没放弃,终于如愿进入了同一所大学。即便进入了同一所大学,她依旧没有勇气坦白自己的心意。但现在有这样的距离她和他都很满足了。

最终章(男主人公第一人称视角):他和她(同第三篇章)都成为了家乡的高中老师。他邀请她去看星星想要履行对雪做的女孩许下的约定,那晚刚好遇上了流星暴。

结合上面的内容就可以发现虽然现在的大模型可以借助RAG技术实现对额外数据库的查询和引用,但在全局性的问题上表现不佳,只能从中选择部分内容进行理解和分析。

2.什么是RAG

2.1 RAG的概念与工作流程

RAG,即Retrieval-Augmented Generation,字面上来看就是一种增强检索(Retrieval)的生成(Generation)方式。稍微展开一点的话可以这样理解,在传统语言模型中,回答仅基于训练阶段的预先学习的模式和信息生成。然而,这些模型本质上受到它们所训练的数据的限制,容易导致回答的结果缺乏深度或因特定知识的缺失而出现“幻觉”。

RAG通过在生成过程中根据需要提取外部数据来解决这一限制。它的工作原理如下:当进行查询时,RAG系统首先从大型数据集或知识库中检索相关信息,然后将这些信息用于指导回答的生成。

Query处理:一切都从Query开始。这可能是一个问题或希望对语言模型进行的任何输入。嵌入模型:然后将Query传递给embedding模型。矢量数据库(DB)检索:Query矢量用于通过矢量数据库进行搜索。该数据库包含模型可用于生成回答的潜在上下文的预计算向量。该系统根据其向量与查询向量匹配的接近程度来检索最相关的上下文。检索的上下文:检索的上下文然后传递给大型语言模型(LLM)。LLM响应生成:LLM考虑了原始Query信息和检索到的上下文,以生成全面和相关的响应。它综合了来自上下文的信息,以确保回答不仅基于其先前存在的知识,而且还从检索到的数据中增强了具体细节。最终响应:最后,LLM输出回答。

2.2 文本嵌入与检索类型

文本嵌入(word embedding)是单词或段落的矢量表示,使用机器学习算法将文本数据转换为数字矢量来编码语义含义。这些向量代表单词和短语的语义含义,使计算机能够更有效地理解和处理自然语言。

数值向量的长度称为嵌入维度。更高的维度意味着嵌入向量存储有关文本语义意义和关系的更多信息。

文本嵌入将文档、段落和句子等非结构化文本转换为有意义的矢量表示。输入是一段文本,输出是具有n个维度的单行向量(1 x n向量)。

具体可以参考如下示例。

<code># Amazon Bedrock - Embeddings Models

import boto3

from langchain_community.embeddings import BedrockEmbeddings

# Bedrock runtime - boto3 client

bedrock_runtime = boto3.client(

service_name="bedrock-runtime",code>

region_name="us-east-1",code>

)

# amazon.titan-embed-text-v1 model example

titan_embeddings = BedrockEmbeddings(

client=bedrock_runtime,

model_id="amazon.titan-embed-text-v1"code>

)

# amazon.titan-embed-text-v1 model example - Embedding Dimensions: 1536

embeddings = titan_embeddings.embed_query("Hello World!")

print(len(embeddings)) # length of embedding dimensions = 1 x 1536

print(embeddings[:5]) # only include the first 5 elements

1536

[0.45703125, 0.30078125, 0.41210938, 0.41015625, 0.74609375]

# cohere.embed-english-v3 model example

cohere_embeddings = BedrockEmbeddings(

client=bedrock_runtime,

model_id="cohere.embed-english-v3"code>

)

# cohere.embed-english-v3 model example - Embedding Dimensions: 1024

embeddings = cohere_embeddings.embed_query("Hello World!")

print(len(embeddings)) # length of embedding dimensions = 1 x 1024

print(embeddings[:5]) # only include the first 5 elements

1024

[-0.041503906, -0.026153564, -0.070373535, -0.057495117, -0.026245117]

# cohere.embed-multilingual-v3 model example

cohere_multilingual_embeddings = BedrockEmbeddings(

client=bedrock_runtime,

model_id="cohere.embed-multilingual-v3"code>

)

# cohere.embed-multilingual-v3 model example - Embedding Dimensions: 1024

embeddings = cohere_multilingual_embeddings.embed_query("Hello World!")

print(len(embeddings)) # length of embedding dimensions = 1 x 1024

print(embeddings[:5]) # only include the first 5 elements

1024

[0.008834839, 0.05078125, 0.022613525, 0.0124053955, -0.023864746]

检索类型:

密集检索:使用神经网络方法来创建文本的密集矢量嵌入。当文本的含义比确切的措辞更重要时,它们往往表现得更好,因为嵌入捕获了语义的相似性。稀疏检索:依赖于TF-IDF或BM25等术语匹配技术。擅长查找具有精确关键字匹配的文档,当查询包含唯一或罕见的术语时,这可能特别有用。

2.3基础RAG的pipeline

和2.1类似,不过加入了Ingestion部分。

2.3.1 Ingestion数据库构建

2.3.1.1 chunking分块

分块是将要检索的内容划分为较小的、易于管理的片段或块的过程。这些分块可以用固定大小来定义,如特定数量的字符、句子或段落。

RAG 中,每个信息块都被编码成一个嵌入向量,用于检索。更小、更精确的信息块能使用户的查询与内容更加匹配,从而提高检索信息的准确性和相关性。而较大的信息块则可能包含不相关的信息,从而带来噪音,并有可能降低检索的准确性。通过控制块的大小,RAG 可以在全面性和准确性之间保持平衡。

处理长篇文章或书籍时,较大的分块有助于保留更多的上下文和主题连贯性;而对于社交媒体帖子,较小的分块可能更适合捕捉每个帖子的精确语义。如果用户的查询通常是简短和具体的,较小的分块可能更为合适;相反,如果查询较为复杂,可能需要更大的分块。

因此,下一个问题就是,如何根据使用情况选择合适的块大小?在 RAG 中,选择块大小至关重要。它需要足够小,以确保相关性并减少噪音,但又要足够大,以保持上下文的完整性。下面让我们看看 Pinecone (一个很好用的向量数据库(* ̄︶ ̄))提供的几种方法:

固定大小的分块: 只需确定分块中的标记数量,以及它们之间是否应该有重叠。分块之间的重叠可以保证分块之间的语义上下文损失最小。这种方案计算成本低,实现简单。

<code>text = "..." # your text

from langchain.text_splitter import CharacterTextSplitter

text_splitter = CharacterTextSplitter(

separator = "\n\n",

chunk_size = 256,

chunk_overlap = 20

)

docs = text_splitter.create_documents([text])

内容感知分块: 内容感知分块利用文本的内在结构来创建更有意义、与上下文更相关的分块。以下是实现这一目标的几种方法:句子分割 这种方法与为嵌入句子级内容而优化的模型相一致。不同的工具和技术可用于句子分割:

自然拆分法(Naive Splitting): 使用句号和新行分割句子的基本方法。

text = "..." # Your text

docs = text.split(".")

NLTK(自然语言工具包Natural Language Toolkit): 一个用于语言处理的综合性 Python 库。NLTK 包括一个句子标记器,能有效地将文本分割成句子。

text = "..." # Your text

from langchain.text_splitter import NLTKTextSplitter

text_splitter = NLTKTextSplitter()

docs = text_splitter.split_text(text)

spaCy :spaCy 是用于 NLP 任务的高级 Python 库,可提供高效的句子分割功能。

text = "..." # Your text

from langchain.text_splitter import SpacyTextSplitter

text_splitter = SpacyTextSplitter()

docs = text_splitter.split_text(text)

递归分块: 递归分块是一种迭代方法,它使用各种分隔符对文本进行分层。它通过递归应用不同的标准来创建大小或结构相似的分块。例如,在langchain中会先通过段落换行符(`\n\n`)进行分割。然后,检查这些块的大小。如果大小不超过一定阈值,则该块被保留。对于大小超过标准的块,使用单换行符(`\n`)再次分割。以此类推,不断根据块大小更新更小的分块规则(如空格,句号)。这种方法可以灵活地调整块的大小。例如,对于文本中的密集信息部分,可能需要更细的分割来捕捉细节;而对于信息较少的部分,则可以使用更大的块。而它的挑战在于,需要制定精细的规则来决定何时和如何分割文本。

text = "..." # Your text

from langchain.text_splitter import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(

chunk_size = 256,

chunk_overlap = 20

)

docs = text_splitter.create_documents([text])

从小到大分块:既然小的分块和大的分块各有各的优势,一种更为直接的解决方案是把同一文档进行从大到小所有尺寸的分割,然后把不同大小的分块全部存进向量数据库,并保存每个分块的上下级关系,进行递归搜索。但可想而知,因为我们要存储大量重复的内容,这种方案的缺点就是需要更大的储存空间,

特殊结构分块:针对特定结构化内容的专门分割器。这些分割器特别设计来处理这些类型的文档,以确保正确地保留和理解其结构。langchain提供的特殊分割器包括:Markdown文件,Latex文件,以及各种主流代码语言分割器。

2.3.1.2 embedding嵌入

对提示信息进行适当分块后,下一步就是嵌入。在 RAG 中嵌入提示和文档涉及到将用户的query和知识库中的文档转换为可有效比较相关性的格式。这一过程对于 RAG 从知识库中检索最相关信息以响应用户query的能力至关重要。下面是它的工作原理:

选择最适合任务的嵌入模型的一个方法是查看 HuggingFace 的海量文本嵌入基准 (MTEB) 排行榜(https://huggingface.co/spaces/mteb/leaderboard)。在使用密集嵌入还是稀疏嵌入的问题上,可以从以下几个方面来了解各自的优势:

稀疏嵌入: 稀疏嵌入(如 TF-IDF)非常适合将提示与文档进行词法匹配。最适合关键词相关性至关重要的应用。它的计算密集度较低,但可能无法捕捉文本中更深层的语义。

语义嵌入: 语义嵌入(如 BERT 或 SentenceBERT)自然适用于 RAG 用例。

BERT:适合捕捉文档和查询中的上下文细微差别。与稀疏嵌入式相比,它需要更多的计算资源,但能提供语义更丰富的嵌入式。

SentenceBERT:适用于句子层面的上下文和含义非常重要的情况。它在 BERT 的深度上下文理解与简洁、有意义的句子表示之间取得了平衡。

Word2Vec模型,尽管功能强大,但存在一个重要的局限性:其生成的词向量是静态的。一旦模型训练完成,每个词的向量表示就固定不变,这在处理一词多义的情况时可能导致问题。比如, “我买了一张光盘”,这里“光盘”指的是具体的圆形盘片,而在“光盘行动”中,“光盘”则指的是把餐盘里的食物吃光,是一种倡导节约的行为。语义完全不一样的词向量却是固定的。相比之下,引入自注意力机制的模型,如BERT,能够提供动态的词义理解。这意味着它可以根据上下文动态地调整词义,使得同一个词在不同语境下有不同的向量表示。在之前的例子中,“光盘”这个词在两个句子中会有不同的向量,从而更准确地捕捉其语义。

2.3.2 Retrieval查询

有两种不同类型的检索:标准检索和句子窗口检索。每种方法都有特定的优缺点,其适用性取决于 RAG 任务的要求,包括数据集的性质、查询的复杂性以及所需的特定性与响应的上下文理解之间的平衡。

2.3.2.1标准检索 Standard/Naive Approach

如下图所示,标准pipeline使用相同的文本块进行索引/嵌入以及输出合成。

就大型语言模型(LLM)中的检索增强生成(RAG)而言,以下是方法的优缺点:

优点

简单高效: 这种方法直接高效,嵌入和合成都使用相同的文本块,简化了检索过程。

数据处理的统一性: 在检索和合成阶段使用的数据保持一致。

缺点

语境理解有限: LLM 可能需要更大的合成窗口来生成更好的响应,而这种方法可能无法提供足够的窗口。

可能出现次优回复: 由于语境有限,LLM 可能没有足够的信息来生成最相关、最准确的回复。

2.3.2.2句子窗口检索Sentence-Window Retrieval / Small-to-Large Chunking

句子窗口法将文档分解为更小的单元,如句子或小的句子组。

对于检索任务(即存储在矢量数据库中的较小块),它将嵌入解耦,但对于合成任务,它将检索到的块周围的上下文添加回去,如下图所示。

在检索过程中,我们通过相似性搜索检索与查询最相关的句子,并用完整的上下文替换句子(使用上下文周围的静态句子窗口,通过检索最初检索句子周围的句子来实现),如下图所示。

优势

提高检索的针对性: 通过将文档分解成更小的单元,可以更精确地检索与查询直接相关的片段。

语境丰富的合成: 它围绕检索到的片段重新引入上下文进行综合,为 LLM 提供更广泛的理解,以制定回答。

平衡: 这种方法在重点检索和丰富语境之间取得了平衡,有可能提高回复质量。

缺点

复杂性增加: 管理检索和合成的不同流程会增加流程的复杂性。

潜在的语境空白: 如果添加回来的周边信息不够全面,就有可能遗漏更广泛的上下文。

2.3.2.3 检索器组装和重新排名Retriever Ensembling and Reranking

思考:如果我们能同时尝试多种块大小,并让重排器对结果进行修剪,会怎么样?

假设重新排序器具有合理的性能水平,通过汇集来自多个分块大小的结果,获得更好(尽管成本更高)的检索结果。

对不同的检索策略(相对于重新排序器)进行基准测试。

具体过程如下

以多种不同方式对同一文档进行分块,例如分块大小为 128、256、512 和 1024。

在检索过程中,我们从每个检索器中获取相关的分块,从而将它们组合在一起进行检索。

使用重排器对结果进行排序/剪裁。

下图描述了这一过程。

重新排序

RAG 中的重新排序是指根据检索到的文档或信息片段与给定query或任务的相关性对其进行评估和排序的过程。

RAG 中使用了不同类型的重新排序技术:

词法重新排序: 这包括根据查询和检索文档之间的词法相似性重新排序。常见的方法有 BM25 或带有 TF-IDF 向量的余弦相似性。

语义重新排序: 这类重新排序使用语义理解来判断文档的相关性。它通常涉及神经模型,如 BERT 或其他基于转换器的模型,以理解上下文和意义,而不仅仅是单词重叠。

学习排名(LTR)方法: 这些方法涉及根据从查询和文档中提取的特征,专门为文档排序任务(点排序、对排序和列表排序)训练一个模型。这可能包括词法、语义和其他特征的混合。

混合方法: 这些方法结合了词法和语义方法,可能还包括用户反馈或特定领域特征等其他信号,以改进重新排序。

2.3.3 Response Generation / Synthesis 回答生成

RAG pipeline的最后一步是生成反馈给用户的回复。在这一步中,模型将检索到的信息与其预先训练的知识进行综合,以生成连贯且与上下文相关的回复。这一过程包括整合从各种来源收集到的见解,确保准确性和相关性,并制作出不仅信息丰富,而且与用户的原始query相一致的回复,同时保持自然和对话的语气。

需要注意的是,在为 LLM 生成有根据的回复创建扩展提示(包含检索到的 top-k 块)的同时,在输入序列的开头或结尾放置重要信息可以提高 RAG 系统的有效性,从而使系统更加高效。

2.4 RAG效果评估

2.4.1 独立评估(Independent Evaluation)

独立评估方法会分别评估检索模块(Retrieval Module)和生成模块(Generation Module),其中检索模块评估指标包括命中率(Hit Rate)、平均倒数排名(Mean Reciprocal Rank, MRR)、归一化折扣累积增益(Normalized Discounted Cumulative Gain, NDCG)、准确率(Precision)等,这些指标用于测量系统在根据查询或任务排名方面的有效性。而生成模块评估通常在端到端评估中进行。评估指标主要关注上下文相关性,测量检索到的文档与查询问题的相关性​​。

2.4.2 端到端评估(End-to-End Evaluation)

端到端评估方法评估RAG模型对给定输入生成的最终响应,包括模型生成答案与输入查询的相关性和对齐程度。从内容生成目标视角来评估可以将评估划分为未标记内容和已标记内容。未标记内容评估指标包括答案忠实度(Answer Fidelity)、答案相关性(Answer Relevance)、无害性(Harmlessness)等,而已标记内容评估指标包括准确率(Accuracy)和精确匹配(Exact Match, EM)。端到端评估可以分为人工评估和使用大型语言模型的自动评估。此外,还可以根据RAG在特定领域的应用,采用特定的评估指标,例如在问答任务中使用EM​​。

2.5 RAG(检索增强生成) vs Fine-Tuning(微调)

原论文:《Retrieval-Augmented Generation for Large Language Models: A Survey》

参考链接:https://zhuanlan.zhihu.com/p/673392898

这一链接同时也涵盖了大量RAG领域的重要论文,非常推荐阅读。

RAG是指结合了检索(从大型外部数据库中提取信息)和生成(基于检索到的信息生成答案)两个步骤。RAG通过引入外部知识来源,来增强语言模型的回答能力。Fine-Tuning是指在已有的预训练模型基础上,通过在特定数据集上进行额外的训练来优化模型。这个过程没有引入外部知识,而是调整模型以更好地适应特定任务。

2.6 RAG框架

基础RAG(Naive RAG)高级RAG(Advanced RAG)模块化RAG(Modular RAG)是检索增强生成在大型语言模型中应用的三种不同形式。

2.6.1 基础/朴素RAG

基础RAG是RAG方法的原始形式,它结合了信息检索和文本生成两个阶段。在这个框架中,当模型接收到一个查询时,它首先执行一个检索步骤,从一个大型的、结构化的知识库中检索出与查询相关的信息片段。然后,这些检索到的信息被送入一个生成器模型,该模型结合原始查询和检索到的信息来生成回答。基础RAG的关键在于它将检索和生成紧密结合,使得生成的回答能够利用检索到的实时外部信息。

2.6.2 高级RAG

高级RAG对基础RAG进行了改进,引入了预检索(pre-retrieval)后检索(post-retrieval)优化策略。在预检索阶段,模型会通过对查询进行处理(如扩展或重写)来提高检索的准确性和相关性。在后检索阶段,模型可以对检索到的信息进行进一步的处理,如重新排序、信息压缩或合成,以便更有效地融合到生成步骤中。这种高级RAG通过在检索前后增加额外的处理步骤,提高了回答的质量和相关性。

2.6.3 模块化RAG

模块化RAG是一种更灵活的RAG实现,它允许不同的检索和生成模块根据特定的应用需()求进行替换或重新配置。这种方法的关键在于模块化设计,使得研究者和开发者可以针对特定问题选择最合适的检索器和生成器。例如,对于某些特定类型的查询,可以选择特化的检索模块,或者针对特定的生成任务,选择一个适合该场景的生成器。模块化RAG提供了更大的灵活性和适应性,适用于多样化和动态变化的应用场景。

2.7 其他有趣的论文

2.7.1 Self-RAG

原文:《SELF-RAG: Learning To Retrieve, Generate, and Critique Through Self-Reflection》

SELF-RAG(Self-Reflective Retrieval-Augmented Generation):SELF-RAG旨在通过按需检索和自我反思来改善LLM的生成质量,包括其事实准确性,同时不损害其多功能性。SELF-RAG训练一个任意的语言模型(LM),以端到端的方式学习在给定任务输入的情况下反思其自身的生成过程,通过生成任务输出和间歇性的特殊token,即反思token(reflection tokens)。反思token分为检索(retrieval)批评(critique)token,分别指示检索的需要和生成质量。具体来说,

步骤1:SELF-RAG首先确定在继续生成中加入检索段落是否有帮助。如果有帮助,它会输出一个检索标记,按需调用检索模型。步骤2:SELF-RAG同时处理多个检索到的段落,评估它们的相关性,然后生成相应的任务输出。步骤3:SELF-RAG生成批评标记来批评自己的输出,并在事实性和整体质量方面选择最佳输出。与传统的RAG方法有所不同,RAG通常一次性检索固定数量的文档,而不考虑检索的必要性,也不会再次审视生成质量​​。

2.7.2 Raptor

原文:《RAPTOR: Recursive Abstractive Processing for Tree-Organized Retrieval》

检索增强型语言模型(Retrieval-augmented language models)能够适应世界的变化并包含更广泛的知识。但是,现有方法通常只能检索文档中的短文本段落,这限制了对文档整体上下文的深入理解。为了克服这个问题,本文提出了RAPTOR模型,它采用一种创新方法,通过递归地向量化、聚类和摘要文本,自下而上构建出一个包含不同级别摘要的树状结构。在使用时,RAPTOR能够从这棵树中检索信息,有效整合长篇文档中的信息,覆盖不同的抽象层次。通过实验发现这种递归摘要的检索方式在多个任务上都优于传统的检索增强方法。特别是在需要复杂推理的问答任务上,结合RAPTOR和GPT-4的使用将QuALITY基准测试的性能提高了20%。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。