RAG流程详解
一:基础大模型存在的问题
我们为什么要学RAG,那是因为基础的大模型存在一些问题不能满足我们日常的开发使用。如:
- LLM 的知识不是实时的,模型训练好后不具备自动更新知识的能力,会导致部分信息滞后
- LLM 领域知识是缺乏的,大模型的知识来源于训练数据,这些数据主要来自公开的互联网和开源数据集,无法覆盖特定领域或高度专业化的内部知识
- 幻觉问题,LLM 有时会在回答中生成看似合理但实际上是错误的信息
- 数据安全性
二:RAG介绍
RAG(Retrieval-Augmented Generation)即检索增强生成,为大模型提供了从特定数据源检索到的信息,以此来修正和补充生成的答案。
一个典型的 RAG 应用有两个主要组成部分:
索引 (Indexing):从数据源获取数据并建立索引的管道 (pipeline)。这通常在离线状态下进行。
检索和生成 (Retrieval and generation):实际的 RAG 链,在运行时接收用户查询,从索引中检索相关数据,然后将其传递给模型。
索引 (Indexing)
- 加载 (Load):首先我们需要加载数据。这是通过文档加载器 Document Loaders 完成的。
- 分割 (Split):文本分割器 Text splitters 将大型文档 (Documents) 分成更小的块 (chunks)。这对于索引数据和将其传递给模型都很有用,因为大块数据更难搜索,而且不适合模型有限的上下文窗口。
- 存储 (Store):我们需要一个地方来存储和索引我们的分割 (splits),以便后续可以对其进行搜索。这通常使用向量存储 VectorStore 和嵌入模型 Embeddings model 来完成。
检索和生成(Retrieval and generation)
- 检索(Retrieval):给定用户输入,使用检索器Retriever从存储中检索相关的文本片段。
- 生成(Generate):ChatModel使用包含问题和检索到的数据的提示来生成答案。
三:流程解释
1. 用户输入处理
- 目标:解析并理解用户查询的意图和关键信息。
- 关键技术:
- 查询解析:提取关键词、实体识别(如 NER)、语义解析(理解深层意图)。
- 查询扩展:通过同义词替换、上下文联想(例如,用户问 “Transformer 结构” 时,补充 “注意力机制” 相关术语)增强检索效果。
- 向量化:将查询转换为向量表示(如使用 BERT、Sentence-BERT 等模型),便于后续向量检索。
2. 文档检索
- 目标:从外部知识库中快速找到与查询最相关的文档或段落。
- 关键技术:
- 索引构建:预处理知识库文档,构建高效的索引结构(如倒排索引、向量索引 FAISS/HNSW)。
- 检索算法:
- 稀疏检索:基于词频的方法(如 BM25),适合关键词匹配。
- 密集检索:基于语义相似度的向量匹配(如 DPR、ANCE 模型)。
- 多路召回:结合多种检索策略(如同时用 BM25 和向量检索),提升召回率。
3. 文档后处理
- 目标:优化检索结果,确保输入生成模型的信息质量。
- 关键技术:
- 去重与排序:根据相关性(如相似度分数)或多样性筛选结果。
- 截断与分块:处理长文本(如滑动窗口截断),适配生成模型的输入长度限制。
- 上下文增强:添加元信息(如文档来源、时间戳)供生成模型参考。
4. 生成回答
- 目标:基于检索结果和用户输入生成自然、准确的回答。
- 关键技术:
- 提示工程:将检索到的文档与用户查询拼接为生成模型的输入(Prompt),例如:
- 生成模型选择:使用预训练生成模型(如 GPT-3、T5、BART)进行条件文本生成。
- 可控生成:通过 Temperature 调整、Top-k 采样等控制生成结果的多样性和准确性。
- 提示工程:将检索到的文档与用户查询拼接为生成模型的输入(Prompt),例如:
5. 后处理与验证
- 目标:优化生成结果的格式和事实准确性。
- 关键技术:
- 文本润色:去除重复内容、语法纠错、调整句式。
- 事实核验:对比检索结果与生成内容,确保一致性(如使用 NLI 模型验证逻辑)。
- 引用标注:标明答案的来源文档(增强可信度)。
