RAG(检索增强生成)详解
一、什么是 RAG?
1.定义
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合了信息检索和大语言模型生成的技术,它让 AI 在回答问题时能够先从外部知识库中检索相关信息,然后基于这些信息生成更准确、更可靠的回答。
2.为什么需要 RAG?
传统大语言模型的问题: ┌─────────────────────────────────────┐ │ 问题:2024年苹果公司最新股价是多少?│ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 大模型回答: │ │ "我的训练数据截止到2023年, │ │ 无法提供2024年的信息..." │ └─────────────────────────────────────┘ RAG 的解决方案: ┌─────────────────────────────────────┐ │ 问题:2024年苹果公司最新股价是多少?│ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 1. 检索:从知识库查找最新股价 │ │ 2. 找到:2024年1月股价为 $185.92 │ │ 3. 生成:基于检索信息回答 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ RAG 回答: │ │ "根据最新数据,2024年1月 │ │ 苹果公司股价为 $185.92" │ └─────────────────────────────────────┘3.RAG 的核心价值
| 优势 | 说明 |
|---|---|
| 知识更新 | 可以访问最新信息,不受训练数据时间限制 |
| 减少幻觉 | 基于真实数据回答,减少编造内容 |
| 可解释性 | 可以引用信息来源,提高可信度 |
| 领域定制 | 可以接入企业内部知识库 |
| 成本效益 | 比重新训练模型更经济 |
二、RAG 的主要流程
1.整体流程图
┌─────────────────────────────────────────────────────────────┐ │ RAG 完整流程 │ └─────────────────────────────────────────────────────────────┘ 第一阶段:数据准备(离线) ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 原始文档 │ → │ 文档分块 │ → │ 向量化存储 │ │ (PDF/网页) │ │ (Chunking) │ │ (Embedding) │ └──────────────┘ └──────────────┘ └──────────────┘ ↓ ┌──────────────┐ │ 向量数据库 │ │ (Vector DB) │ └──────────────┘ 第二阶段:检索生成(在线) ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 用户提问 │ → │ 语义检索 │ → │ 提示词构建 │ │ │ │ (Retrieval) │ │ (Prompt) │ └──────────────┘ └──────────────┘ └──────────────┘ ↓ ↓ ┌──────────────┐ ┌──────────────┐ │ 向量数据库 │ │ 大语言模型 │ │ (Vector DB) │ │ (LLM) │ └──────────────┘ └──────────────┘ ↓ ↓ ┌──────────────┐ ┌──────────────┐ │ 相关文档块 │ ← │ 最终回答 │ │ │ │ │ └──────────────┘ └──────────────┘2.详细步骤解析
阶段一:数据准备(离线处理)
步骤 1:数据收集 ┌─────────────────────────────────────┐ │ 来源: │ │ • PDF 文档 │ │ • Word 文档 │ │ • 网页内容 │ │ • 数据库记录 │ │ • API 数据 │ └─────────────────────────────────────┘ ↓ 步骤 2:数据清洗 ┌─────────────────────────────────────┐ │ 处理: │ │ • 去除格式标签 │ │ • 去除无关内容 │ │ • 统一编码格式 │ │ • 提取纯文本 │ └─────────────────────────────────────┘ ↓ 步骤 3:文档分块(Chunking) ┌─────────────────────────────────────┐ │ 原始文档: │ │ "这是一篇很长的文章,包含很多内容..." │ │ │ │ 分块后: │ │ Chunk 1: "这是一篇很长的文章," │ │ Chunk 2: "包含很多内容," │ │ Chunk 3: "需要合理分块..." │ └─────────────────────────────────────┘ ↓ 步骤 4:向量化(Embedding) ┌─────────────────────────────────────┐ │ 文本 → 向量 │ │ │ │ "苹果公司" → [0.1, -0.2, 0.5, ...] │ │ "水果苹果" → [0.3, 0.1, -0.4, ...] │ │ │ │ 相似文本的向量在空间中距离更近 │ └─────────────────────────────────────┘ ↓ 步骤 5:存储到向量数据库 ┌─────────────────────────────────────┐ │ 向量数据库: │ │ ┌──────────┬──────────────────────┐ │ │ │ 向量 │ 原始文本 │ │ │ ├──────────┼──────────────────────┤ │ │ │ [0.1...] │ "苹果公司是一家..." │ │ │ │ [0.3...] │ "水果苹果很甜..." │ │ │ │ [-0.2...]│ "股价上涨了..." │ │ │ └──────────┴──────────────────────┘ │ └─────────────────────────────────────┘阶段二:检索生成(在线处理)
步骤 1:用户提问 ┌─────────────────────────────────────┐ │ 用户: │ │ "苹果公司最新的产品是什么?" │ └─────────────────────────────────────┘ ↓ 步骤 2:问题向量化 ┌─────────────────────────────────────┐ │ "苹果公司最新的产品是什么?" │ │ ↓ │ │ [0.15, -0.18, 0.42, ...] │ └─────────────────────────────────────┘ ↓ 步骤 3:语义检索 ┌─────────────────────────────────────┐ │ 在向量数据库中搜索最相似的向量: │ │ │ │ 问题向量:[0.15, -0.18, 0.42, ...] │ │ │ │ 计算相似度: │ │ • [0.1, -0.2, 0.5, ...] → 0.95 ✓ │ │ • [0.3, 0.1, -0.4, ...] → 0.23 │ │ • [-0.2, 0.5, 0.1, ...] → 0.67 │ │ │ │ 返回最相似的 Top-K 个文档块 │ └─────────────────────────────────────┘ ↓ 步骤 4:构建提示词 ┌─────────────────────────────────────┐ │ System Prompt: │ │ "你是一个助手,请基于以下信息回答" │ │ │ │ Retrieved Context: │ │ "苹果公司于2023年发布了iPhone 15, │ │ 配备了A17芯片..." │ │ │ │ User Question: │ │ "苹果公司最新的产品是什么?" │ └─────────────────────────────────────┘ ↓ 步骤 5:大模型生成 ┌─────────────────────────────────────┐ │ LLM 处理: │ │ • 理解上下文 │ │ • 提取关键信息 │ │ • 组织语言 │ │ • 生成回答 │ └─────────────────────────────────────┘ ↓ 步骤 6:返回结果 ┌─────────────────────────────────────┐ │ 回答: │ │ "根据最新信息,苹果公司最新的产品 │ │ 是iPhone 15系列,于2023年发布, │ │ 配备了A17芯片,具有更好的性能..." │ └─────────────────────────────────────┘三、RAG 核心组件详解
1.文档分块(Chunking)
# 为什么需要分块?# • 向量模型有长度限制# • 提高检索精度# • 便于管理# 分块策略┌─────────────────────────────────────┐ │ 策略1:固定大小分块 │ │ • 每块512tokens │ │ • 简单但可能切断语义 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ 策略2:语义分块 │ │ • 按段落、章节分块 │ │ • 保持语义完整性 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ 策略3:滑动窗口 │ │ • 块之间有重叠 │ │ • 避免丢失边界信息 │ └─────────────────────────────────────┘2.向量化(Embedding)
# 常用 Embedding 模型┌─────────────────────────────────────┐ │ OpenAI:text-embedding-ada-002│ │ •1536维向量 │ │ • 支持多语言 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ HuggingFace:sentence-transformers │ │ •all-MiniLM-L6-v2 │ │ • 开源免费 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │ 中文模型: │ │ • text2vec-base-chinese │ │ • m3e-base │ └─────────────────────────────────────┘3.向量数据库
┌─────────────────────────────────────┐ │ 向量数据库对比 │ ├─────────────────────────────────────┤ │ Pinecone • 云服务,易用 │ │ Milvus • 开源,功能强大 │ │ ChromaDB • 轻量级,易集成 │ │ Weaviate • 语义搜索 │ │ Qdrant • 高性能,开源 │ │ FAISS • Meta 开发,纯向量 │ └─────────────────────────────────────┘4.检索策略
# 检索方式┌─────────────────────────────────────┐ │1.向量相似度检索 │ │ • 计算余弦相似度 │ │ • 返回 Top-K 结果 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │2.混合检索(Hybrid Search) │ │ • 向量检索+关键词检索 │ │ • 结合语义和精确匹配 │ └─────────────────────────────────────┘ ┌─────────────────────────────────────┐ │3.重排序(Reranking) │ │ • 先检索更多结果 │ │ • 用更精确的模型重新排序 │ └─────────────────────────────────────┘四、RAG 实际应用场景
1.企业知识库问答
场景:员工查询公司政策 用户:"公司的报销流程是什么?" ↓ RAG 检索:从员工手册中找到报销流程 ↓ 回答:"根据公司政策,报销流程如下: 1. 填写报销单 2. 附上发票 3. 部门经理审批 4. 财务审核 5. 5-7个工作日到账"2.客户服务智能助手
场景:客户咨询产品问题 用户:"这个产品保修期多长?" ↓ RAG 检索:从产品文档中找到保修信息 ↓ 回答:"该产品保修期为2年, 覆盖非人为损坏的故障"3.法律文档检索
场景:律师查找相关法条 用户:"合同违约的法律责任是什么?" ↓ RAG 检索:从法律数据库中找到相关条款 ↓ 回答:"根据《民法典》第577条, 当事人一方不履行合同义务..."4.医疗健康咨询
场景:患者查询疾病信息 用户:"高血压的饮食注意事项?" ↓ RAG 检索:从医学指南中找到建议 ↓ 回答:"高血压患者饮食应注意: 1. 低盐饮食 2. 控制脂肪摄入 3. 多吃蔬菜水果..."五、RAG 的优化策略
1.数据质量优化
┌─────────────────────────────────────┐ │ • 清洗噪声数据 │ │ • 去除重复内容 │ │ • 标准化格式 │ │ • 添加元数据 │ └─────────────────────────────────────┘2.检索优化
┌─────────────────────────────────────┐ │ • 调整分块大小 │ │ • 优化 Embedding 模型 │ │ • 使用混合检索 │ │ • 添加重排序步骤 │ └─────────────────────────────────────┘3.生成优化
┌─────────────────────────────────────┐ │ • 优化提示词设计 │ │ • 添加引用来源 │ │ • 控制回答长度 │ │ • 添加置信度评分 │ └─────────────────────────────────────┘六、RAG vs 其他方法对比
| 对比项 | 纯 LLM | 微调模型 | RAG |
|---|---|---|---|
| 知识更新 | 困难 | 中等 | 容易 |
| 幻觉问题 | 严重 | 中等 | 较少 |
| 可解释性 | 低 | 低 | 高 |
| 实现成本 | 低 | 高 | 中等 |
| 领域适配 | 困难 | 容易 | 容易 |
| 数据依赖 | 训练数据 | 领域数据 | 外部知识库 |
七、总结
RAG 核心要点
┌─────────────────────────────────────┐ │ RAG = 检索 + 生成 │ └─────────────────────────────────────┘ 主要流程: 1. 数据准备 → 分块 → 向量化 → 存储 2. 用户提问 → 向量化 → 检索 → 生成 核心优势: • 知识实时更新 • 减少幻觉 • 可解释性强 • 成本较低 适用场景: • 企业知识库 • 客户服务 • 文档问答 • 领域咨询快速记忆
RAG 就像开卷考试: • 考试时可以查阅资料(检索) • 基于资料回答问题(生成) • 比闭卷考试更准确(减少幻觉)RAG 是目前大语言模型应用中最实用的技术之一,它让 AI 能够利用外部知识,提供更准确、更可靠的回答!