模块化RAG技术路线图(Modular RAG Technical Map):从基础Naive RAG 到高级Advanced,再到Modular RAG全方位技术解读
1.RAG 产生
- 为什么不直接使用 LLM
直接使用LLM的缺陷 | 实际应用的需求 |
---|---|
• 幻觉 • 信息过时 • 参数化知识效率低 • 缺乏专业领域的深度知识 • 推理能力弱 |
• 领域精准问答 • 数据频繁更新 • 生成内容可解释可溯源 • 成本可控 • 数据隐私保护 |
- 检索增强生成(Retrieval-Augmented Generation,RAG)
LLM 在回答问题或生成文本时,先会从大量文档中检索出相关的信息,然后基于这些信息来生成回答。
RAG 方法使得不必为每一个特定的任务重新训练整个大模型,只需要外挂知识库。解决知识更新问题,减少幻觉,具有很好的可解释性。
RAG 模型尤其适合知识密集型的任务。(Knowledge-intensive tasks,在解决问题或完成任务时需要大量专业知识或特定信息的任务)
- 其他优化生成的方式
提示词工程(Prompt Engineering)
标准 prompt 结构:指令 Instructions + 上下文 Context + 输入 Input data + 输出标识 Output indicator
优化:
- one-shot / few-shot,增加例子,优化模型指令遵循、输出格式等。
- ReAct(Reasoning & Acting), XoT,模型输出 / 输入思考过程,发掘模型推理能力。
微调(Fine-tuning)
需要准备高质量数据集进行训练,模型对领域知识 / 特定任务的理解更好,能够调整模型的输出风格,延迟较低。
- 预训练阶段的 RAG
前面讲的是生成阶段的 RAG,实际上 RAG 最早应用在预训练阶段,下面是两个例子:
- FID(Fusion-in-Decoder):https://arxiv.org/pdf/2007.01282.pdf
- RETRO(Retrieval-Enhanced Transformer):https://arxiv.org/pdf/2112.04426.pdf
在预训练阶段引入了 CCA 段落交叉注意力模块,让小参数模型达到和大参数模型同等生成效果。
- GPT3/ChatGPT 生成前,大部分研究在预训练和微调阶段,GPT3 发布之后更多研究聚焦在生成阶段。
2.RAG 技术发展
2.1 NaiveRAG
2.1.1 检索
关键词检索
各种方式对文档进行分词,通过诸如 BDK tree 等数据结构,将拆解出来的词元(token)进行倒排索引,在检索时也会对检索语句进行同样的分词处理,通过相同词元的匹配进行召回,再通过文本相关性的算法(如 TF-IDF / BM25 等)对结果进行打分排序,最终返回结果。
BM25 是一种广泛应用于信息检索和文本挖掘中的排名函数,用于评估文档与查询之间的相关性。BM25 基于概率检索模型,它通过利用查询中各个词项的出现频率(TF,Term Frequency)和词项在所有文档中的出现频率(DF,Document Frequency)来计算文档对于特定查询的相关性得分。出现频率越高的词分数越低。
向量检索
关键词 | 向量 | |
---|---|---|
索引速度 | 快 | 慢 |
索引大小 | 中等 | 大 |
查询速度(大数据场景) | 快 | 较慢 |
缩放比例 | 好 | 有限 |
精确匹配的精度 | 完美 | 较低 |
词元、词组搜索的精度 | 精确 | 较差 |
语义搜索的精度 | 无法捕获 | 较高 |
向量模型
- CohereAI(最强)https://cohere.com
BGE(开源最强)
索引
linear 索引
是一种暴力检索的索引,查询时所有的数据都会参与计算,所以召回率最高,但是当数据量大时性能较差。Qc(quantization clustering)
是一种倒排聚类型索引,通过计算聚类中心点到向量的距离进行召回。在每个聚类下使用量化器对向量进行量化降低向量的精度,提升计算效率,但是对召回率有有一定的损失。HNSW
是 Hierarchical Navigable Small World 的简称,是一种基于分层小世界图检索算法的向量索引,基于 “邻居的邻居大概率时邻居” 的 ANN 算法召回。HNSW 与 QC 相比,不需要经过多次调参即可获得比较好的召回率和查询性能。但是 HNSW 的索引大小要远大于 Qc,内存的开销也远大于 Qc。全量 Qc + 增量 HNSW
:全量构建时选用性能较好的聚类算法,但是由于聚类增加点会产生中心点偏移,非常影响增量准确性,所以增量使用 HNSW 构建一个新的近似最近邻检索图,将两种检索结果 merge。
- 参考内容:
Havenask
为用户提供高性能、低成本、易用的搜索服务,同时具有灵活的定制和开发能力,可以支持算法的快速迭代,帮助客户和开发者量身定做适合自身业务的智能搜索服务,助力业务增长。
https://havenask.net/#/doc/v1-1-0/sql/indexes/vector
分段
为什么要做分段?
- 长度限制:预训练的语言模型(如 BERT 或 GPT 系列)有输入长度的限制。虽然模型的上下文 token 数逐渐增大,但是模型倾向于理解开头和结尾,忽略中间的 Context。
- 提升检索效率:长文档通常需要更大维度的向量,模型部署、索引大小和计算市场都会增长。
- 提高检索质量:更精确地定位到文本中与查询最相关的部分,减少噪声。通常基于字数 + 文档结构 + 语义进行分段
2.1.2 生成
大语言模型
本次大部分讲的都是在大语言模型的推理阶段,通过 prompt 中的 context 部分进行增强。
其他模型的 RAG
除了 Transformer 的,也有基于 LSTM、Diffusion、GAN 的大模型可以使用检索增强,例如:
- Audio:RETRIEVAL-AUGMENTED TEXT-TO-AUDIO GENERATION https://arxiv.org/pdf/2309.08051.pdf
- Video:Animate-A-Story: Storytelling with Retrieval-Augmented Video Generation https://arxiv.org/pdf/2307.06940.pdf
- Code……
2.2 AdvancedRAG
上面是 Openai 分享的 RAG 准确率提升路径,可以看出只有检索 + 生成准确率只能达到 45%,为了提升准确率,AdvancedRAG 阶段对检索前中后三个阶段有不同的新方法。
2.2.1 检索前 Pre-Retrival
查询路由 Query Routing
Query Routing 决定需要查询的
(1)引擎,例如查询文档库,还是特定关系数据库。
(2)索引,查询时使用文档摘要索引,还是向量索引。
通常根据配置或者 llm 选择预定义好的检索路径。下面会介绍不同的 query 改写、检索方案,期望通过 queryrouting,将不同类型的 query 分流到适合的流程中。
查询改写 Query Rewrite(✨)
问题与答案并不总是拥有较高的语义相似度,对 Query 进行调整,获得更好的检索效果。
- Sub-query:多跳问题、对比问题
对比问题:小张和小李的专业有什么共同点?
多跳问题:小张继承的别墅有几层楼?
- RRR(Rewrite-Retrieve-Read) https://arxiv.org/pdf/2305.14283.pdf
引入改写模块,将对比问题进行拆解,生成适合关键词检索的 query。同时论文中收集最终生成结果的数据作为奖励模型,ft 了改写模型,让小参数的模型可以用于改写,提升改写的速度。
- DSP(DEMONSTRATE–SEARCH–PREDICT)https://arxiv.org/pdf/2212.14024.pdf
将多跳问题进行拆解为子 query 进行检索和生成,并且在 context 中给模型输入所有 subquery 和检索结果,直到得出正确答案。
- Multi-query:对于开放领域模糊问题,生成 multiquery 再剪枝TOC(Tree of Clarifications)https://arxiv.org/pdf/2310.14696.pdf
首先用原始的模糊问题(AQ)进行检索,使用检索结果 + 原始问题生成多个可能的清晰问题(DQi),使用清晰问题进行检索生成,将所有的答案汇总做最终生成。如果生成的 DQi 还是不清晰,会递归生成清晰问题(DQij),所以是 Tree of Clarifications。
- 假设性生成:LLM 生成假设性问题再使用向量检索HyDE(Hypothetical Document Embeddings)https://arxiv.org/pdf/2212.10496.pdf
先使用模型生成假设性的答案,将答案和原始 query 一起进行向量检索。因为答案中包含更丰富的语义,所以会检索到单 query 检索无法召回的内容。
根据 HyDE 的思路,也可以对文档生成假设性问题,使用用户 query 对 Hypo-Query 做向量召回。
- 找到复杂问题的上层概念 / 原理Step-Back prompting https://arxiv.org/pdf/2310.06117v2.pdf
「小美 2010 年在哪里上学」-> 「小美的教育经历」
- Text-to-SQL:查询关系数据库
- Text-to-Cypher:查询知识图谱
记忆 Memory
- 短期记忆和 DST(Dialogue Status Tracking)用户在一个 session 下的会话,通常会根据时间或者 DST 方法来拆分 session。
- 长期记忆
- 记忆召回
- 记忆总结
- 生成用户画像
2.2.2 检索 & 索引构建
稀疏检索和稠密检索的结合
- 使用混合索引(Hybrid Index)来存储文档。混合索引是一种同时包含词项索引(Term Index)和向量索引(Vector Index)的索引结构。词项索引用于存储文档中出现的词项及其频率等信息。向量索引用于存储文档经过深度学习模型转换后得到的向量。这样可以在查询时根据不同的需求选择使用词项索引还是向量索引。
- 使用双层检索(Two-stage Retrieval)来执行查询。双层检索是一种先使用词项索引进行粗排(Coarse Ranking),再使用向量索引进行精排(Fine Ranking)的查询方法。粗排用于从海量文档中快速筛选出一批候选文档。精排用于从候选文档中进一步筛选出最相关的文档。这样可以在保证查询效率的同时提高查询质量。
- 使用多路检索(Multi-stage Retrieval)来执行查询。多路检索是一种使用多个不同类型或来源的索引进行检索,并将各个检索结果进行融合(Fusion)或重排(Re-ranking)的查询
- BGE M3 - 内置 Hybrid Index
- 同时集成了稠密检索、稀疏检索、多向量检索三大能力,一站式支撑不同语义检索场景(Multi-Functionality)
- 支持超过 100 种语言的语义表示及检索任务,多语言、跨语言能力全面领先(Multi-Lingual)
- 最高支持 8192 长度的输入文本,高效实现句子、段落、篇章、文档等不同粒度的检索任务(Multi-Granularity)
通用语义向量模型BGE-M3,支持超过100种语言,具备领先的多语言、跨语言检索能力,全面且高质量地支撑“句子”、“段落”、“篇章”、“文档”等不同粒度的输入文本,最大输入长度为 8192,并且一站式集成了稠密检索、稀疏检索、多向量检索三种检索功能,在多个评测基准中达到最优水平。
BGE-M3是首个集多语言(Multi-Linguality)、多粒度(Multi-Granularity)、多功能(Multi-Functionality)三大技术特征于一体的语义向量模型,极大提升了语义向量模型在现实世界的可用性。
参考链接:新一代通用向量模型BGE-M3:一站式支持多语言、长文本和多种检索方式
- 多语言(Multi-Linguality)
BGE-M3训练集包含100+种以上语言,既包含每种语言内部的语义匹配任务(Language X to Language X),又包含不同语言之间的语义匹配任务(Language X to Language Y)。丰富且优质的训练数据帮助BGE-M3建立了出色的多语言检索(Multi-Lingual Retrieval)与跨语言检索能力(Cross-Lingual Retrieval)。
多功能(Multi-Functionality)
不同于传统的语义向量模型,BGE-M3既可以借助特殊token [CLS]的输出向量用以来完成稠密检索(Dense Retrieval)任务,又可以利用其他一般性token的输出向量用以支持稀疏检索(Sparse Retrieval)与多向量检索(Multi-vector Retrieval)。三种检索功能的高度集成使得BGE-M3可以一站式服务不同的现实场景,如语义搜索、关键字搜索、重排序。同时,无需使用多个模型进行多个推理,BGE-M3一次推理就可以得到多个不同模式的输出,无需额外开销,并能高效支持混合检索,联合三种检索模式可获得更加精准的检索结果。多粒度(Multi-Granularity)
BGE-M3目前可以处理最大长度为8192 的输入文本,极大地满足了社区对于长文档检索的需求。在训练BGE-M3时,智源研究员在现有长文本检索数据集的基础之上,通过模型合成的方式获取了大量文本长度分布多样化的训练数据。与此同时,BGE-M3通过改进分批(batch)与缓存(cache)策略,使得训练过程具备足够高的吞吐量与负样本规模,从而确保了训练结果的质量。基于数据与算法双层面的优化处理,BGE-M3得以高质量的支持“句子”、“段落”、“篇章”、“文档”等不同粒度的输入文本。
分段优化
- sliding window找到对于文档 + 向量模型最合适的分段长度,在无法使用文档结构切分的情况下,使用滑动窗口切分,保证每段语义完整。
- small-to-big将相邻的段落合并,让上下文更连贯将较短的段落补充为较长的段落,让 prompt 中的语义更完整。
元信息抽取
文档关键信息,例如发表时间、作者、标题,文档库信息。
段落关键信息,例如多级标题、相关 query,summary,relatedQueries
实体抽取
将抽取到的信息作为独立查询条件,或者加入向量化字段,提升检索效果。
KG 知识图谱在 RAG 中的应用
- 使用 KG 增强文档结构表达和检索(Knowledge Graph Prompting for Multi-Document Question Answering)https://arxiv.org/pdf/2308.11730v3.pdf
- 使用 LLM 抽取实体创建图谱,检索子图检索过程:
(1)搜索 Query 中相关的实体,获取这个实体(默认 2 层)的子图,根据子图生成 Prompt 的 context【噪声多】
(2)通过 NL2Cypher 生成 query 查询 KG【可能没有结果】
(3)将两种召回结果合并
实践参考:
2.3 检索后 Post-Retrieval
重排
为什么要重排:检索阶段为了处理大量数据,使用聚类或者 ANN 近似最近邻算法,使用的向量模型会有性能考虑,不能保证精确度,所以需要重排来提升检索精准度。
打分方式:除了使用相关性模型(cohere/bge)外,还会结合传统的检索分数(BM25)或自定义的特征(文档质量分、点击量)综合评分。测评结果:
此外还有一些其他适应 LLM 的 reranker,例如 haystack 的:
- Diversity Reranker:选择最相关的文档,然后选择剩余文档中与已选择文档中最不相关的。让模型生成更有广度和深度。
- LostInTheMiddleReranker: [1 2 3 4 5 6 7 8 9 10] -> [1 3 5 7 9 10 8 6 4 2]
Prompt 优化
- prompt 信息压缩,可以用 NLP 小模型做,减少上下文长度和噪声。
- 根据不同场景选择 prompt 模板。
2.4 ModularRAG
随着 RAG 领域发展和更多工程上的应用,RAG 框架需要更多加多样化和灵活,因此需要抽象为「模块化 RAG」。
模块增强 Augmented Module
链路增强 Augmented Process
modularRAG 阶段除了不断沉淀模块以外,还包括如何更好的组织这些模块进行生成。advancedRAG 阶段主要解决的问题是「检索什么内容」,modularRAG 需要解决「什么时候检索」的问题。以下是三种循环检索 - 生成的方式:
RecursiveRAG 请看前文介绍的 Tree of Clarification
IterativeRAG
https://arxiv.org/pdf/2305.15294.pdf
先用原始 query 检索生成,然后将生成结果 + 原始 query 进行第二轮检索生成,N 次迭代或 llm 判断可以回答问题后停止。
AdaptiveRAG
- FLARE:模型生成低置信度 token 时停止生产,或者用 prompt 指示模型不确定时停止生成。用当前有疑问的语句生成问题进行检索,再根据检索到的内容继续生成。https://arxiv.org/pdf/2305.06983.pdf
- Self-RAG:
- fine-tune 模型,让模型理解什么时候需要检索。
- 当模型认为需要检索,生成特殊的 token。
- 此时停止生成,根据生成的新问题检索。
- 用模型对生成结果进行评判,将选择的最优生成结果作为 context 继续生成。
https://arxiv.org/pdf/2310.11511.pdf
3.RAG 评估
3.1 检索评估:评估查询检索到的文本块的质量
https://medium.com/relari/a-practical-guide-to-rag-pipeline-evaluation-part-1-27a472b09893
纯检索指标
- 精准率(Precision):衡量信号与噪音的比例——检索到的相关文档 / 所有检索到的文档。
- 召回率(Recall):衡量完整性——检索到的相关文档 / 所有相关文档。我们认为召回率是检索领域的北极星指标。这是因为只有当我们有足够的信心,相信检索到的上下文完整到足以回答问题时,检索系统对于生成任务来说才是可接受的。
- F1 分数:精确率和召回率的调和平均值。
检索 & 重排指标
平均倒数排名(Mean Reciprocal Rank, MRR)
: MRR 计算的是最相关文档的倒数排名的平均值。如果正确答案的排名是高的(即排名接近第一位),则倒数值会大。MRR 值的范围是 0 到 1,值越高表示检索系统性能越好。平均精确率均值(Mean Average Precision, MAP)
: MAP 首先计算每个查询的平均精确率,然后对所有查询的平均精确率进行平均。这里的 “精确率” 是指在每个排名阶段检索到的相关文档数量占到目前为止所有检索到的文档数量的比例。MAP 考虑了所有相关文档,并且对检索结果的排序非常敏感,值越高,表示检索系统的排名性能越好。归一化折损累计增益(Normalized Discounted Cumulative Gain, NDCG)
: NDCG 倾向于赋予排在前面的相关文档更高的权重,是一种位置敏感的度量方法。NDCG 先计算一个未经归一化的折扣累积增益(Discounted Cumulative Gain, DCG),然后用这个值除以一个理想状态(即最佳排名顺序)下的 DCG,从而得到归一化的值。NDCG 的值范围在 0 到 1 之间,越接近 1 表示检索性能越佳,特别是在前面几个结果的质量方面。
能否用 LLM 评估检索
- Relevance:query 与检索到的单文档相关性。llm 适用于做二元分类,但是大模型给出相关的评价比较谨慎,倾向于高精确率低召回率,会有假负例情况。GPT4 评价的正确率可以达到 79%。
- Precision:精准率 / 平均精准率,准确率只有 40%+
- Context Coverage:上下文覆盖率,能否用检索到的文档生成标准答案?只有 GPT4 可用
结论:基于 llm 的评测可以用来指导优化方向(用来对比多种方案的效果),但是 llm 评测的准确率不能来评估方案的真正准确率。
3.2 生成评估:评估使用检索文档增强的上下文的质量
https://medium.com/relari/a-practical-guide-to-rag-evaluation-part-2-generation-c79b1bde0f5d
生成结果评估
- Correctness:比较生成的答案与标准答案
- Relevance:答案是否与 query 相关
- Logic:答案逻辑性
- Style:生成风格评估,长短、语气 etc.
生成阶段评估
- Fathfulness(Answer to Context Retrieved):答案是否忠于给定的上下文
- 噪声鲁棒性 (Noise Robustness) 模型能否从噪声文档中提取有用信息
- 否定拒绝 (Negative Rejection) 当检索到的文档中不存在所需的知识点时,应该拒绝回答
- 信息整合 (Info Integration) 模型能否回答需要整合多个文档信息的复杂问题
- 反事实鲁棒性 (Counterfactual Robustness) 模型能否识别检索文档中已知事实错误的风险
能否用 LLM 评估生成
正确性评估、忠实性评估数据对比:llm 高于其他方法
大模型适用于更广泛的生成评估指标:
4. 模块化RAG技术总图(Modular RAG Technical Map)
参考资料
- https://github.com/Tongji-KGLLM/RAG-Survey?tab=readme-ov-file#rag-readings
- https://github.com/hymie122/RAG-Survey
更多优质内容请关注公号:汀丶人工智能;会提供一些相关的资源和优质文章,免费获取阅读。