人工智能之 RAG 知识详细解析
Retrieval-Augmented Generation (检索增强生成)-- 让大语言模型拥有实时知识的能力目录RAG 概述RAG 核心架构RAG 工作流程详解RAG 关键技术组件RAG 核心算法与模型RAG 优化策略RAG 应用场景RAG 代码实现示例RAG 挑战与未来发展总结1. RAG 概述1.1 什么是 RAGRAG (Retrieval-Augmented Generation, 检索增强生成)是一种将信息检索 (Information Retrieval) 与自然语言生成 (Natural Language Generation) 相结合的技术框架. 它通过在生成回答之前, 先从外部知识库中检索相关信息, 然后将检索结果作为上下文提供给大语言模型 (LLM), 从而生成更准确, 更可靠, 更具时效性的回答.1.2 为什么需要 RAG问题说明知识截止日期LLM 训练数据有截止时间, 无法获取最新信息幻觉问题LLM 可能生成看似合理但实际错误的内容领域知识缺失通用 LLM 缺乏专业领域 (如医疗, 法律) 的私有知识可解释性不足难以追溯 LLM 回答的信息来源成本高昂频繁微调 LLM 成本极高1.3 RAG 的核心价值实时知识更新: 无需重新训练模型, 只需更新知识库减少幻觉: 基于检索到的真实文档生成回答可追溯性: 每个回答都可以追溯到具体的知识来源成本效益: 避免昂贵的模型微调领域适配: 轻松接入私有/专业领域知识1.4 RAG 的发展历程2020 -- Facebook 提出 RAG 原始论文 | 2022 -- ChatGPT 引爆 LLM 应用, RAG 成为解决知识更新的主流方案 | 2023 -- LangChain, LlamaIndex 等框架成熟, RAG 工程化落地 | 2024 -- Advanced RAG (高级检索增强): 多路召回, 重排序, Agentic RAG | 2025 -- GraphRAG, Modular RAG, Agentic RAG 成为主流方向2. RAG 核心架构2.1 经典 RAG 架构------------------------------------------------------------------------- | RAG 系统架构 | ------------------------------------------------------------------------- | | | -------------- -------------- ---------------------- | | | 用户查询 |----| 检索模块 |----| 重排序/过滤模块 | | | | (Query) | | (Retrieval) | | (Reranking) | | | -------------- -------------- ---------------------- | | ^ | | | | v | | -------------- -------------- ---------------------- | | | 向量数据库 |----| 嵌入模型 |----| 知识库/文档 | | | |(Vector DB) | |(Embedding) | | (Knowledge Base) | | | -------------- -------------- ---------------------- | | ^ | | | | | ---------------------------------------------------------------- | | | 生成模块 (Generation) | | | | -------------- -------------- -------------- | | | | | 检索结果 |---| 提示工程 |---| LLM 模型 | | | | | |(Retrieved | | (Prompt | | (Generation) | | | | | | Context) | | Engineering)| | | | | | | -------------- -------------- -------------- | | | ---------------------------------------------------------------- | | | | | v | | ---------------------------------------------------------------- | | | 最终回答 (Answer) | | | ---------------------------------------------------------------- | | | -------------------------------------------------------------------------2.2 离线阶段 (Indexing)原始文档 -- 文档加载 -- 文本分割 -- 向量化 -- 向量存储 | | | | | | Loader Splitter Embedding Vector DB | (加载器) (分割器) (嵌入模型) (向量数据库)2.3 在线阶段 (Querying)用户查询 -- 查询向量化 -- 相似度检索 -- 上下文组装 -- LLM生成 -- 回答3. RAG 工作流程详解3.1 第一阶段: 数据预处理 (离线)3.1.1 文档加载 (Document Loading)支持多种文档格式:文本文件: .txt, .md, .csv办公文档: .pdf, .docx, .pptx, .xlsx网页数据: HTML, JSON, XML数据库: SQL, NoSQL 数据库API 数据: REST API, GraphQL3.1.2 文本分割 (Text Splitting / Chunking)文本分割是 RAG 中最关键的预处理步骤之一, 直接影响检索质量.常见分割策略:策略说明适用场景固定长度分割按固定字符数或 token 数分割通用场景递归字符分割按段落, 句子, 单词层级递归分割保持语义完整性语义分割基于语义相似度进行分割高质量需求结构化分割按文档结构 (标题, 段落) 分割结构化文档Agentic 分割使用 LLM 智能决定分割边界复杂文档重叠策略 (Overlap):相邻 chunk 之间保留一定重叠内容避免关键信息被截断在边界处通常设置 10%-20% 的重叠比例3.1.3 向量化 (Embedding)将文本转换为高维向量表示, 使得语义相似的文本在向量空间中距离相近.# 向量化示例 from sentence_transformers import SentenceTransformer model SentenceTransformer(BAAI/bge-large-zh-v1.5) text 人工智能是计算机科学的一个分支 embedding model.encode(text) # 输出: 1024 维向量主流 Embedding 模型:模型维度语言特点text-embedding-3-large3072多语言OpenAI, 性能优秀text-embedding-3-small1536多语言OpenAI, 性价比高BAAI/bge-large-zh1024中文中文场景首选BAAI/bge-m31024多语言支持 100 语言nomic-embed-text-v1768多语言开源, 性能强jina-embeddings-v31024多语言支持长文本3.2 第二阶段: 检索 (Retrieval)3.2.1 向量检索 (Vector Search)基于向量相似度进行检索, 核心算法:余弦相似度 (Cosine Similarity):cosine(a, b) (a . b) / (||a|| * ||b||)欧氏距离 (Euclidean Distance):d(a, b) sqrt(sum((a_i - b_i)^2))近似最近邻算法 (ANN):算法原理特点HNSW分层可导航小世界图高召回率, 内存占用大IVF倒排文件索引平衡速度与精度PQ乘积量化内存效率高DiskANN磁盘上的 ANN支持海量数据3.2.2 混合检索 (Hybrid Search)结合向量检索和关键词检索 (BM25/TF-IDF), 提升召回率.向量检索结果 -- -- 融合排序 -- 最终检索结果 BM25 检索结果 --融合策略:RRF (Reciprocal Rank Fusion): 倒数排名融合加权融合: 为不同检索方式分配权重交叉编码器重排序: 使用更精确的模型重新排序3.2.3 多路召回 (Multi-Route Retrieval)查询 ---- 语义向量检索 -- 关键词检索 (BM25) -- 稀疏向量检索 (SPLADE) -- 图检索 (GraphRAG) -- 结构化数据检索 (SQL)3.3 第三阶段: 生成 (Generation)3.3.1 提示工程 (Prompt Engineering)经典 RAG 提示模板:你是一个专业的问答助手. 请基于以下参考信息回答问题. 如果参考信息不足以回答问题, 请明确说明. 参考信息: {retrieved_context} 用户问题: {user_query} 请用中文回答, 并在回答末尾列出参考来源.3.3.2 上下文压缩 (Context Compression)由于 LLM 上下文长度限制, 需要对检索结果进行压缩:Map-Reduce: 分块处理, 逐步汇总Stuff: 直接拼接所有文档Refine: 迭代精炼LLM 摘要: 用 LLM 压缩每个 chunk4. RAG 关键技术组件4.1 向量数据库 (Vector Database)数据库特点适用场景Milvus开源, 分布式, 高性能大规模生产环境Pinecone托管服务, 易用快速原型开发Weaviate支持 GraphQL, 模块化复杂查询场景Chroma轻量级, 易集成本地开发/小型项目QdrantRust 编写, 高性能高性能需求FaissMeta 开源, 纯向量检索研究/高性能计算pgvectorPostgreSQL 扩展已有 PG 基础设施Elasticsearch支持混合检索已有 ES 基础设施4.2 文档处理框架框架功能特点LangChain全链路 RAG 框架生态丰富, 模块化LlamaIndex数据索引与检索专注检索, 高级功能多Haystack端到端 NLP 流水线企业级, 可视化Semantic Kernel微软出品与 Azure 深度集成4.3 重排序模型 (Reranker)重排序模型对初步检索结果进行精排, 显著提升最终质量.模型说明Cohere Rerank商业 API, 效果优秀BAAI/bge-reranker-large开源中文重排序cross-encoder/ms-marco开源英文重排序4.4 大语言模型 (LLM)模型提供商特点GPT-4oOpenAI综合能力最强Claude 3.5Anthropic长上下文, 推理强Gemini ProGoogle多模态, 长上下文DeepSeek-V3DeepSeek中文优秀, 性价比高Qwen2.5阿里巴巴中文场景首选Llama 3Meta开源, 可本地部署5. RAG 核心算法与模型5.1 原始 RAG 论文论文: Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (Lewis et al., 2020)核心思想:预训练一个 seq2seq 模型 (如 BART/T5)使用 DPR (Dense Passage Retrieval) 检索相关文档将文档与查询拼接后输入生成模型5.2 密集段落检索 (DPR)论文: Dense Passage Retrieval for Open-Domain QA (Karpukhin et al., 2020)核心思想:使用双编码器 (Bi-Encoder) 分别编码查询和段落通过对比学习训练, 使相关查询-段落对在向量空间中靠近检索时使用 FAISS 进行近似最近邻搜索查询 q -- Encoder_q -- 向量 v_q 文档 d -- Encoder_d -- 向量 v_d 相似度: sim(q, d) v_q . v_d5.3 稀疏检索: BM25BM25 公式:BM25(q, d) sum(IDF(q_i) * f(q_i, d) * (k_1 1) / (f(q_i, d) k_1 * (1 - b b * |d| / avgdl)))其中:f(q_i, d): 词项 q_i 在文档 d 中的频率|d|: 文档长度avgdl: 平均文档长度k_1 和 b: 可调参数5.4 学习稀疏检索: SPLADESPLADE通过学习将文档扩展为稀疏向量, 结合 BM25 的效率和神经网络的语义理解能力.5.5 图检索: GraphRAGGraphRAG将知识构建为图结构, 通过图遍历进行检索:实体识别 -- 关系抽取 -- 知识图谱构建 -- 图查询 (社区检测/遍历)优势:捕捉实体间复杂关系支持多跳推理更好的全局理解6. RAG 优化策略6.1 检索优化6.1.1 查询重写 (Query Rewriting)原始查询: 这个产品的价格 | v 查询扩展: 这个产品的价格是多少? 产品定价, 费用, 收费标准技术:HyDE (Hypothetical Document Embeddings): 生成假设文档, 用假设文档检索查询扩展: 同义词扩展, LLM 改写多查询生成: 生成多个相关查询并行检索6.1.2 多路召回与融合# RRF 融合示例 def reciprocal_rank_fusion(results_lists, k60): scores {} for results in results_lists: for rank, doc_id in enumerate(results): if doc_id not in scores: scores[doc_id] 0 scores[doc_id] 1 / (k rank 1) return sorted(scores.items(), keylambda x: x[1], reverseTrue)6.1.3 重排序优化初步检索 Top-100 -- 重排序模型 -- 精选 Top-5 -- LLM 生成6.2 生成优化6.2.1 上下文窗口管理策略说明窗口滑动动态调整上下文窗口优先级排序按相关性排序, 优先放入高相关文档摘要压缩对长文档进行摘要后再放入6.2.2 引用生成 (Citation Generation)让 LLM 在生成回答时标注信息来源:根据[文档1]和[文档3]的信息, 该产品的价格为 199 元.6.3 高级 RAG 模式6.3.1 Self-RAG论文: Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection (Asai et al., 2023)核心思想:LLM 自主决定是否需要检索生成过程中插入反思 token对检索结果和生成结果进行自我评估查询 -- LLM 判断是否需要检索 | -- 不需要 -- 直接生成 | -- 需要 -- 检索 -- 生成 -- 评估相关性 -- 支持/不支持/不相关6.3.2 Corrective RAG在检索结果质量不佳时, 自动转向网络搜索或其他知识源.6.3.3 Agentic RAG将 RAG 与 Agent 框架结合:用户查询 | v Agent 规划: 需要哪些信息? | -- 子查询 1 -- 检索 -- 结果 1 -- 子查询 2 -- 检索 -- 结果 2 -- 子查询 3 -- 检索 -- 结果 3 | v Agent 综合: 整合所有结果生成最终回答6.3.4 Modular RAG将 RAG 系统拆分为可插拔的模块:检索模块可替换生成模块可替换支持动态路由7. RAG 应用场景7.1 企业知识库问答企业内部文档 (产品手册, 技术文档, 规章制度) | v RAG 系统 | v 员工问答: 请假流程是什么?, 如何申请服务器资源?7.2 智能客服基于产品 FAQ 和文档自动回答客户问题减少人工客服工作量7x24 小时服务7.3 法律/医疗咨询法律: 基于法条, 判例进行法律咨询医疗: 基于医学文献, 临床指南辅助诊断7.4 代码辅助基于代码库进行智能问答代码解释, Bug 修复建议7.5 学术研究文献综述自动生成跨论文知识关联7.6 个性化推荐基于用户历史行为文档进行个性化回答8. RAG 代码实现示例8.1 基础 RAG 实现 (Python) 基础 RAG 实现示例 依赖: pip install langchain chromadb sentence-transformers from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import Chroma from langchain.llms import OpenAI from langchain.chains import RetrievalQA # 1. 文档加载 loader TextLoader(./knowledge_base.txt) documents loader.load() # 2. 文本分割 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个 chunk 500 字符 chunk_overlap50, # 重叠 50 字符 separators[\n\n, \n, 。, , , , ] ) chunks text_splitter.split_documents(documents) # 3. 向量化 embedding_model HuggingFaceEmbeddings( model_nameBAAI/bge-large-zh-v1.5 ) # 4. 向量存储 vectorstore Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db ) # 5. 检索器 retriever vectorstore.as_retriever( search_typesimilarity, search_kwargs{k: 5} # 返回 Top-5 ) # 6. 构建 RAG 链 qa_chain RetrievalQA.from_chain_type( llmOpenAI(), chain_typestuff, retrieverretriever, return_source_documentsTrue ) # 7. 查询 query 什么是 RAG 技术? result qa_chain({query: query}) print(回答:, result[result]) print(来源:, [doc.page_content[:100] for doc in result[source_documents]])8.2 高级 RAG 实现 (含重排序) 高级 RAG 实现: 多路召回 重排序 from langchain.retrievers import BM25Retriever, EnsembleRetriever from langchain_community.cross_encoders import HuggingFaceCrossEncoder from langchain.retrievers.document_compressors import CrossEncoderReranker from langchain.retrievers import ContextualCompressionRetriever # 多路召回 # 向量检索器 vector_retriever vectorstore.as_retriever(search_kwargs{k: 20}) # BM25 检索器 bm25_retriever BM25Retriever.from_documents(chunks) bm25_retriever.k 20 # 融合检索器 (Ensemble) ensemble_retriever EnsembleRetriever( retrievers[bm25_retriever, vector_retriever], weights[0.5, 0.5] ) # 重排序 cross_encoder HuggingFaceCrossEncoder( model_nameBAAI/bge-reranker-large ) compressor CrossEncoderReranker( modelcross_encoder, top_n5 ) # 压缩检索器 (检索 重排序) compression_retriever ContextualCompressionRetriever( base_compressorcompressor, base_retrieverensemble_retriever ) # 使用 relevant_docs compression_retriever.get_relevant_documents(query)8.3 使用 LlamaIndex 实现 RAG 使用 LlamaIndex 实现 RAG 依赖: pip install llama-index from llama_index.core import VectorStoreIndex, SimpleDirectoryReader from llama_index.core.node_parser import SentenceSplitter from llama_index.embeddings.huggingface import HuggingFaceEmbedding from llama_index.llms.openai import OpenAI # 加载文档 documents SimpleDirectoryReader(./docs).load_data() # 创建索引 index VectorStoreIndex.from_documents( documents, embed_modelHuggingFaceEmbedding(model_nameBAAI/bge-large-zh-v1.5), transformations[SentenceSplitter(chunk_size512, chunk_overlap50)] ) # 创建查询引擎 query_engine index.as_query_engine( llmOpenAI(modelgpt-4), similarity_top_k5 ) # 查询 response query_engine.query(解释 RAG 的工作原理) print(response)8.4 Self-RAG 简化实现 Self-RAG 简化概念实现 class SelfRAG: def __init__(self, llm, retriever): self.llm llm self.retriever retriever def need_retrieval(self, query): 判断是否需要检索 prompt f判断以下问题是否需要外部知识才能回答. 问题: {query} 如果需要检索请回答是, 否则回答否. response self.llm.generate(prompt) return 是 in response def retrieve(self, query): 执行检索 return self.retriever.get_relevant_documents(query) def is_relevant(self, query, document): 判断文档是否与查询相关 prompt f判断以下文档是否与问题相关. 问题: {query} 文档: {document[:200]} 相关请回答是, 否则回答否. response self.llm.generate(prompt) return 是 in response def generate(self, query): 生成回答 if not self.need_retrieval(query): return self.llm.generate(f请回答: {query}) docs self.retrieve(query) relevant_docs [d for d in docs if self.is_relevant(query, d.page_content)] if not relevant_docs: return 抱歉, 没有找到相关信息. context \n\n.join([d.page_content for d in relevant_docs[:3]]) prompt f基于以下信息回答问题: {context} 问题: {query} return self.llm.generate(prompt)9. RAG 挑战与未来发展9.1 当前挑战挑战说明解决方案方向多跳推理需要跨多个文档进行推理GraphRAG, Agentic RAG长文档处理超长文档的分割和检索长上下文模型, 层次化索引多模态 RAG图像, 视频等非文本数据多模态 Embedding实时性知识更新的延迟流式索引, 实时同步评估困难缺乏统一的评估标准RAGAS, ARES 等评估框架幻觉问题即使有检索, LLM 仍可能编造更严格的约束生成成本优化Embedding 和 LLM 调用成本高模型蒸馏, 缓存策略9.2 评估指标指标说明Context Precision检索到的上下文中相关 chunk 的比例Context Recall回答中引用的信息占所有相关 chunk 的比例Faithfulness生成内容与检索内容的一致性Answer Relevance回答与问题的相关性Latency端到端响应时间评估框架:RAGAS: 自动化 RAG 评估框架ARES: 基于 LLM 判断的评估TruLens: 可解释性评估9.3 未来发展方向Agentic RAG: RAG 与智能体深度结合, 支持复杂任务规划GraphRAG 普及: 知识图谱与 RAG 的融合成为标配多模态 RAG: 支持图像, 音频, 视频的检索增强联邦 RAG: 分布式知识库的安全检索自适应 RAG: 系统自主学习最优检索策略RAG 即服务 (RAGaaS): 标准化的 RAG 云服务10. 总结RAG 核心要点回顾------------------------------------------------------------- | RAG 核心公式 | ------------------------------------------------------------- | | | RAG 检索(Retrieval) 增强(Augmentation) 生成(Generation) | | | | 回答 LLM(用户查询 检索到的相关知识) | | | -------------------------------------------------------------关键成功因素高质量的文档预处理: chunk 大小, 重叠策略, 元数据标注合适的 Embedding 模型: 根据语言和场景选择有效的检索策略: 混合检索, 重排序, 查询优化精准的提示工程: 清晰的指令和上下文组织持续的评估迭代:基于真实用户反馈优化