【大语言模型】NLP•检索增强生成之三
视频号
微信公众号
知识星球
- 概述
- 动机
- 神经检索
- 检索增强生成(RAG)流水线
- RAG的好处
- RAG与微调
- RAG合奏
- 使用特征矩阵选择矢量数据库
- 构建RAG管道
- 摄入
- Chucking
- 嵌入
- 句子嵌入:内容和原因
- 背景:与BERT等代币级别模型相比的差异
- 相关:句子转换器的训练过程与令牌级嵌入模型
- 句子变换器在RAG中的应用
- 句子嵌入:内容和原因
- 检索
- 标准/天真的方法
- 优势
- 缺点
- 语句窗口检索/从小到大分块
- 优势
- 缺点
- 自动合并检索器/层次检索器
- 优势
- 缺点
- 计算出理想的块大小
- 寻回器镶嵌和重新排列
- 使用近似最近邻进行检索
- 重新排序
- 标准/天真的方法
- 响应生成/合成
- 迷失在中间:语言模型如何使用长上下文
- “大海捞针”测试
- 摄入
- 组件式评估
- 检索度量
- 上下文精度
- 上下文回忆
- 上下文相关性
- 生成度量
- 脚踏实地
- 回答相关性
- 端到端评估
- 回答语义相似性
- 答案正确性
- 检索度量
- 多模式RAG
- 改进RAG系统
- 相关论文
- 知识密集型NLP任务的检索增强生成
- 主动检索增强生成
- 多模式检索增强生成器
- 假设文档嵌入(HyDE)
- RAGAS:检索增强生成的自动评估
- 微调还是检索?LLM中知识注入的比较
- 密集X检索:我们应该使用什么检索粒度?
- ARES:一种用于检索增强生成系统的自动评估框架
- 引用
构建RAG管道
检索
让我们来看三种不同类型的检索:标准检索、语句窗口检索和自动合并检索。这些方法中的每一种都有特定的优势和劣势,其适用性取决于RAG任务的要求,包括数据集的性质、查询的复杂性以及响应中的特定性和上下文理解之间的期望平衡。
标准/天真的方法
正如我们在下面的图片(来源)中看到的,标准管道使用相同的文本块进行索引/嵌入以及输出合成。
在大型语言模型(LLM)中的检索增强生成(RAG)的背景下,以下是三种方法的优缺点:
优势
简单高效:这种方法简单高效,使用相同的文本块进行嵌入和合成,简化了检索过程。
数据处理的一致性:它保持了检索和合成阶段使用的数据的一致性。
缺点
有限的上下文理解:LLM可能需要更大的合成窗口来生成更好的响应,而这种方法可能无法充分提供。
次优响应的可能性:由于上下文有限,LLM可能没有足够的信息来生成最相关和准确的响应。
语句窗口检索/从小到大分块
句子窗口方法将文档分解为较小的单元,例如句子或小的句子组。
它对检索任务(存储在Vector DB中的较小块)的嵌入进行解耦,但对于合成,它在检索到的块周围的上下文中添加回来,如下图所示(来源)。
在检索过程中,我们通过相似性搜索来检索与查询最相关的句子,并将该句子替换为完整的周围上下文(使用上下文周围的静态句子窗口,通过检索原始检索的句子周围的句子来实现),如下图所示(来源)。
优势
增强了检索的特异性:通过将文档分解为更小的单元,可以更精确地检索与查询直接相关的分段。
上下文丰富的合成:它围绕检索到的块重新引入上下文进行合成,为LLM提供了更广泛的理解来制定响应。
平衡方法:这种方法在重点检索和上下文丰富性之间取得了平衡,有可能提高响应质量。
缺点
复杂性增加:管理单独的检索和合成过程增加了管道的复杂性。
潜在的上下文差距:如果添加回来的周围信息不够全面,就有可能错过更广泛的上下文。
自动合并检索器/层次检索器
下面的图片(来源)说明了自动合并检索是如何工作的,因为它不会像天真的方法那样检索一堆碎片块。
如下图所示,如果块大小较小,那么天真方法中的碎片化情况会更糟(来源)。
自动合并检索旨在组合(或合并)来自多个文本源或片段的信息,以创建对查询的更全面和上下文相关的响应。当没有单个文档或分段完全回答查询,而是答案在于组合来自多个来源的信息时,这种方法尤其有用。
它允许将较小的块合并为较大的父块。它通过以下步骤实现:
定义链接到父块的较小块的层次结构。
如果链接到父块的较小块的集合超过某个阈值(例如余弦相似性),则将较小块“合并”到较大的父块中。
该方法最终将检索父块以获得更好的上下文。
优势
全面的情境回应:通过合并来自多个来源的信息,它可以创建更全面、更具情境相关性的回应。
减少碎片化:这种方法解决了碎片化信息检索的问题,这在幼稚的方法中很常见,尤其是对于较小的块大小。
动态内容集成:它将较小的块动态地组合成更大、信息量更大的块,增强了提供给LLM的信息的丰富性。
缺点
层次结构和阈值管理的复杂性:定义层次结构和为合并设置适当阈值的过程是复杂的,对有效运作至关重要。
过度概括的风险:有可能合并过多或无关的信息,导致反应过于宽泛或偏离主题。
计算强度:由于合并和管理文本块的层次结构需要额外的步骤,这种方法的计算强度可能更高。
计算出理想的块大小
通常,在构建RAG应用程序时,有许多检索参数/策略需要决定(例如,从块大小到矢量与关键字与混合搜索)。让我们放大区块大小方面。
构建RAG系统包括为检索器组件将处理的文档确定理想的块大小。理想的块大小取决于几个因素:
数据特征:数据的性质至关重要。对于文本文件,请考虑段落或小节的平均长度。如果文档结构良好,有不同的部分,这些自然的划分可能会成为分块的良好基础。
检索器约束:您选择的检索器模型(如BM25、TF-IDF或DPR等神经检索器)可能对输入长度有限制。确保块与这些约束兼容是至关重要的。
内存和计算资源:较大的块大小会导致更高的内存使用率和计算开销。平衡块大小与可用资源,以确保高效处理。
任务要求:任务的性质(例如,问题回答、文档摘要)会影响理想的块大小。对于详细的任务,较小的块可能更有效地捕捉特定的细节,而更广泛的任务可能受益于较大的块来捕捉更多的上下文。
实验:通常,确定理想块大小的最佳方法是通过经验测试。使用不同的块大小运行实验,并评估验证集的性能,以找到粒度和上下文之间的最佳平衡。
重叠考虑:有时,块之间有重叠是有益的,以确保在边界处不会遗漏重要信息。根据任务和数据特征确定适当的重叠大小。
总之,确定RAG系统的理想块大小是一种平衡行为,包括考虑数据的特性、检索器模型的局限性、可支配的资源、任务的具体要求和经验实验。这是一个可能需要迭代和微调才能获得最佳结果的过程。
寻回器镶嵌和重新排列
思考:如果我们可以一次尝试一堆块大小,然后让一个重新排序的人来修剪结果呢?
这实现了两个目的:
假设重新排序器具有合理的性能水平,通过汇集来自多个块大小的结果来获得更好(尽管成本更高)的检索结果。
一种对不同的检索策略进行基准测试的方法(w.r.t.重新排序)。
过程如下:
以多种不同的方式对同一文档进行分块,例如使用分块大小:128、256、512和1024。
在检索过程中,我们从每个检索器中提取相关的块,从而将它们组合在一起进行检索。
使用重新排序器对结果进行排序/修剪。
下图(来源)描述了这一过程。
根据LlamaIndex的评估结果,集成方法的忠诚度指标略有上升,表明检索结果的相关性略高。但是,成对的比较会导致对这两种方法的同等偏好,这使得组合是否更好仍然值得怀疑。
注意,除了块大小之外,集合策略也可以应用于RAG管道的其他方面,例如向量与关键字与混合搜索等。
使用近似最近邻进行检索
下一步是考虑从索引中选择哪个近似近邻(ANN)库。选择最佳选项的一个选项是查看此处的排行榜。
更多关于人工神经网络的信息可以在人工神经网络引物中找到。
重新排序
RAG中的重新排序是指根据检索到的文档或信息片段与给定查询或任务的相关性对其进行评估和排序的过程。
RAG中使用了不同类型的重新排序技术:
词汇重新排序:这涉及到根据查询和检索到的文档之间的词汇相似性进行重新排序。像BM25或与TF-IDF向量的余弦相似性这样的方法是常见的。
语义重新排序:这种类型的重新排序使用语义理解来判断文档的相关性。它通常涉及像BERT或其他基于转换器的模型这样的神经模型,以理解不仅仅是单词重叠之外的上下文和含义。
学习排序(LTR)方法:这些方法包括根据从查询和文档中提取的特征,专门针对文档排序任务(逐点、成对和列表)训练模型。这可以包括词汇、语义和其他特征的混合。
混合方法:这些方法结合了词汇和语义方法,可能与用户反馈或特定领域特征等其他信号,以提高重新排名。
神经LTR方法在这一阶段最常用,因为候选集仅限于几十个样本。用于重新排序的一些常见神经模型包括:
使用BERT的多阶段文档排序(单BERT和双BERT)
用于文本排名的预训练转换器BERT及更高版本
清单T5
ListBERT
响应生成/合成
RAG管道的最后一步是生成返回给用户的响应。在这一步骤中,模型将检索到的信息与其预先训练的知识进行合成,以生成连贯且与上下文相关的响应。这一过程包括整合从各种来源收集的见解,确保准确性和相关性,并制定一个不仅信息丰富,而且与用户原始查询一致的响应,保持自然和对话的语气。
请注意,在创建扩展提示时(使用检索到的top-k
组块),以便LLM进行知情响应生成,在输入序列的开始或结束处战略性地放置重要信息可以增强RAG系统的有效性,从而使系统更具性能。以下论文对此进行了总结。
迷失在中间:语言模型如何使用长上下文
虽然最近的语言模型能够将长上下文作为输入,但人们对语言模型使用长上下文的情况知之甚少。
来自斯坦福大学、加州大学伯克利分校Percy Liang实验室的刘等人和Samaya AI的这篇论文分析了语言模型在两项任务中的性能,这两项任务需要在输入上下文中识别相关信息:多文档问答和键值检索。简单地说,他们通过识别上下文中的相关信息来分析和评估LLM如何使用上下文。
他们测试了开源(MPT-30B-Instruction,LongChat-13B)和闭源(OpenAI的GPT-3.5-Turbo和Anthropic的Claude 1.3)模型。他们使用多文档问答,其中上下文包括多个检索到的文档和一个正确答案,其位置被打乱。进行键值对检索以分析较长的上下文是否会影响性能。
他们发现,当相关信息出现在输入上下文的开头或结尾时,性能通常最高,而当模型必须在长上下文的中间访问相关信息时,性能会显著下降。换言之,他们的研究结果基本上表明,当回答查询的相关信息出现在上下文窗口的中间,对其开始和结束都有强烈的偏见时,重试增强(RAG)性能会受到影响。
相关信息刚开始时的最佳性能。
性能随着上下文长度的增加而降低。
检索到的文档过多会影响性能。
通过排名阶段改进检索和提示创建步骤可能会将性能提高20%。
如果提示适合原始上下文,则扩展上下文模型(GPT-3.5-Turbo与GPT-3.5-Turbo(16K))并不更好。
考虑到RAG从外部数据库中检索信息,该数据库通常包含被分割成块的较长文本。即使使用分割块,上下文窗口也会很快变大,至少比“正常”的问题或指令大得多。此外,即使对于显式长上下文模型,性能也会随着输入上下文的增长而显著降低。他们的分析提供了对语言模型如何使用其输入上下文的更好理解,并为未来的长上下文模型提供了新的评估协议。
“在基于变换器的LLM架构中,没有特定的归纳偏见可以解释为什么文档中间的文本的检索性能会更差。我怀疑这都是因为训练数据和人类写作方式:最重要的信息通常在开头或结尾(请参阅论文摘要和结论部分),然后是LLM如何在训练中参数化注意力权重。”来源
换句话说,人类文本工件的构建方式通常是长文本的开头和结尾最重要,这可能是对这项工作中观察到的特征的潜在解释。
你也可以用人类面临的两种流行的认知偏见(首要偏见和近因偏见)来建模,如下图所示(来源)。
最后的结论是,将检索与排名相结合(如在推荐系统中)应该会在RAG中产生最佳的问题回答性能。
下图(来源)显示了论文中提出的想法的概述:“LLM更善于在输入上下文的开头或结尾使用信息”。
下图说明了改变相关信息(包含答案的文件)的位置对多文档问答性能的影响。较低的位置更接近输入上下文的开始。当相关信息位于上下文的最开始或最结尾时,性能通常最高,而当模型必须在其输入上下文的中间对信息进行推理时,性能会迅速下降。
“大海捞针”测试
为了理解长上下文LLM在其提示的各个部分的上下文内检索能力,可以进行简单的“大海捞针”分析。这种方法包括将特定的、有针对性的信息(“针”)嵌入到更大、更复杂的文本体(“干草堆”)中。其目的是测试LLM在大量其他数据中识别和利用这一特定信息的能力。
实际上,分析可能涉及将一个独特的事实或数据点插入一个冗长的、看似无关的文本中。LLM将被赋予任务或查询的任务,这些任务或查询要求它调用或应用这些嵌入的信息。这种设置模拟了真实世界中的情况,在这种情况下,基本细节通常隐藏在大量内容中,检索这些细节的能力至关重要。
实验的结构可以评估LLM性能的各个方面。例如,“针”的位置可以变化——在文本的早期、中期或后期——以查看模型的检索能力是否会根据信息位置而变化。此外,可以修改周围“干草堆”的复杂性,以测试LLM在不同程度的上下文困难下的性能。通过分析LLM在这些场景中的表现,可以深入了解其上下文检索功能和潜在的改进领域。
这可以使用Needle In A Haystack库来完成。下图显示了OpenAI的GPT-4-128K在不同上下文长度下的(顶部)和(底部)性能。
下图(来源)显示了Claude 2.1基于提示上下文长度区域的长上下文问答错误。平均而言,与克劳德2相比,克劳德2.1的错误答案减少了30%。
然而,在Claude 2.1博客的Long context提示中,Anthropic指出,添加“这是上下文中最相关的一句话:”到Claude的回复开始时,将原始评估的得分从27%提高到98%!博客中的下图显示了Claude 2.1在整个200K令牌上下文窗口中检索单个句子时的表现。本实验使用上述提示技巧来引导克劳德回忆最相关的句子。
- 42 次浏览