小程序做网站登录,为什么wordpress有cookies,网站建设开发团队介绍,个人做理财网站好检索增强生成
检索增强生成简介
检索增强生成#xff08;RAG#xff09;旨在通过检索和整合外部知识来增强大语言模型生成文本的准确性和丰富性#xff0c;其是一个集成了外部知识库、信息检索器、大语言模型等多个功能模块的系统。
RAG 利用信息检索、深度学习等多种技术…检索增强生成
检索增强生成简介
检索增强生成RAG旨在通过检索和整合外部知识来增强大语言模型生成文本的准确性和丰富性其是一个集成了外部知识库、信息检索器、大语言模型等多个功能模块的系统。
RAG 利用信息检索、深度学习等多种技术为大语言模型在生成过程中引入最新的、特定领域的知识从而克服传统大语言模型的局限性提供更加精准和可靠的生成内容。
检索增强生成的背景 训练数据的局限性 知识过时模型可能无法获取实时或最新的信息。例如ChatGPT的训练数据截止到2022年因此不能准确回答有关2023年的问题。知识边界训练数据可能在一些特定领域中的信息覆盖不全导致模型对这些领域知识的匮乏。偏见与虚假信息因数据来源于互联网可能会包含偏见或错误的信息从而影响模型的输出。 模型自身的问题 知识长尾训练数据中某些信息出现频率较低模型的学习效果就会较差。曝光偏差与解码偏差模型训练和推理阶段的不同可能导致结果的不一致随机解码策略也可能影响最终输出的准确性。 检索增强生成RAG 作为解决方案引入外部信息的RAG方法能够有效减少幻觉现象。通过查找相关知识模型能更准确地回答问题弥补了其内部知识的不足。
检索增强生成的组成
检索增强生成Retrieval-Augmented Generation简称RAG是一种结合了信息检索和文本生成的自然语言处理技术。它的核心思想是利用外部知识库来增强语言模型的生成能力从而提高在知识密集型任务中的性能。 外部知识库CorpusRAG依赖于一个外部的知识库通常是大规模的文本集合如维基百科用于提供问题相关的背景知识。 信息检索器Retriever检索器负责理解用户的查询并从知识库中检索出与查询相关的文档或信息片段。 生成器Generator生成器通常是一个大型的语言模型它结合检索到的知识和原始查询来生成最终的输出。
RAG的工作流程如下
用户提出一个自然语言问题Query。检索器将问题编码并从知识库中检索相关文档。检索到的文档和原始问题一起被传递给生成器。生成器利用这些信息生成回答。
RAG的优势在于
改善幻觉现象不需要更新语言模型的内部知识就可以改善生成质量减少错误信息的产生。避免灾难性遗忘更新内部知识可能会覆盖旧知识RAG通过外部知识避免了这一问题。计算成本避免了频繁更新大型语言模型的计算成本。
RAG系统的设计和优化可以从以下几个方面进行 检索器与生成器的协作分为黑盒增强架构和白盒增强架构前者不访问模型内部参数后者允许对语言模型进行微调。 检索过程的优化包括知识库的构建和优化、查询增强、检索器的选择和优化、检索效率的提升以及重排优化。 增强过程的优化确定何时需要检索增强、在生成过程中何处插入检索信息、针对复杂查询的多次增强策略以及降本增效的知识压缩和缓存加速策略。
检索增强生成架构
RAG 架构分类 黑盒增强架构
黑盒增强架构是RAG系统中的一种实现方式特别适用于那些无法访问或修改大语言模型内部参数的情况例如只能通过API与模型交互的场景。在这种架构下大语言模型被视为一个黑盒只能通过输入和输出与之交互。以下是黑盒增强架构的两种主要类型
1. 无微调架构
无微调架构是最简单的RAG实现方式其中检索器和语言模型分别独立预训练之后直接组合使用不进行进一步的参数更新。这种架构的优点是
计算资源需求低不需要对模型进行微调因此对计算资源的需求较低。易于实现和部署由于不需要对模型进行微调这种架构易于实现和部署适合对部署速度和灵活性有较高要求的场景。
In-Context RALM是无微调架构的一个代表性方法。它将检索到的文档作为上下文直接前置到输入问题前然后输入给大语言模型。这种方法包括检索和生成两个阶段
检索阶段输入的问题或部分句子作为查询从知识库中检索出相关文档。生成阶段检索到的文档被直接拼接到Prompt中的上下文部分然后将Prompt输入给大语言模型。
在执行检索操作时需要考虑的关键参数包括检索步长和检索查询长度。这些参数的选择会影响到模型的响应速度和信息的即时性。
2. 检索器微调架构
尽管无微调架构易于实现但它没有考虑检索器与语言模型之间的协同效应。为了进一步提升效果可以采用检索器微调架构对检索器进行微调以更好地适应大语言模型的需求。
REPLUG LSR是检索器微调框架的一个代表性方法。它使用大语言模型的困惑度分数作为监督信号来微调检索器使其能更有效地检索出能够显著降低语言模型困惑度的文档。
REPLUG LSR采用KL散度损失函数来训练检索器目的是对齐检索到的文档的相关性分布与这些文档对语言模型性能提升的贡献分布。
REPLUG LSR的关键步骤包括
文档概率分布基于检索器计算的上下文与文档之间的相似度通过余弦相似度来衡量并将这些相似度分数转化为概率值。文档对语言模型的贡献分布语言模型为每个被检索到的文档和原始上下文生成预测最终所有输出结果形成一个概率分布。
REPLUG LSR将语言模型视为黑盒处理仅通过模型的输出来指导检索器的训练避免了对语言模型内部结构的访问和修改。此外REPLUG LSR还采用了异步索引更新策略降低了索引更新的频率减少了计算成本。
AAR方法通过引入额外的小型语言模型使用它的交叉注意力得分标注偏好文档以此来微调检索器使其能够在不微调目标语言模型的情况下增强其在不同任务上的表现。
白盒增强架构 仅微调语言模型 RETRORETRO是一种仅微调语言模型的方法它通过修改语言模型的结构使得在微调过程中能够将从知识库中检索到的文本直接融入到语言模型中间状态中实现外部知识对大语言模型的增强。 RETRO首先将知识库中的文本切块然后用BERT对每个文本块生成嵌入向量。在自回归过程中模型生成一段文本块后就去知识库中检索出与之最相似的嵌入向量然后这些嵌入向量和模型注意力层的输出一起被送入一个外部的Transformer编码器进行编码得到的编码向量直接输入给模型的块交叉编码器的键key和值value以捕捉外部知识的关键信息。 SELF-RAGSELF-RAG通过在微调语言模型时引入反思标记使语言模型在生成过程中动态决定是否需要检索外部文本并对生成结果进行自我批判和优化。 检索器和语言模型协同微调 AtlasAtlas是检索器和语言模型协同微调的代表性工作。它在预训练和微调阶段使用KL散度损失函数来联合训练检索器和语言模型以确保检索器输出的文档相关性分布与文档对语言模型的贡献分布相一致。 Atlas在预训练和微调过程中检索器和语言模型参数同步被更新检索器学习向语言模型提供最相关的文档而语言模型则学习如何利用这些文档来改善其对查询的响应。为了确保检索结果与模型最新状态保持同步Atlas同样需要定期更新语料库文档的向量编码从而维持检索的准确性。
对比与分析
黑盒增强架构
优势 快速部署 无需对模型进行微调可以快速将预训练模型投入使用适合对时间敏感的任务。 简单性 无需复杂的训练过程减少了系统的复杂性易于实现。 稳定性 利用已知的模型性能可以在某些场景下保持较为稳定的输出。
劣势 灵活性不足 不支持根据特定任务进行模型调整可能导致在新任务上的表现不佳。 性能限制 尽管检索器微调能带来一定提升但最终性能依然受限于语言模型固有的能力。
白盒增强架构
优势 高度灵活性 允许对语言模型进行微调可以根据具体任务需求进行定制化调整提升模型的适应性。 优化潜力 协同微调可以更好地协调检索器和语言模型使其在互动中共同提升性能。 更强的性能 通过针对性微调能够实现更高的准确性与相关性特别是在复杂场景下。
劣势 计算资源需求高 协同微调和参数优化需要大量的计算资源与时间对于小型团队或项目可能成为负担。 训练复杂性 微调流程可能复杂需调整参数、监控训练进度要求研究人员具备较高的技术能力。
知识检索 知识库构建
1. 数据采集及预处理
数据采集
整合数据从不同渠道收集数据并将其整合、转换成统一的文档对象。元信息文档对象不仅包含文本信息还包含元信息如文章标题、分类信息、时间信息、关键词等这些信息有助于后续的检索和过滤。
数据预处理
数据清洗清除文本中的干扰元素如特殊字符、异常编码和无用的HTML标签删除重复或高度相似的冗余文档提高数据的清晰度和可用性。文本分块将长文本分割成较小的文本块如将一篇长文章分为多个短段落。这样做的好处包括 适应检索模型的上下文窗口长度限制。减少长文本中的不相关内容降低噪音提高检索效率和准确性。 分块策略制定合适的分块策略包括确定切分方法如按句子或段落切分、设定块大小以及是否允许块之间有重叠。
2. 知识库增强
知识库增强 查询生成利用大语言模型生成与文档内容紧密相关的伪查询这些伪查询作为文档的“键”在检索时与用户查询进行匹配增强文档与用户查询的匹配度。 标题生成为没有标题的文档生成合适的标题提供文档的关键词和上下文信息帮助快速理解文档内容并在检索时更准确地定位到与用户提问相关的信息。 对于那些原始文档中缺乏标题的情况通过语言模型生成的标题显得尤为重要它们提供了文档的关键信息有助于检索时的快速定位。
查询增强
查询增强技术的目的是通过提供更多样化和全面的查询来提高检索系统对用户查询的理解和响应能力。这种方法尤其适用于知识库中存储的文本与用户提问方式存在差异的情况有助于提升检索效果和生成内容的质量。 查询语义增强 同义改写这种方法通过将用户的原始查询改写成具有相同语义的不同表达方式来增加检索到相关知识的机会。例如对于查询“考拉的饮食习惯是什么”可以改写为“考拉主要吃什么”、“考拉的食物有哪些”和“考拉的饮食结构是怎样的”等。这些改写后的查询可以独立检索文档然后将结果合并和去重形成一个更大的相关文档集合。多视角分解这种方法将复杂查询分解为多个子查询每个子查询从不同的角度检索信息。例如对于查询“考拉面临哪些威胁”可以分解为关于栖息地丧失、气候变化、人类活动和自然灾害对考拉影响的子问题。这样可以得到来自不同视角的信息综合这些信息可以生成一个更全面的答案。 查询内容增强 生成背景文档这种方法通过使用大语言模型生成与原始查询相关的背景文档来丰富查询内容。例如对于查询“如何保护考拉的栖息地”可以生成一个背景文档提供关于考拉栖息地的详细信息如考拉的分布、食物来源和栖息地类型等。这些背景文档作为补充信息可以提高检索结果的相关性和丰富性。
检索器
检索器是RAG系统中的关键组件负责从知识库中检索与用户查询相关的文档。检索器可以分为两大类判别式检索器和生成式检索器。
1. 判别式检索器
判别式检索器通过判别模型对查询和文档是否相关进行打分分为稀疏检索器和稠密检索器。
(1) 稀疏检索器
稀疏检索器使用稀疏表示方法来匹配文本主要基于词频的统计特征来对文档进行编码然后计算查询与文档的相似度。典型的稀疏检索技术包括
TF-IDFTerm Frequency-Inverse Document Frequency基于词频TF和逆文档频率IDF来衡量词语的重要性。其计算公式如下
词频TF
定义词频是指特定单词或词项在文档中的出现次数与该文档中所有单词的总数的比率。它表示一个词在某个特定文档中出现的频繁程度。公式 t f i , j n i , j ∑ k n k , j tfi,j \frac{ni,j}{\sum_k n_{k,j}} tfi,j∑knk,jni,j 其中 n i , j ni,j ni,j单词 t i t_i ti 在文档 d j d_j dj 中出现的次数。 ∑ k n k , j \sum_k n_{k,j} ∑knk,j文档 d j d_j dj 中所有单词的总出现次数。
逆文档频率IDF
定义逆文档频率用于减少常见词如“的”、“是”、“在”等的权重而增加在少数文档中出现的具有更多信息内容的词的权重。IDF越高表示该词在整个文档集中的稀有程度越高。公式 i d f i log ∣ D ∣ ∣ j : t i ∈ d j ∣ idfi \log \frac{|D|}{|{j : ti \in d_j}|} idfilog∣j:ti∈dj∣∣D∣ 其中 ∣ D ∣ |D| ∣D∣文档集合的总数。 ∣ j : t i ∈ d j ∣ |{j : ti \in d_j}| ∣j:ti∈dj∣包含词 t i t_i ti 的文档数量反映该词在文档中的分布情况。 注意为了避免除以零的情况通常会加一个平滑常数。
TF-IDF值 定义TF-IDF的最终值是词频和逆文档频率的乘积用于表示一个词在文档中的重要性。具体来说TF-IDF值越高表明该词对文档的贡献越大。 公式 t f i d f i , j t f i , j × i d f i tfidfi,j tfi,j \times idfi tfidfi,jtfi,j×idfi BM25一种在TF-IDF基础上改进的文本检索算法通过文档长度归一化和词项饱和度调整更精确地评估词项重要性。
(2) 稠密检索器
稠密检索器利用预训练语言模型对文本生成低维、密集的向量表示通过计算向量间的相似度进行检索。主要分为交叉编码类和双编码器类 交叉编码类端到端地给出查询和文档的相似度将查询和文档拼接在一起利用预训练语言模型如BERT生成向量表示并通过分类器输出相似程度。适用于对少量候选文档进行精确排序的阶段。 双编码器类查询和文档各自通过独立编码器生成向量表示然后计算这两个向量之间的相似度。此方法效率高适合工业环境具有高匹配效率。 DPRDense Passage Retriever是双编码器的代表使用BERT编码器将查询和文档映射到特征向量再通过向量点积衡量相似度。 2. 生成式检索器
生成式检索器通过生成模型对输入查询直接生成相关文档的标识符DocID与判别式检索器不同生成式检索器将知识库中的文档信息记忆在模型参数中。此类检索器通常采用基于Encoder-Decoder架构的生成模型如T5、BART。其训练过程分为两个阶段 第一阶段通过序列到序列的学习方法学习如何将查询映射到相关的文档标识符主要通过最大似然估计MLE优化模型。 第二阶段通过数据增强和排名优化提高检索效率和准确性数据增强可通过生成伪查询或使用文档片段来增加训练数据的多样性排名优化则涉及使用特定的损失函数调整生成文档标识符的顺序和相关性。
生成式检索器的DocID设计至关重要需要在语义信息的丰富性与标识符的简洁性之间取得平衡。常用的DocID形式分为基于数字的DocID和基于词的DocID。
检索效率增强
检索效率增强是提高大规模知识库检索性能的关键技术特别是在处理海量文本数据时。为了提升检索效率可以引入向量数据库从而实现高效的向量存储和查询。这些数据库的核心在于设计高效的相似度索引算法。
1. 相似度索引算法
相似度索引算法主要分为三大类基于空间划分的方法、基于量化的方法和基于图的方法。
基于空间划分的方法
基于树的索引方法通过递归地划分空间形成树状结构如KD树和Ball树。在查询时算法从树的根节点开始逐步深入到合适的叶节点最后在叶节点内进行相似度比较以找到最近的向量。基于哈希的方法例如局部敏感哈希LSH通过哈希函数将向量映射到哈希表的不同桶中使得相似向量通常位于同一桶内。
基于图的方法
通过构建邻近图将向量检索转化为图的遍历问题。在索引构建阶段每个向量表示图中的一个节点根据向量间的距离或相似性建立边的连接。
此方法受小世界网络模型启发旨在创建一种结构使得从任意入口点出发能在较少步数内到达查询点的最近邻。这类方法代表性有NSW、IPNSW和HNSW等稀疏图和稠密图的权衡也是此类方法设计中的一大挑战。
基于量化的方法
如乘积量化PQ通过将高维向量空间划分为多个子空间并在每个子空间中进行聚类得到码本和码字以此构建索引。该方法的训练和查询过程包括
训练阶段学习如何将高维向量量化为码字ID序列聚类后用聚类中心点作为码字和码本。查询阶段将查询向量划分为子向量在每个子空间中找到最近的码字形成距离表并利用此表进行近似距离的计算。
在需要精度更高的应用场景中可以在PQ的基础上进行精确排序以获取更准确的最近邻结果。此外还有一些乘积量化的优化算法和结合其他索引的算法如OPQ和IVFPQ。
2. 常见软件库介绍
在了解相似度索引算法后接下来介绍几种常用于构建和管理向量数据库的软件库这些库支持上述相似性索引算法是实现高效向量检索的重要工具。 Faiss由Meta AI Research开发的库专门用于优化密集向量相似性搜索和聚类。Faiss提供多种索引算法支持CPU和部分GPU加速适用于多种应用场景。然而Faiss本身并不是一个完整的数据库系统而是一个功能强大的工具库专注于高效的索引和搜索功能在数据存储、管理、分布式支持和安全性等方面相对有限。 其他向量数据库市场上已有多款成熟的向量数据库它们不仅包括相似度索引算法还整合了数据存储、管理、分布式支持和安全性等多方面的功能。这些向量数据库能够支持更复杂的RAG检索增强生成应用场景。
通过这些相似度索引算法和软件库的使用可以显著提高向量检索的效率这对构建高效的检索系统至关重要。在实际应用中选择合适的索引算法和软件库需根据具体的业务需求和数据特性进行决策。
向量数据库URLGitHub StarsMilvusGitHub - milvus-io/milvus28.4KTypesenseGitHub - typesense/typesense19.0KQdrantGitHub - qdrant/qdrant18.9KChromaGitHub - chroma-core/chroma13.7KWeaviateGitHub - weaviate/weaviate10.4KPineconePinecone官网×
检索结果重排
在使用检索器时可能会检索到与查询相关性不高的文档。
如果将这些文档直接输入给大型语言模型可能会导致生成质量下降。因此必须对检索到的文档进行进一步的精选主要通过重排步骤来提高文档的质量。
重排的主要方法分为两类基于交叉编码的方法和基于上下文学习的方法。
1. 基于交叉编码的重排方法
基于交叉编码的重排方法利用**交叉编码器(Cross-Encoders)**来评估文档与查询之间的语义相关性。交叉编码器通常将查询和文档拼接在一起然后使用深度学习模型来评估它们的匹配程度。
一个著名的示例是MiniLM-L5它是一种广泛应用的开源重排模型。该模型通过减少层数和隐层单元数来降低参数数量同时使用知识蒸馏技术从大型、高性能的语言模型中继承学习以提高模型性能。
2. 基于上下文学习的重排方法
基于上下文学习的重排方法利用大型语言模型执行重排任务这种方法利用了模型的深层语义理解能力取得了良好的效果。RankGPT是基于上下文学习的重排方法中的一个代表性案例。其使用的Prompt模板如下
这是RankGPT一款智能助手专门用于根据查询的相关性对段落进行排序。
以下是{{num}}段文字每段都有一个数字标识符[ ]。我将根据查询内容对它们进行排序{{query}}
[1] {{passage_1}}
[2] {{passage_2}}
更多段落...
查询是{{query}}
我将根据查询对上述{{num}}段文字进行排序。这些段落将按照相关性降序列出使用标识符表示最相关的段落将列在最前面输出格式应该是[ ] [ ] 等例如[1] [2] 等。
对{{num}}段文字的排序结果仅限标识符是在重排过程中输入文档的长度有时可能超过上下文窗口的限制。为了解决这个问题RankGPT采用滑动窗口技术来优化排序过程。
这一技术将所有待排序的文档分割成多个连续的小部分每个部分作为一个窗口。整个排序过程从文档集的末尾开始首先对最后一个窗口内的文档进行排序并将排序后的结果替换原始顺序。然后窗口按照预设的步长向前移动重复排序和替换的过程。这个过程将持续进行直到所有文档都被处理和排序完毕。通过这种分步处理的方法RankGPT能够有效地对整个文档集合进行排序而不受限于单一窗口所能处理的文档数量。
生成增强
何时增强
重要性
避免不必要的增强盲目增强可能会增加计算成本并且可能降低生成效率和质量。内部知识Self-Knowledge大语言模型在训练过程中掌握了大量知识称为内部知识。对于这些问题不需要外部增强。错误增强的风险检索到的外部知识可能包含噪声输入给大语言模型可能会生成错误内容。
判断是否需要增强的方法 外部观测法 直接询问通过Prompt直接询问模型是否需要外部知识。多次询问通过多次询问模型同一个问题观察回答的一致性来判断是否具备内部知识。观察训练数据通过分析模型的训练数据来判断其是否掌握了相关知识。构造伪训练数据统计量当训练数据不可获取时设计伪训练数据统计量来拟合训练数据的相关情况如利用Wikipedia的页面浏览量来衡量实体的流行度。 内部观测法 内部状态检测在模型参数可访问的情况下通过分析模型内部的隐藏状态来评估其知识掌握情况。探针方法训练分类器根据模型的内部表示预测问题是属于模型“已知”还是“未知”。 模型的不确定性模型展现出的不确定性可能源于对问题的知识缺失也可能是问题本身固有的模糊性或歧义性所致。黑盒模型的局限性依赖于内部状态的检测方法不适用于黑盒语言模型因为无法直接访问其内部隐藏状态。
何处增强 何处增强的三种方式 在输入端增强 这种方法将检索到的外部知识文本与用户查询拼接到Prompt中然后输入给大语言模型。这是一种主流的增强方法重点在于Prompt设计以及检索到的外部知识的排序。良好的设计可以使模型更好地理解、利用外部知识。 在中间层增强 利用注意力机制的灵活性先将检索到的外部知识转换为向量表示然后将这些向量插入通过交叉注意力融合到模型的隐藏状态中。Retro方法就是采用这种方式的典型代表能够更深入地影响模型的内部表示有助于模型更好地理解和利用外部知识。 在输出端增强 利用检索到的外部知识对大语言模型生成的文本进行校准是一种后处理的方法。模型首先在无外部知识的情况下生成一个初步回答然后再利用检索到的外部知识来验证或校准这一答案。REFEED框架是此类方法的典型代表可以确保生成的文本与外部知识保持一致提高答案的准确性和可靠性。
多次增强
多次增强是处理复杂或模糊问题时的一种有效策略它涉及到对问题进行多次迭代检索和增强以确保生成的答案既正确又全面。以下是两种主要的多次增强方案
分解式增强
分解式增强主要针对复杂问题这类问题通常包含多个知识点需要多跳理解。在这种情况下模型可以将问题分解为多个子问题并在子问题间迭代地进行检索增强最终得出正确结论。
DEMONSTRATE–SEARCH–PREDICTDSP框架是这种增强方式的一个代表性例子。
DSP框架包含三个模块
DEMONSTRATE模块负责将复杂问题分解为子问题SEARCH模块对子问题进行迭代检索增强PREDICT模块根据SEARCH提供的综合外部知识生成最终回答。
这种分解式增强将复杂问题化整为零降低了单次检索增强的难度但其性能很大程度上取决于子问题分解的质量。
渐进式增强
渐进式增强主要针对模糊问题这类问题指代范围不明难以一次就理解问题的含义。
TREE OF CLARIFICATIONSTOC框架是渐进式增强的代表性框架。
TOC框架通过递归式检索来引导大语言模型在树状结构中探索给定模糊问题的多种澄清路径。
例如对于问题“国宝动物爱吃什么”TOC框架首先启动第一轮检索根据检索到的相关文档和原始问题生成一系列具体的细化问题然后针对每个细化问题框架独立展开深入的检索并对问题进一步细化。最终TOC框架能够构建出多条完整的知识路径每条路径的末端都代表了对原始问题的不同但有效的解答通过整合所有有效的叶节点得出一个精确且全面的长回答。
这两种多次增强的方法都是为了处理复杂或模糊问题通过多次迭代检索和增强来提高大语言模型的生成质量和准确性。它们各自适用于不同的场景并且在实际应用中可以根据具体的需求灵活选择或组合使用。
降本增效
在检索增强生成RAG系统中为了降低计算成本并提高效率我们可以采取两种主要策略去除冗余文本和复用计算结果。以下是这两种策略的详细介绍
1. 去除冗余文本
为了减少输入Token的数量和提高生成的相关性及准确性可以对检索出的原始文本进行处理去除不必要的信息 Token级别方法通过评估每个Token的重要性来剔除冗余信息。困惑度可以作为判断Token重要性的一个指标。例如LongLLMLingua框架利用小模型评估Token的困惑度并基于此删除冗余文本。 子文本级别方法通过对子文本进行打分来删除不必要的部分。FIT-RAG方法使用双标签子文档打分器从事实性和模型偏好程度两个维度评估文档的有用性并删除评分较低的子文档。 全文本级别方法直接从整个文档中提取重要信息。PRCA方法通过训练信息提取器提炼重点内容分为上下文提取阶段和奖励驱动阶段最终得到的信息提取器可以直接将输入文档转化为压缩文本。
2. 复用计算结果
为了优化RAG效率可以对计算必需的中间结果进行复用 KV-cache机制在自回归过程中为了避免对每个Token都重新计算前面的Key和Value的结果可以将之前计算的Key和Value的结果进行缓存。RAGCache设计了一种多级动态缓存机制通过树结构缓存文档KV张量并通过缓存检索器快速查找缓存节点。 PGDSF替换策略RAG控制器采用前缀感知的贪婪双重尺度频率替换策略综合考虑文档节点的访问频率、大小、访问成本以及最近访问时间使得频繁使用的文档能够被快速检索到。 重排策略通过调整请求的处理顺序优先处理那些能够更多利用缓存数据的请求以减少重新计算的需求。 动态推测流水线策略通过并行KV张量检索和模型推理的步骤有效减少了端到端延迟。
实践与应用
搭建简单 RAG 系统
RAG因其优越性能和广泛应用场景而备受关注。我们将介绍如何使用两个开源框架——LangChain和LlamaIndex来搭建简单的RAG系统并概述它们的特色和核心功能。
LangChain与LlamaIndex
1. LangChain
LangChain旨在简化利用大型语言模型进行应用程序开发的整个过程提供一系列模块化组件以帮助开发者部署基于大型语言模型的应用包括构建RAG框架。主要包含六大模块 Model IO各种大型模型的接口及Prompt设计组件。Retrieval核心组件包括文档加载、文本分割、向量构建、索引生成和向量检索。Chains将各个模块链接起来逐个执行。Memory存储对话过程中的数据。Agents利用大型语言模型决定自动执行的操作。Callbacks帮助开发者在各个阶段干预和监控。
2. LlamaIndex
LlamaIndex则更专注于数据索引与检索能够迅速构建高效的检索系统。具备从多种数据源如API、PDF文件、SQL数据库等中提取数据的能力并提供高效的工具来对这些数据进行向量化处理和索引构建。支持对上下文信息进行过滤、重新排序等精细化操作并且能够与LangChain框架结合进一步增强功能。
基于LangChain搭建简单RAG系统
1. 安装与配置
首先安装LangChain框架及其依赖项
pip install langchain langchain_community langchain_chroma2. 数据准备与索引构建
使用WebBaseLoader从网页中加载内容并解析为文本
from langchain_community.document_loaders import WebBaseLoader
loader WebBaseLoader(https://example.com/page)
docs loader.load()使用TextSplitter将长文档分割成更小的块
from langchain_text_splitters import RecursiveCharacterTextSplitter
text_splitter RecursiveCharacterTextSplitter(chunk_size1000, chunk_overlap200)
splits text_splitter.split_documents(docs)使用向量存储和嵌入模型来编码和存储分割后的文档
from langchain_chroma import Chroma
from langchain_openai import OpenAIEmbeddings
vectorstore Chroma.from_documents(documentssplits, embeddingOpenAIEmbeddings())3. RAG系统构建
创建检索器
retriever vectorstore.as_retriever()设置OpenAI的API密钥并指定模型
import os
os.environ[OPENAI_API_KEY] your_api_key
from langchain_openai import ChatOpenAI
llm ChatOpenAI(modelgpt-3.5-turbo-0125)设置提示模板
from langchain import hub
prompt hub.pull(rlm/rag-prompt)使用LangChain表达式语言LCEL构建RAG链
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParserdef format_docs(docs):return \n\n.join(doc.page_content for doc in docs)rag_chain ({context: retriever | format_docs, question: RunnablePassthrough()}| prompt| llm| StrOutputParser()
)# 使用RAG链回答问题
response rag_chain.invoke(What is Task Decomposition?)
print(response)通过以上步骤开发者能够方便快捷地使用LangChain构建一个基础的RAG系统。LangChain提供了一系列强大的工具和组件使得构建和整合检索与生成变得简单而高效。
RAG 的典型应用
1. 智能体Agent
RAG 在智能体系统中扮演着重要角色。在智能体主动规划和调用各种工具时需要检索并整合多样化的信息以更精确地满足用户需求。RAG 通过提供所需的信息支持帮助智能体在处理复杂问题时展现更好的性能。 以一个典型的智能体框架为例该框架主要包含四大部分配置Profile、记忆Memory、计划Planning和行动Action。在这些模块中记忆模块、计划模块与行动模块均融入了 RAG 技术以提升整体性能。 配置模块设定智能体的基本信息如年龄、性别、职业等基本属性以及反映其个性和社交关系的信息。 记忆模块存储从环境中学习的知识和历史信息支持记忆检索、更新和反思等操作。RAG 在此模块中检索相关信息辅助记忆的读取和更新。 计划模块赋予智能体将复杂任务分解为简单子任务的能力并根据记忆和行动反馈不断调整。RAG 在此模块中通过提供相关信息帮助更合理有效地规划任务。 行动模块将智能体的计划转化为具体行动包括网页检索、工具调用和多模态输出等能够对环境或智能体自身状态产生影响。RAG 通过检索相关信息辅助智能体的决策和行动执行。
例如用户询问“我现在在澳大利亚我想去抱考拉应该怎么办”智能体通过以下步骤完成任务 角色配置初始化为旅游顾问确定任务目标是协助用户与考拉亲密接触。 任务规划确定考拉的地点、了解当地法律、规划出行建议。RAG 提供相关的旅游景点和法律法规信息确保规划精准。 信息检索首先在记忆中检索已有信息如果不全则激活行动模块调用外部知识源如旅游网站进行检索。 信息整合与决策利用检索到的信息制定最佳行动方案并向用户推送推荐地点和注意事项。 信息输出最后将详细的路线规划和相关地点描述整合输出给用户。
该示例清楚展示了各个模块如何协同工作以及 RAG 在其中迅速检索和整合信息的关键作用。
2. 多模态垂直领域应用
除了文本领域RAG 系统在多模态数据的垂直领域展现了广阔的应用前景。例如在医疗领域多模态数据普遍存在包括 X 光片、MRI、CT 扫描等影像资料以及病历、生理监测数据等。RAG 系统必须具备融合和洞察这些不同模态数据的能力以实现高效精确的应用。
以医学领域的多模态检索框架为例该框架的工作流程如下 特征提取提取图像与文本的特征表示深入理解图像内容与问题语义。 多模态检索利用提取的特征向量在医学知识库中进行精准检索获取与输入问题相关的信息如医学案例、症状描述等。 信息整合将检索到的信息进行整合辅助模型生成准确的回答。比如若询问“这张 X 光片的症状是什么”模型可能生成答案“心肌肥大”。
除了医疗领域RAG 在金融、生物学等领域也展现了强大的处理能力提高了专业人士的决策效率。随着技术进步和数据资源的丰富未来 RAG 有望在更多垂直领域和数据模态中发挥关键作用。