RAG 入门:检索增强生成基础
检索增强生成(Retrieval-Augmented Generation,简称 RAG)是一种将外部知识检索与大语言模型(LLM)生成能力相结合的技术架构。它让 AI 能够基于你自己的数据回答问题,解决了大模型"知识过时"和"缺乏领域专业度"的核心痛点。
为什么需要 RAG?
大语言模型虽然强大,但在实际应用中面临三个根本性限制:
1. 知识截止问题
大模型的训练数据有明确的时间截止点。以 GPT-4 为例,其训练数据截止于 2023 年,无法回答之后发生的事件。
用户:2024年奥运会开幕式的亮点是什么?
传统 LLM:我的训练数据截止于2023年,无法回答这个问题。
如果要获取最新信息,请...
RAG 系统:[检索最新新闻] 2024年巴黎奥运会开幕式在塞纳河上举行...
开幕式的亮点包括:运动员乘船入场、席琳·迪翁献唱...
2. 领域知识缺失
通用大模型缺乏特定领域的专业知识,如企业内部文档、医疗病例、法律条文等私有数据。
用户:我们公司的报销流程是怎样的?
传统 LLM:我不知道贵公司的具体报销流程,建议咨询人事部门...
RAG 系统:[检索公司内部文档] 根据员工手册第3章...
报销流程如下:1. 登录OA系统提交申请...
3. 幻觉问题
大模型可能"一本正经地胡说八道",生成看似合理但实际错误的信息。这在需要准确性的场景(医疗、法律、金融)中是不可接受的。
RAG 通过让模型基于检索到的真实文档生成回答,显著降低了幻觉风险,因为回答有了可追溯的来源。
RAG 如何工作?
RAG 的核心思想很简单:在生成回答之前,先从知识库中检索相关文档。
三个核心步骤
第一步:检索(Retrieval)
将用户问题转换为向量,在知识库中找到语义最相似的文档片段。
# 伪代码示例
question_embedding = embedding_model.encode("如何申请年假?")
relevant_docs = vector_db.search(question_embedding, top_k=5)
第二步:增强(Augmentation)
将检索到的文档作为上下文,与用户问题组合成完整的提示词。
# 伪代码示例
context = "\n\n".join([doc.content for doc in relevant_docs])
prompt = f"""
根据以下文档回答问题:
{context}
问题:如何申请年假?
"""
第三步:生成(Generation)
将增强后的提示词发送给大模型,生成最终回答。
# 伪代码示例
answer = llm.generate(prompt)
RAG vs 其他方案
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| RAG | 实时更新知识、可追溯来源、成本可控 | 检索质量依赖系统设计 | 企业知识库、客服问答、文档分析 |
| 微调(Fine-tuning) | 领域适应性强、推理更快 | 知识仍有截止、成本高、难更新 | 特定任务优化、风格迁移 |
| 长上下文 | 实现简单 | 成本高、有长度限制、难更新 | 小规模文档分析 |
| 提示工程 | 无需开发 | 信息量有限、易超出上下文 | 简单任务、原型验证 |
为什么不直接微调?
微调确实可以让模型学习领域知识,但它存在几个问题:
- 知识仍然会过时:微调后模型的知识也固定了,更新知识需要重新微调
- 成本高昂:高质量标注数据和计算资源成本很高
- 无法溯源:微调后的模型像"黑盒",无法告诉你答案来自哪里
- 易过拟合:可能在特定数据上过拟合,泛化能力下降
RAG 与微调不是互斥的,可以结合使用:RAG 负责动态知识检索,微调负责领域风格适应。
典型应用场景
企业知识库问答
员工可以通过自然语言查询公司内部文档、政策、流程。
员工:新员工入职需要办理哪些手续?
系统:根据《员工入职指南》,新员工需要:1. 提交身份证复印件...
智能客服
基于产品手册、FAQ、历史工单自动回答客户问题。
客户:我的订单显示已发货但还没收到,怎么办?
系统:根据您的订单号查询,包裹已到达北京转运中心...
法律文档分析
律师可以快速检索相关法条、案例、合同条款。
律师:股权转让协议中关于优先购买权的条款有哪些规定?
系统:根据《公司法》第71条和检索到的相关案例...
医疗辅助诊断
医生可以查询医学文献、临床指南、病例库。
医生:糖尿病肾病的早期诊断指标有哪些?
系统:根据《中国糖尿病防治指南》和最新文献...
学术研究
研究人员可以检索论文、数据集、实验方法。
研究员:Transformer架构在图像处理中有哪些应用?
系统:根据检索到的论文,主要应用包括...
RAG 系统的核心组件
一个完整的 RAG 系统包含以下核心组件:
┌─────────────────────────────────────────────────────────────────┐
│ RAG 系统架构 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 文档加载 │───▶│ 文档分块 │───▶│ 向量化 │ │
│ │ (Loaders) │ │ (Chunking) │ │ (Embedding) │ │
│ └─────────────┘ └─────────────┘ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ 向量数据库 │ │
│ │ (Vector DB) │ │
│ └──────┬──────┘ │
│ │ │
│ ┌─────────────┐ ┌─────────────┐ │ │
│ │ 用户问题 │───▶│ 问题向量化 │───────────┼───▶ 检索 │
│ └─────────────┘ └─────────────┘ │ │
│ │ │
│ ┌──────▼──────┐ │
│ │ 检索结果 │ │
│ │ + 重排序 │ │
│ └──────┬──────┘ │
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ LLM 生成 │ │
│ │ 回答 │ │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
数据处理管道
文档加载器:负责从各种来源(PDF、网页、数据库、API)加载原始文档。
文档分块器:将长文档切分成适当大小的片段,平衡语义完整性和检索精度。
嵌入模型:将文本转换为向量表示,捕捉语义信息。
存储与检索
向量数据库:存储文档向量,支持高效的相似度搜索。常用选择包括 Pinecone、Milvus、Weaviate、Qdrant 等。
检索策略:决定如何找到最相关的文档,包括向量检索、关键词检索、混合检索等。
生成与优化
大语言模型:基于检索结果生成最终回答。
重排序器:对初步检索结果进行精排,提高相关性。
学习路径
本教程按照由浅入深的顺序组织,建议按以下顺序学习:
基础篇
核心篇
进阶篇
参考篇
- 速查表:常用代码片段、配置模板、问题排查指南
技术栈概览
构建 RAG 系统常用的技术栈:
| 组件 | 常用工具 |
|---|---|
| 开发框架 | LangChain、LlamaIndex、Haystack |
| 嵌入模型 | OpenAI text-embedding-3、BGE、Cohere、Voyage |
| 向量数据库 | Pinecone、Milvus、Weaviate、Qdrant、Chroma |
| 重排序模型 | Cohere Rerank、BGE Reranker、ColBERT |
| 大语言模型 | OpenAI GPT-4、Claude、Llama、Qwen |
| 文档处理 | Unstructured、PyPDF、Apache Tika |
准备工作
在开始学习之前,建议你:
- 掌握 Python 基础:RAG 系统主要使用 Python 开发
- 了解大模型基础:理解 LLM 的基本原理和 API 调用方式
- 熟悉向量概念:理解向量和相似度计算的基本概念
- 准备开发环境:安装 Python 3.10+,配置虚拟环境
# 创建虚拟环境
python -m venv rag-env
source rag-env/bin/activate # Linux/Mac
# rag-env\Scripts\activate # Windows
# 安装基础依赖
pip install langchain langchain-openai chromadb
小结
RAG 是连接大模型与外部知识的桥梁,它让 AI 应用能够:
- 访问最新的、特定的知识
- 提供可追溯的信息来源
- 降低幻觉风险
- 以较低成本实现知识更新
在接下来的章节中,我们将深入每个组件的实现细节,帮助你构建生产级的 RAG 系统。