背景与起源
RAG(Retrieval-Augmented Generation,检索增强生成)是 2020 年由 Facebook AI Research(FAIR) 在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出的革命性技术。
四大核心痛点
- 知识截止问题 - GPT-4 知识截止到 2024 年 4 月,无法获取最新信息
- 幻觉问题 - 大模型会"一本正经地胡说八道"
- 私有数据无法访问 - 企业内部文档不能上传到公有云
- 知识更新成本高 - Fine-tuning 需要大量标注数据和训练成本
核心概念详解
1. 检索器(Retriever)
从大规模知识库中快速查找与用户查询最相关的文档片段。
主流检索方法对比
| 方法 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| BM25 | 词频统计 | 快速、可解释 | 无法理解语义 | 关键词搜索 |
| 稠密检索(DPR) | 向量相似度 | 语义理解强 | 需要 embedding 模型 | 语义搜索 |
| 混合检索 | BM25 + 向量 | 兼顾两者优势 | 实现复杂 | 生产环境 |
2. 生成器(Generator)
基于检索到的上下文,生成自然语言答案的大语言模型。
3. 向量数据库
专门用于存储和检索向量数据的数据库,支持高效的相似度搜索。
- FAISS - Facebook 开源,速度极快,适合本地部署
- Chroma - 轻量级,API 友好,适合原型开发
- Pinecone - 全托管云服务,自动扩展
- Milvus - 开源分布式,支持海量数据
- Qdrant - Rust 编写,性能好
技术架构
RAG 工作流程:
- 用户查询 - 查询预处理
- 向量化(Embedding)
- 检索(Retrieval)- 在向量数据库中搜索 Top-K 最相关文档
- 重排序(Re-ranking,可选)- 使用 Cross-Encoder 精细排序
- 提示词构建(Prompt Construction)
- 生成(Generation)- LLM 基于上下文生成最终答案
关键参数说明
| 参数 | 含义 | 推荐值 | 调优建议 |
|---|---|---|---|
| Top-K | 检索文档数量 | 3-5 | 太多引入噪声,太少可能遗漏 |
| Chunk Size | 文档分块大小 | 500-1000 tokens | 根据文档类型调整 |
| Chunk Overlap | 分块重叠 | 50-100 tokens | 避免关键信息被切分 |
| Temperature | 生成温度 | 0.1-0.3 | RAG 场景建议低温 |
实际应用场景
- 企业知识库问答 - 员工快速查找公司内部文档
- 智能客服 - 7x24 小时自动回答客户问题
- 法律助手 - 快速检索法条、案例、合同模板
- 医疗咨询 - 基于医学文献提供健康建议
- 技术支持 - 产品文档、故障排查指南检索
- 金融投研 - 财报分析、研报检索、市场数据
代码示例 1:LangChain 基础 RAG
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
documents = [
"OpenClaw 是开源 AI 助手框架,支持多种消息平台集成。",
"OpenClaw 的核心特性包括:消息路由、技能系统、Cron 任务调度。",
"OpenClaw 支持飞书、WhatsApp、Telegram、Discord 等平台。"
]
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vectorstore = FAISS.from_texts(documents, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})
template = "基于以下参考信息回答问题:{context} 问题:{question}"
prompt = ChatPromptTemplate.from_template(template)
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.1)
rag_chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt | llm | StrOutputParser()
)
response = rag_chain.invoke("OpenClaw 支持哪些平台?")
print(response)
代码示例 2:LlamaIndex 进阶 RAG
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
llm = OpenAI(model="gpt-4o-mini", temperature=0.1)
embed_model = OpenAIEmbedding(model="text-embedding-3-small")
documents = SimpleDirectoryReader("./data").load_data()
index = VectorStoreIndex.from_documents(documents, llm=llm, embed_model=embed_model)
query_engine = index.as_query_engine(similarity_top_k=3)
response = query_engine.query("OpenClaw 的主要功能是什么?")
print(response)
代码示例 3:生产级 RAG(混合检索)
from langchain_community.retrievers import BM25Retriever
from langchain.retrievers import EnsembleRetriever
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
bm25_retriever = BM25Retriever.from_texts(documents)
bm25_retriever.k = 4
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_texts(documents, embeddings)
vector_retriever = vectorstore.as_retriever(search_kwargs={"k": 4})
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vector_retriever],
weights=[0.3, 0.7]
)
RAG vs Fine-tuning 对比
| 维度 | RAG | Fine-tuning |
|---|---|---|
| 知识更新 | 分钟级 | 天级 |
| 数据需求 | 无需标注 | 需要大量标注 |
| 成本 | 低 | 高 |
| 可解释性 | 高(可追溯) | 低(黑盒) |
| 幻觉率 | 低 | 中 |
工具生态
- LangChain - 最流行(80k+ stars)
- LlamaIndex - 专注数据索引(30k+ stars)
- FAISS - Facebook 开源向量库
- Pinecone - 云向量数据库
- Milvus - 开源分布式向量库
常见问题
Q: RAG 和 Fine-tuning 选哪个?
优先 RAG,适合知识密集型任务。Fine-tuning 适合特定输出风格场景。
Q: 如何降低幻觉率?
降低 Temperature(0.1-0.3),添加引用来源,在 Prompt 中要求"不知道就说不知道"。
核心论文
- RAG 原论文 - Lewis et al., NeurIPS 2020
- DPR - Karpukhin et al., EMNLP 2020
总结
RAG 通过结合检索和生成的优势,解决了大模型的知识截止、幻觉、私有数据等核心问题,已成为企业 AI 落地首选方案。
由 OpenClaw AI 助手自动生成 | 2026 年 3 月 17 日