一、RAG 概述
(一)LLM 的缺陷
- 幻觉 :LLM 可能生成无事实依据、不与现实世界一致,甚至完全虚构的内容。
- 知识更新滞后 :LLM 知识的有效性取决于训练数据的时间,存在知识更新滞后问题。
- 回答缺乏透明度 :LLM 生成的回答通常缺乏引用来源,导致用户难以判断答案的真实性,降低模型可信度。
(二)Definition
为缓解上述问题,RAG 通过检索外部知识库相关信息,并将信息作为上下文输入语言模型,增强生成能力,减少幻觉、提供事实依据,借外部知识库实现实时更新,使生成结果带检索来源,提升专业领域表现。
(三)组件
- 向量数据库 (Vector DB) :存储和检索嵌入向量,如 FAISS、Pinecone、Weaviate。
- 嵌入模型 (Embedding Model) :将文本转换为向量,如 OpenAI Embeddings、BERT。
- 检索模型 (Retriever) :检索相关信息,可使用 BM25、Dense Retrieval (DPR) 等方法。
- LLM (Large Language Model) :如 GPT - 4 等,负责生成最终答案。
- 融合策略 (Fusion Strategy) :结合检索信息与 LLM 结果,提高生成可信度。
(四)常见应用领域
- 企业知识问答
- 法律 / 医疗领域问答
- 金融风控
- 搜索增强对话
二、RAG 实现
(一)数据处理
1. 数据清洗 cleaning
- 去重 (Deduplication) :去除重复文档或内容,提高存储效率,减少无效检索。
- 噪声过滤 (Noise Filtering) :删除无关内容、广告、低质量文本,避免干扰 LLM 生成。
- 格式标准化 (Normalization) :统一文本编码、标点符号、日期格式,保证数据一致性。
2. 数据分片 chunking
基于规则的 chunking
- 固定长度分片 :按固定字符数或单词数切分,如每 512 词分为一个 Chunk。适合结构化文本(如 Wikipedia),但可能导致句子或段落拆散,影响语义完整性。
- 基于段落的 Chunking :以自然语言逻辑单元(如句子、段落)进行分片,保持上下文完整性。适用于法律、医学文档,但 Chunk 长度不均匀,可能影响索引效率。
- 滑动窗口分片 :相邻 Chunk 之间有部分重叠,如窗口大小 256 词,滑动步长 128 词。可保证跨段落上下文信息,减少查询时信息丢失,但增加存储和计算开销。
基于模型的 chunking
- Transformer 句子分割 :用 Transformer 模型(如 BERT、RoBERTa)检测句子边界,以高语义相关性进行分片。适用于复杂文档(如法律、医学文本),避免破坏逻辑结构。
- 基于依存关系的 Chunking :依存句法分析识别主谓宾结构,以语法结构为基础拆分 Chunk。适用于技术文档(如 API 说明书、论文摘要)。
- 基于 LLM 的 Chunking :让 LLM 自适应判断 Chunk 切分点,根据上下文哪些部分应作为独立片段。适用于非结构化文本(如用户评论、社交媒体内容)。
Small2Big Chunking
- 核心思想 :先生成较小 Chunk,再按语义相似度合并成较大 Chunk,形成合理文档分片结构,结合固定长度切分与语义分析,避免传统 Chunking 方法弊端。
- 初步切分小片段 (Small Chunks) :用固定长度或自然段落切分,保持文本语义完整性。
- 计算 Chunk 之间语义相似度 :用 BERT/SBERT 向量嵌入将 Chunk 表示为向量;计算相邻 Chunk 余弦相似度 S_{i,i+1};设相似度阈值 \tau ,若 S_{i,i+1} > \tau 则合并。
- 相似度高的 Chunk 合并 :形成更大、更有信息密度的片段,逐步执行直至不满足合并条件。
- 存入向量数据库 :采用 FAISS/Pinecone 存储优化后的 Chunk。
3. 数据嵌入 embedding
-
嵌入模型选择 :
- OpenAI—text-embedding-ada-002 :输出 1536 维向量,适合通用任务,支持多种语言。
- SBERT(Sentence-BERT) :BERT 变体,专为句子级 Embedding 设计,适合语义匹配和问答任务。
- BAAI(bge-base-zh) :在中文任务上表现优异,适合中文 RAG 应用。
- DistilBERT :BERT 轻量级版本,计算效率高,适合资源受限环境。
- 自定义微调模型 :微调现有模型(如 BERT、RoBERTa)以适应特定专业领域或任务的 RAG 应用。
-
优化 query :
- Query Rewriting(查询重写) :用语言模型(LLM)使用户查询更自然、易检索。
- HyDE(假想文档嵌入) :生成 “假想文档” 或 “假想答案”,以其向量匹配真实文档提升检索效果。
-
优化文档 Embedding :
- 生成摘要 :为长文档(如论文)生成简短摘要,存储摘要与全文的 Embedding。
- 假想问题 :为每个文档生成可能回答的问题,存储问题的 Embedding。
(二)检索 Retrieval
1. 检索流程
RAG 检索流程通常包括两个阶段:
- 召回 (Retrieval) :基于关键词(如 BM25)或语义(Embedding ANN)快速检索出候选文档。
- 重排序 (Rerank) :对初步召回文档进行精细语义相关度计算,得到精确排序结果。
2. 召回
- 关键词检索 :基于精确词汇匹配检索,典型代表是 BM25 算法。
- 语义检索 :利用向量空间模型表示文本语义,通过向量相似度检索,包括余弦相似度算法、FAISS、HNSW。
- 混合检索 :结合关键词检索和语义检索优势,采用多阶段检索策略,并行召回或串行召回。
3. 重排序
- Rerank 一般流程 :输入候选文档集合 {D1,…,Dn} 和查询文本 Q;利用 Cross-Encoder 模型分别计算每对 (Q,Di) 相关度评分(常见模型有基于 BERT 的 Cross-Encoder、领域特定 Finetuned Cross-Encoder);按分数高低重新排序,取前 k 个文档作为最终结果。
- 提升 Rerank 算法效果的方法 :
- 领域微调 (Finetune) :用相关领域数据微调 Cross-Encoder 模型。
- 知识蒸馏 (Knowledge Distillation) :训练轻量级模型,降低延迟。
- 难负例 (Hard Negative) 训练 :增强模型识别能力。
(三)生成 Generation
1. 生成策略流程
检索阶段获取与查询相关的文档或片段;将检索内容融入 Prompt 中;使用生成模型(如 GPT - 4)基于 Prompt 生成最终答案。
2. 几种生成策略
-
Prompt-based 生成策略 :将检索到的文档直接放入 Prompt 中生成,简单高效易实现,但受限于模型最大上下文长度,可能产生幻觉问题。Prompt =[Instruction]+[Retrieved Docs]+[Query]
-
融合生成策略 (Fusion-in-Decoder) :在 Decoder 阶段结合多个检索文档信息,增强答案精准度,减少幻觉问题,但推理速度较慢,实现成本高。
- RAG-Sequence :逐步选择合适文档生成答案,每一步动态选择上下文。
- RAG-Token :每生成一个词 (Token) 都动态选择不同文档的信息支持当前生成内容。
-
选代生成策略 (Iterative Generation) :允许模型在多轮迭代中优化答案,用于需极高准确性的场景。根据初步答案再次检索相关文档;重新生成答案,迭代至达到期望质量。
-
自一致性生成策略 (Self-Consistency) :多次生成并融合多个候选答案提高整体质量,提高结果稳定性,但计算成本高。对同一检索结果多次调用生成模型,得多个答案;用多数投票或评分融合机制选最优答案。
3. 生成策略优化
- Prompt 工程优化 :合理设计 Prompt 结构,提升生成质量。
- 领域特定模型微调 (Finetune) :在专业领域内优化生成效果。
- Temperature 和 Top-k 调整 :调低 temperature 参数提高生成稳定性和一致性。
(四)增强 Augment
1. 预训练数据增强
- 随机掩蔽 (Random Masking) :随机掩盖句子或文档中的词汇,让模型预测被掩盖内容,增强语言理解能力。
- 随机替换同义词 (Synonym Replacement) :用 WordNet 或词典随机替换句子中的词汇,提升对同义表达的泛化能力。
- 上下文乱序 (Sentence Permutation) :在段落级别随机打乱句子顺序,增强对整体语义的理解。
- 回译 (Back Translation) :利用多语言模型,将文本翻译成另一种语言再回译,生成语义等价但表达不同的文本,提升语义泛化能力。
2. 微调数据增强
- 领域术语增强 (Domain-specific Term Replacement) :在特定领域内用同领域同义术语替换,强化模型对领域术语的理解。
- 句子拼接与切分 (Sentence Concatenation and Splitting) :将多个句子拼接或长句切分为短句,增加训练样本多样性,提高对复杂上下文的处理能力。
- 对比学习增强 (Contrastive Learning Augmentation) :构造正负样本对(如问答对),采用对比学习提高检索精确度和生成连贯性。
- 知识注人 (Knowledge Injection) :从知识图谱或百科知识库抽取相关知识,嵌入训练数据,提升对知识的捕获和利用能力。
3. 推理数据增强
- Prompt 增强 (Prompt Augmentation) :使用多样化的 Prompt 结构或模板,提高生成模型对问题的理解能力与稳定性。
- 上下文扩展与补充 (Context Expansion) :在原始检索文档基础上,增加相关背景文档或扩展信息,降低生成幻觉风险。
- 多次推理融合 (Multi-sampling Generation) :针对同一问题多次生成(不同 temperature 或 top-k),通过投票或打分机制选最优答案,提升答案质量和稳定性(Self-consistency 方法)。
- 迭代自问白答 (Iterative SelfAsk) :利用生成结果多次检索和迭代生成,增强生成内容的深度与准确性。
三、RAG 评估
(一)评估方法
1. 检索评估
评估召回质量,即系统能否召回正确且相关的文档。关注检索阶段的准确性和召回率,特别是 context relevance 指标(检索到的 chunks 与 query 的相似度)。常用方法包括:MRR、Recall@k、NDCG、Hit rate 等。
2. 生成评估
评估最终生成答案的质量,包括准确性、流畅性与一致性。一方面衡量生成答案能否忠实地反映检索到的上下文内容,避免幻觉或无根据答案,确保可信与基于事实;另一方面关注答案是否直接有效回答用户问题,体现准确性和有效性。
(二)评估框架
- LangChain Evaluation :内置标准化评估流程,支持检索评估、生成评估及自动指标计算。
- LlamaIndex Eval Framework :专注 RAG 场景,提供综合检索与生成质量评估。
- Haystack Eval Framework :集成检索与问答场景评估能力,适用于工业级 RAG 系统。
- RAGAS (Retrieval-Augmented Generation Assessment) :专门用于 RAG 场景的评估框架,可同时评估检索与生成质量。