目录
摘要:检索增强生成(RAG)是解决大语言模型知识滞后、幻觉问题的核心技术。本文将从 RAG 原理出发,深入讲解架构设计、核心组件、实战代码及生产优化,帮助读者构建企业级 RAG 系统。
关键词:LLM、RAG、向量数据库、检索增强生成、LangChain、大模型应用
📌 一、为什么需要 RAG?
1.1 大模型的三大痛点
┌─────────────────────────────────────────────────────────────────┐
│ 大语言模型的固有局限 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 🔴 知识截止 │
│ 预训练数据有截止时间,无法获取最新信息 │
│ 例:GPT-4 知识截止到 2024 年,不知道 2025 年的新闻 │
│ │
│ 🔴 幻觉问题 │
│ 模型会"一本正经地胡说八道",编造不存在的事实 │
│ 例:编造法律条文、医学建议、引用不存在的论文 │
│ │
│ 🔴 私有知识缺失 │
│ 无法访问企业内部文档、个人数据、专有信息 │
│ 例:公司制度、产品手册、客户数据 │
│ │
└─────────────────────────────────────────────────────────────────┘
1.2 RAG:让大模型"开卷考试"
核心思想:在回答问题前,先从外部知识库检索相关信息,再将检索结果作为上下文提供给大模型。
┌─────────────────────────────────────────────────────────────────┐
│ │
│ 闭卷考试 (纯 LLM) vs 开卷考试 (RAG) │
│ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 用户问题 │ │ 用户问题 │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ 向量检索 │ ← 外部知识库 │ 向量检索 │ │
│ │ │ │ │ │
│ │ │ │ ┌───────┐ │ │
│ │ │ │ │相关文档│ │ │
│ │ │ │ └───────┘ │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ LLM │ │ LLM │ │
│ │ (幻觉) │ │ (有依据) │ │
│ └──────┬──────┘ └──────┬──────┘ │
│ │ │ │
│ ▼ ▼ │
│ ❌ 可能编造答案 ✅ 基于检索内容回答 │
│ │
└─────────────────────────────────────────────────────────────────┘
1.3 RAG vs 微调 vs 提示工程
| 方案 | 适用场景 | 知识更新 | 成本 | 效果 |
|---|---|---|---|---|
| 提示工程 | 简单任务,通用知识 | 实时 | 低 | ⭐⭐ |
| 微调 | 任务适配,风格对齐 | 需重新训练 | 中 | ⭐⭐⭐ |
| RAG | 知识问答,私有数据 | 实时更新 | 低 | ⭐⭐⭐⭐ |
最佳实践:RAG + 微调组合使用
- RAG 负责知识注入(动态、可更新)
- 微调负责任务适配(格式、风格、领域术语)
📌 二、RAG 核心原理
2.1 RAG 工作流程
┌──────────────────────────────────────────────────────────────────────────┐
│ RAG 完整工作流程 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 用户提问 │ → │ 查询理解 │ → │ 向量检索 │ → │ 结果排序 │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Top-K 文档 │ │
│ │ └──────┬───────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────────┐ │
│ │ │ Prompt │ │
│ │ │ 组装上下文 │ │
│ │ └──────┬───────┘ │
│ │ │ │
│ ▼ ▼ │
│ ┌──────────┐ ┌──────────┐ ┌──────────────┐ │
│ │ 最终回答 │ ← │ 答案生成 │ ← │ LLM 推理 │ │
│ └──────────┘ └──────────┘ └──────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────┘
2.2 核心组件
(1)文档处理管道
原始文档 → 文本提取 → 分块 (Chunking) → 向量化 (Embedding) → 存储
(2)检索器 (Retriever)
- 稠密检索:向量相似度搜索(主流)
- 稀疏检索:BM25 关键词匹配
- 混合检索:向量 + 关键词,效果最佳
(3)生成器 (Generator)
- 大语言模型(GPT-4、Claude、Llama 等)
- 接收:用户问题 + 检索到的上下文
- 输出:基于上下文的回答
2.3 向量相似度计算
| 相似度度量 | 公式 | 特点 |
|---|---|---|
| 余弦相似度 | cos(θ) = A·B / (‖A‖‖B‖) | 最常用,范围 [-1, 1] |
| 点积 | A·B | 计算快,需归一化 |
| 欧氏距离 | ‖A - B‖² | 几何距离,越小越相似 |
| 曼哈顿距离 | Σ | Ai - Bi |
📌 三、RAG 系统架构设计
3.1 基础架构
┌─────────────────────────────────────────────────────────────────┐
│ RAG 系统架构 │
│ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 应用层 (Application) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ Web 界面 │ │ API 服务 │ │ ChatBot │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 编排层 (Orchestration) │ │
│ │ ┌───────────────────────────────────────────────────┐ │ │
│ │ │ LangChain / LlamaIndex / 自研框架 │ │ │
│ │ │ - Query 改写 - 检索策略 - Prompt 管理 - 缓存 │ │ │
│ │ └───────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │ │
│ ┌───────────────┴───────────────┐ │
│ ▼ ▼ │
│ ┌─────────────────────┐ ┌─────────────────────┐ │
│ │ 检索层 (Retrieval) │ │ 生成层 (Generation)│ │
│ │ ┌───────────────┐ │ │ ┌───────────────┐ │ │
│ │ │ 向量数据库 │ │ │ │ LLM 服务 │ │ │
│ │ │ - Milvus │ │ │ │ - OpenAI │ │ │
│ │ │ - Pinecone │ │ │ │ - Claude │ │ │
│ │ │ - Qdrant │ │ │ │ - Llama │ │ │
│ │ │ - Chroma │ │ │ │ - 本地部署 │ │ │
│ │ └───────────────┘ │ │ └───────────────┘ │ │
│ │ ┌───────────────┐ │ │ │ │
│ │ │ Embedding │ │ │ │ │
│ │ │ - text-embedding│ │ │ │ │
│ │ │ - m3e │ │ │ │ │
│ │ │ - bge │ │ │ │ │
│ │ └───────────────┘ │ │ │ │
│ └─────────────────────┘ └─────────────────────┘ │
│ │ │
│ ▼ │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 数据层 (Data Layer) │ │
│ │ ┌───────────┐ ┌───────────┐ ┌───────────┐ │ │
│ │ │ PDF/Word │ │ 网页爬取 │ │ 数据库 │ │ │
│ │ └───────────┘ └───────────┘ └───────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
3.2 数据流向
用户提问
│
▼
┌─────────────────┐
│ Query 预处理 │ ← 拼写纠正、同义扩展、查询改写
└────────┬────────┘
│
▼
┌─────────────────┐
│ 向量化 (Embedding)│
└────────┬────────┘
│
▼
┌─────────────────┐
│ 向量数据库检索 │ ← 返回 Top-K 相似文档块
└────────┬────────┘
│
▼
┌─────────────────┐
│ 结果重排序 │ ← Cross-Encoder 精排
└────────┬────────┘
│
▼
┌─────────────────┐
│ Prompt 组装 │ ← 系统提示 + 上下文 + 用户问题
└────────┬────────┘
│
▼
┌─────────────────┐
│ LLM 生成答案 │
└────────┬────────┘
│
▼
返回给用户
📌 四、技术选型指南
4.1 向量数据库对比
| 数据库 | 类型 | 规模 | 延迟 | 特点 | 适用场景 |
|---|---|---|---|---|---|
| Chroma | 内存/本地 | <100 万 | 低 | 轻量、易上手 | 原型开发、小规模 |
| Qdrant | 服务化 | <1000 万 | 低 | Rust 编写、性能好 | 中小规模生产 |
| Milvus | 服务化 | 亿级 | 中 | 功能全、生态好 | 大规模生产 |
| Pinecone | SaaS | 亿级 | 低 | 托管服务、免运维 | 快速上线 |
| Weaviate | 服务化 | 千万级 | 中 | 支持混合检索 | 通用场景 |
| Elasticsearch | 搜索引擎 | 亿级 | 中 | 关键词 + 向量 | 混合检索 |
4.2 Embedding 模型对比
| 模型 | 维度 | 语言 | 效果 (MTEB) | 速度 | 推荐场景 |
|---|---|---|---|---|---|
| text-embedding-3-large | 3072 | 多语言 | 64.6 | 中 | 效果优先 |
| text-embedding-3-small | 1536 | 多语言 | 62.3 | 快 | 性价比 |
| bge-large-zh-v1.5 | 1024 | 中文 | 64.0 | 中 | 中文场景 |
| m3e-base | 768 | 中文 | 63.2 | 快 | 中文轻量 |
| jina-embeddings-v2 | 1024 | 多语言 | 62.8 | 快 | 多语言 |
4.3 框架对比
| 框架 | 语言 | 学习曲线 | 功能 | 社区 | 推荐度 |
|---|---|---|---|---|---|
| LangChain | Python/JS | 中 | 全面 | 活跃 | ⭐⭐⭐⭐ |
| LlamaIndex | Python | 中 | RAG 专精 | 活跃 | ⭐⭐⭐⭐⭐ |
| Haystack | Python | 中 | 生产级 | 稳定 | ⭐⭐⭐ |
| Dify | 低代码 | 低 | 可视化 | 新兴 | ⭐⭐⭐⭐ |
📌 五、实战:构建 RAG 系统
5.1 环境准备
# 基础依赖
pip install langchain langchain-community langchain-openai
pip install chromadb sentence-transformers
pip install pypdf python-docx beautifulsoup4
# 可选:高级功能
pip install langchain-chroma langchain-text-splitters
pip install rank-bm25 # 混合检索
pip install fastapi uvicorn # API 服务
5.2 最小可行 RAG(100 行代码)
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
import os
# 配置 API Key
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 1. 加载文档
loader = PyPDFLoader("company_handbook.pdf")
documents = loader.load()
# 2. 文本分块
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", "!", "?", " ", ""]
)
chunks = text_splitter.split_documents(documents)
# 3. 创建向量存储
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 4. 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={
"k": 3} # 返回 3 个最相关文档
)
# 5. 创建问答链
llm = ChatOpenAI(model="gpt-4o", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
return_source_documents=True
)
# 6. 提问
query = "公司的年假政策是什么?"
result = qa_chain.invoke({
"query": query})
print(f"问题:{
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/dongdeaiziji/article/details/158542140



