检索增强生成:知识库+LLM的强强联合
RAG(Retrieval-Augmented Generation,检索增强生成)是当前最重要的大语言模型应用技术之一。 它通过结合外部知识库检索和大语言模型生成能力,有效解决了模型知识过时、幻觉等问题。 本讲将深入讲解RAG的核心原理、关键技术和实践应用, 帮助你掌握构建智能问答系统、知识助手等应用的核心能力。
RAG(Retrieval-Augmented Generation)是一种将信息检索与文本生成相结合的技术框架。 在生成回答之前,系统先从外部知识库中检索相关信息,然后将这些信息作为上下文提供给大语言模型, 引导模型生成更准确、更可靠的答案。
RAG解决的核心问题
模型训练后无法获取最新信息,RAG通过实时检索解决
基于检索到的真实文档生成,减少凭空编造
通过企业/专业知识库补充模型不具备的领域知识
可以追溯答案来源,提高透明度和可信度
RAG系统的工作流程包括离线索引构建和在线查询响应两个阶段。 理解这两个阶段的工作原理是掌握RAG技术的关键。
文档加载
从各种来源(PDF、网页、数据库等)加载文档数据
文档分块(Chunking)
将长文档切分为适合检索和处理的小块(通常200-1000 tokens)
向量化(Embedding)
使用Embedding模型将每个文档块转换为高维向量(如768维)
索引存储
将向量存储到向量数据库(如Pinecone、Weaviate、Chroma)中,建立索引
问题向量化
将用户问题转换为向量(使用与文档相同的Embedding模型)
相似度检索
在向量数据库中查找与问题向量最相似的Top-K个文档块
重排序(可选)
使用更精细的模型对检索结果重新排序,提高相关性
上下文构建
将检索到的文档块和用户问题组合成完整的提示词
生成答案
大语言模型基于检索到的上下文生成答案
💡流程示意
长文档难以直接检索和使用。通过分块,我们可以更精确地定位相关信息, 同时避免上下文窗口过大的问题。合理的分块策略对RAG效果至关重要。
分块策略
按固定字符数或token数切分
✅ 简单高效
⚠️ 可能破坏语义完整性
按段落、章节等语义单元切分
✅ 保持语义完整
⚠️ 块大小不均匀
相邻块之间有部分重叠(如20%)
✅ 避免信息断裂
⚠️ 增加存储成本
结合摘要和细节的多层次分块
✅ 支持粗细粒度检索
⚠️ 实现复杂
💡分块大小选择建议
向量检索是RAG的核心技术。通过将文本转换为语义向量, 我们可以基于语义相似度(而非关键词匹配)找到最相关的信息。
Embedding模型
常用Embedding模型
相似度计算方法
最常用,计算两个向量的夹角
范围:[-1, 1]
1 = 完全相同
0 = 无关
-1 = 完全相反
计算向量之间的直线距离
距离越小,相似度越高
适合低维空间
向量的内积计算
计算速度快
需要向量归一化
⚡向量数据库
为了快速检索百万级甚至十亿级的向量,需要专门的向量数据库:
云服务
Pinecone, Weaviate Cloud, Qdrant Cloud
开源自部署
Chroma, Milvus, Faiss, Qdrant
RAG和微调是两种不同的模型定制方法。理解它们的差异,有助于根据需求选择合适的技术方案。
| 维度 | RAG | 微调(Fine-tuning) |
|---|---|---|
| 目标 | 增加外部知识 | 改变模型行为和风格 |
| 知识更新 | ✅ 实时更新,只需更新知识库 | ❌ 需要重新训练 |
| 成本 | 💰 较低(存储+检索成本) | 💰💰💰 高(GPU训练成本) |
| 技术门槛 | ⭐⭐ 中等 | ⭐⭐⭐⭐ 高 |
| 透明度 | ✅ 高,可以看到引用来源 | ❌ 低,知识融入模型内部 |
| 适用场景 | • 企业知识库问答 • 实时信息查询 • 需要可溯源的应用 • 频繁知识更新 | • 特定风格模仿 • 任务格式优化 • 领域语言适配 • 指令遵循改进 |
| 优点 | • 灵活、易更新 • 可溯源、可解释 • 成本低 • 无需GPU训练 | • 深度定制 • 风格一致性强 • 无需外部系统 • 响应速度快 |
| 缺点 | • 依赖检索质量 • 增加延迟 • 难以改变模型风格 | • 成本高昂 • 技术复杂 • 知识更新困难 • 可能过拟合 |
💡组合使用
RAG和微调并非互斥,可以组合使用:
先微调模型以适应特定领域和风格,然后使用RAG补充最新知识和细节信息。 这种组合能够发挥两种技术的优势。
基础的RAG系统容易实现,但要达到生产级别的效果,需要在多个环节进行优化。
混合检索
结合向量检索(语义)和关键词检索(精确匹配),如BM25 + 向量
查询重写
用LLM改写用户问题,生成更适合检索的查询
多查询策略
生成多个相关查询,合并检索结果
重排序模型
使用Cross-Encoder对初步结果精确排序
上下文压缩
提取检索文档的关键信息,减少噪音和token消耗
动态Top-K
根据问题复杂度和检索质量动态调整返回文档数量
元数据过滤
基于时间、来源、类型等元数据预过滤文档
上下文排序
将最相关的内容放在提示词的显著位置
提示词工程
设计高质量的提示词模板,引导模型更好地利用检索内容
引用标注
要求模型在答案中标注信息来源,提高可信度
事实验证
生成后验证答案是否与检索内容一致
答案融合
从多个文档片段中综合信息,生成完整答案
缓存策略
缓存常见问题的检索结果和答案
批处理
批量处理Embedding和检索请求
索引优化
使用HNSW、IVF等高效索引算法
异步处理
并行执行检索和生成的准备工作
基于企业内部文档(政策、流程、技术文档)回答员工问题
典型应用:HR助手、IT支持机器人、客服系统
结合医疗、法律、金融等专业知识库,提供专业咨询
典型应用:医疗诊断辅助、法律文书检索、投资分析
检索最新新闻、市场数据、研究报告等时效性信息
典型应用:新闻摘要、市场分析、竞品监控
基于教材、课件、习题库回答学生问题,提供个性化学习支持
典型应用:智能教学助手、考试辅导、知识点解答
检索API文档、代码示例,帮助开发者解决编程问题
典型应用:代码生成助手、API查询、调试帮助
从海量论文中检索相关研究,生成文献综述和研究建议
典型应用:论文推荐、文献综述、研究方向探索
检索+增强+生成的三阶段流程,解决知识过时和幻觉问题
文档分块、向量化、相似度检索是RAG的技术基础
RAG适用于需要外部知识和实时更新的各类应用场景
完整的讲义PDF,包含所有图表和详细内容