RAG 检索增强生成
定义
世界上有一种技术叫做RAG,它就像AI的私人图书馆——每次你要找资料,它都会递给你那本最对味的书...
RAG(Retrieval-Augmented Generation,检索增强生成)是一种结合检索和生成的AI架构,先从外部知识库检索相关信息,再将检索结果作为上下文输入大模型生成答案。
核心原理
1. RAG流程
用户问题
↓
┌─────────────┐
│ Embedding │ ← 问题向量化
└──────┬──────┘
↓
┌─────────────┐
│ 向量检索 │ ← 在知识库中找相似内容
└──────┬──────┘
↓
┌─────────────┐
│ 上下文构建 │ ← 问题 + 检索结果
└──────┬──────┘
↓
┌─────────────┐
│ LLM生成 │ ← 基于上下文生成答案
└──────┬──────┘
↓
最终答案
2. 核心组件
| 组件 | 功能 | 常用技术 |
|---|---|---|
| 文档处理 | 分块、清洗文档 | LangChain, LlamaIndex |
| Embedding模型 | 文本向量化 | OpenAI, Cohere, 本地模型 |
| 向量数据库 | 存储和检索向量 | Pinecone, Milvus, Chroma |
| 检索器 | 相似度搜索 | 余弦相似度, BM25混合 |
| 生成器 | 生成答案 | GPT, Claude, 本地LLM |
3. 检索策略
- 语义检索:基于向量相似度
- 关键词检索:BM25等传统方法
- 混合检索:结合语义+关键词
- 重排序:对检索结果二次排序
- 多跳检索:迭代检索获取更多信息
4. Chunk策略
固定大小分块: 每500字符一块
语义分块: 按段落/章节分块
滑动窗口: 有重叠的分块
递归分块: 先按章节,再按段落
OpenClaw实战应用
OpenClaw知识库能力
OpenClaw通过SKILL.md加载知识作为上下文:
# SKILL.md - 企业知识助手
## 知识库
用户提问时,优先从以下来源检索:
- 飞书文档库
- 企业Wiki
- 产品文档
## 检索策略
1. 先用关键词过滤
2. 再用语义相似度排序
3. 取Top 5相关片段
4. 整合生成答案
案例:智能客服
用户: "退货流程是什么?"
1. 问题向量化: [0.12, -0.34, 0.56, ...]
2. 向量检索: 找到相似FAQ文档
- 匹配: "退货政策.pdf" (相似度 0.89)
- 匹配: "售后服务说明.pdf" (相似度 0.82)
3. 构建上下文:
问题: 退货流程是什么?
相关文档: [退货政策片段] [售后服务片段]
4. LLM生成: 基于文档详细解答
OpenClaw工具支持
feishu_wiki: 搜索飞书知识库
feishu_doc: 读取飞书文档内容
web_fetch: 获取网页内容
feishu_bitable: 查询多维表格数据
代码示例
基础RAG实现
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQA
# 1. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=documents,
embedding=embeddings
)
# 2. 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity",
search_kwargs={"k": 5}
)
# 3. 创建RAG链
qa_chain = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="gpt-4"),
retriever=retriever,
return_source_documents=True
)
# 4. 提问
result = qa_chain({"query": "产品保修期多久?"})
print(result["result"])
高级RAG:混合检索+重排序
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
# 语义检索
semantic_retriever = vectorstore.as_retriever(k=10)
# 关键词检索
bm25_retriever = BM25Retriever.from_documents(documents)
bm25_retriever.k = 10
# 混合检索
ensemble_retriever = EnsembleRetriever(
retrievers=[semantic_retriever, bm25_retriever],
weights=[0.5, 0.5]
)
# 重排序
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import CohereRerank
compressor = CohereRerank()
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=ensemble_retriever
)
进阶技术
RAG优化方向
- Query改写:优化用户问题提高检索质量
- 假设文档:生成假设答案辅助检索
- 多跳推理:迭代检索复杂问题
- 上下文压缩:减少噪音信息
- 引用溯源:标注答案来源
最佳实践
- ✅ 文档预处理:清洗、去重、标准化
- ✅ 合理分块:根据文档类型选择策略
- ✅ 元数据过滤:利用时间、分类等筛选
- ✅ 监控检索质量:记录检索命中率
- ✅ 定期更新:保持知识库新鲜度
- ❌ 避免过度检索:过多的上下文影响生成