【NLP】LLM 和 RAG

我分享了过去几年中我对RAG系统发展所获得的主要经验,并探讨并比较了Naive RAG框架、Advanced RAG框架以及Modular RAG架构之间的差异。此外,我总结了高云帆等人发表的一篇具有重要价值的RAG技术调查论文的核心观点,并附上了相关链接:https://arxiv.org/abs/2312.10997 "RAG 技术调查论文的关键见解"。
什么是 RAG 框架?
OpenAI开发了具有影响力的[GPT]语言模型系列;此外,在生成人工智能领域中还推出了[LLama]语言模型系列;由[Google]推出的[Gemini]系统也在该领域展现了显著的技术实力;这些大型语言模型(LLM)共同推动了生成人工智能技术的进步
然而这些模型存在不确定性。通常来说,在实际应用中LLM可能会输出不准确或无意义的信息(被称为幻觉)。它们往往依赖过时的数据,并且其决策过程难以被理解或验证这使得其决策过程难以被理解或验证导致黑箱推理的情况发生
检索增强生成模型(RAG)框架旨在辅助解决一系列复杂性问题。该框架凭借专门针对各个领域收集的数据提升大型语言模型(LLM)的知识存储系统能力。
比如基于RAG的应用被应用于高级问答(Q&A)应用程序——聊天机器人。为了构建一个能够理解和高效响应与私人或专门领域相关的查询问题的智能对话机器人,则必须利用所需的具体数据来扩充大型语言模型(LLM)的知识库。这正是RAG发挥作用的关键点。
简单 RAG、高级 RAG 、 模块化 RAG
RAG 框架解决了以下问题:
- “要检索什么信息”
- “检索信息什么时候召回”
- “如何使用检索到的信息”
在过去的几年里,RAG 领域进行了大量的研究和创新。RAG 系统可分为 3 类 :
- 简单 RAG
- 高级 RAG
- 模块化 RAG
本节主要介绍并对比分析三种主流的RAG范式(NaiveRAGAdvancedRAG和ModularRAG)之间的异同点

RAG三种范式的比较
简单 RAG
简单 RAG 管道由以下关键阶段组成:
数据索引
- 数据加载: 这一阶段主要涵盖获取所有需要处理的文档或信息。
- 数据分割: 将大量文档划分为较小的片段进行处理,并规定每段长度限定在500个字符以内。
- 数据嵌入: 通过嵌入模型将原始数据映射至向量化空间,并生成一个完整的向量集合。
- 数据存储: 生成的这些向量集合被存储在一个专门设计的矢量化数据库中,并以支持高效的相似性检索操作。
数据召回
当用户提出问题时:
- 用户的输入首先经过预处理阶段通过相同的嵌入模型转化为查询向量。
- 然后在该方法中将该查询向量化表示与整个数据库的所有条目进行匹配,并用于检索与之最接近的相关信息(例如,在计算过程中采用欧几里得距离作为相似性度量标准)。这一过程旨在提取关键信息并完成知识块识别任务。
增强与生成
LLM 模型基于用户的查询问题并从向量数据库中获取相关数据来生成回应。这一过程通过将问题与已识别的数据进行整合(提升)以产出高质量的答案(输出)。
Naive RAG 的问题
Naive RAG 在各个阶段都面临着挑战:
- 检索功能存在缺陷,在某些情况下未能找到所有相关数据块。
- 增强模块面临挑战,在整合外部信息时需要处理可能来自不一致来源的数据块。
- 在回答生成过程中,大型语言模型可能会由于未基于提供的搜索结果而给出错误的答案。
高级 RAG
为了应对 Naive RAG 所遇到的挑战而设计出了一套高效的RAG策略;其中包含了若干核心技术要点。
RAG应用程序必须能够有效地从数据源获取相关文档。然而,在每一个环节都面临诸多挑战。
- 采用何种方式可以让文档和查询之间更精准地捕捉到其语义关联?
- 有哪些方法可以让查询与文档(块)的空间进行更加精确地匹配?
- 在检索结果中,我们能否让输出更加符合大模型的需求?
这里我概述一下检索前、检索和检索后策略:
预检索
- 如何构建高效的索引架构?
- 提升数据质量:去除冗余信息以精简数据库表 schema,并去除实体和术语中的模糊性。
- 构建高效的索引架构:调节块尺寸以捕捉关联语境,并通过图形化扩展来捕捉实体关系。
- 引入元数据字段:包含如日期、章节编号等关键信息以完善数据库表 structure。
块优化 ——在构建RAG管道的过程中,默认情况下会整合外部数据源和文档信息进行处理。具体来说,在对这类信息进行初步处理时首先要将其划分为更小的单元格以获取细节并提取其语义特征随后通过嵌入这些单元格来反映其意义然而需要注意的是较大的或过小的信息单元可能导致效果不佳因此为了提高RAG管道的效果在处理不同类型的文档时应调整信息单元大小
关键预检索技术总结
- 滑动窗口 — 采用基于块的重叠分块策略。
- 自动整合检索 ——在初步搜索阶段基于较小规模的文本片段开展查询,在后续步骤中将较大的相关文本片段传递给语言模型进行处理。
- Abtracts embedding ——Abtracts-based top-k retrieval prioritizes a comprehensive understanding of the entire document context.
- A metadata filtering process ——A metadata-driven approach enhances the filtering process.
- 图索引 ——A graph indexing mechanism that transforms entities and relations into nodes and edges, significantly improving relevance performance.
检索
一旦确定了块的大小,在下一步阶段中将利用预训练语言模型将这些块映射至预定义的空间结构中
在检索过程中,我们的目标是旨在识别最优相关块。这主要基于计算查询与块之间相近程度来进行判断。在此基础上,我们可以通过优化构建针对查询与块的嵌入模型来提升整体性能。
知识领域微调 ——为了使嵌入模型能够准确地捕获RAG系统特有的领域信息而采用这一策略显得尤为重要。在这一过程中所使用的训练数据应当包括查询项、语料库以及相关的文档资料。
相似性度量 ——有许多不同的衡量方式来评估向量之间的关系。选择合适的相似性度量同样是一个优化过程。这些矢量数据库(如ChromaDB、Pinecode、Weaviate等)能够提供丰富的相似性评估工具。以下是不同相似ity degree的几个示例:
- 余弦相似度
- 欧氏距离 (L2)
- 点积
- L2 平方距离
- 曼哈顿距离
检索后
从向量数据库中获取相关数据片段后,下一步是将这些片段与查询内容进行整合,并将其作为大语言模型(LLM)的输入内容。然而,在检索到的数据片段中可能存在重复信息、噪声干扰或冗余数据等质量问题。这些干扰可能会影响到LLM在处理给定上下文时的表现。
下面我列出了一些用于克服这些问题的策略。
重排信息 - 对获取的信息进行优化排序。当在使用大语言模型处理任务时引入额外背景信息时,在某些情况下可能会导致性能下降。解决此问题的方法是通过对检索到的块进行优化排序,并识别出Top-K最相关的内容块(这些内容被用作大语言模型中的上下文)。LlamaIndex、Langchain 以及 HayStack等库提供了多种不同的重排工具或策略。
及时压缩——检索到的信息可能存在噪声,在提交给LLM前去除冗余内容并精简上下文长度是必要的。通过小型语言模型评估信息的相关性和复杂度来确定关键元素。对于较长的上下文内容可采用摘要技术进行精简。
模块化 RAG
模块化RAG整合了Adanced RAG的各种功能和技术, 以优化整个RAG系统的性能。例如, 将用于相似性检索的功能模块整合到统一的检索器中, 并通过微调优化其检索能力。这种模块化的设计成为构建RAG应用程序的标准模板, 其中一些具体的实现案例包括:
搜索模块 ——除了从向量数据库中检索上下文之外,此外该系统还整合了来自其他来源的数据资源,包括搜索引擎结果、表格数据文件以及知识库等信息。
通过整合内存组件至RAG系统中, 其中LLM不仅可以从向量数据库中检索存储的块, 还能够结合自身已掌握的知识库内容, 生成相应的响应信息
整合 ——涵盖原始查询和扩展查询的并行矢量搜索、智能重排算法以提升结果质量,并将最优结果与新输入进行匹配
路由 ——查询路由决定用户查询的后续操作,例如摘要、搜索特定数据库等。
