📌 什么是 RAG
RAG = Retrieval (检索) + Augmented (增强) + Generation (生成)
核心思想
在 LLM 生成答案之前,先从外部知识库中检索相关文档,将检索结果作为上下文提供给 LLM,让答案基于真实文档而非仅靠训练数据。
| 优势 | 说明 |
|---|---|
| ✅ 减少幻觉 | 答案基于检索到的真实文档,不是模型编造的 |
| ✅ 可追溯 | 每个答案都有来源引用(页码/文档链接) |
| ✅ 知识可更新 | 无需重新训练,更新知识库即可 |
| ✅ 私有数据 | 本地文档,无需上传到模型厂商 |
| ✅ 成本可控 | 本地部署,按需调用 API |
🏗️ RAG 完整架构
📥 文档接入层
🔧 索引构建层
💾 向量数据库
⬇ ⬇ ⬇
🔍 查询处理层
⬇
✍️ 答案生成层
⬇
💬 用户界面层
| 层级 | 职责 | 技术组件 |
|---|---|---|
| 📥 文档接入层 | 解析 PDF/Word/Excel/PPT | PyMuPDF, python-docx, openpyxl |
| 🔧 索引构建层 | 文本分块、生成嵌入 | LangChain, m3e-base, PageIndex |
| 💾 向量数据库 | 存储向量,支持检索 | ChromaDB, FAISS, pgvector |
| 🔍 查询处理层 | 问题理解、混合检索 | BM25, RRF, 路由决策 |
| ✍️ 答案生成层 | LLM 调用、引用标注 | OpenAI API, 本地模型 |
| 💬 用户界面层 | Web/飞书/API | FastAPI, OpenClaw message |
📊 工作流程
索引构建 (离线)
1️⃣ 扫描文档目录
⬇
2️⃣ 解析文档内容
⬇
3️⃣ 文本分块
⬇
4️⃣ 生成向量嵌入
⬇
5️⃣ 存储到向量数据库
查询回答 (在线)
1️⃣ 接收用户问题
⬇
2️⃣ 向量 + 关键词检索
⬇
3️⃣ 混合重排序 (RRF)
⬇
4️⃣ 组装上下文
⬇
5️⃣ LLM 生成答案
⬇
6️⃣ 返回答案 + 引用
🔍 检索策略对比
纯向量检索
✅ 实现简单,语义匹配好
❌ 关键词匹配弱
混合检索 (推荐)
✅ 兼顾语义和关键词
❌ 实现复杂度稍高
推理式检索
✅ 适合长文档,可追溯页码
❌ 仅 PDF,需 OpenAI API
🛠️ 技术选型
| 场景 | 向量库 | 嵌入模型 | 检索策略 |
|---|---|---|---|
| 小规模 (<1000 文档) | ChromaDB | m3e-base | 混合检索 |
| 中等规模 (1000-10000) | FAISS/pgvector | bge-large-zh | 混合+RRF |
| 大规模 (>10000) | Pinecone/Milvus | 自定义微调 | 分层 + 缓存 |
| 长文档 (财报/法规) | PageIndex | GPT-4 | 推理式检索 |
🔗 OpenClaw 集成
# openclaw/rag_agent.py
from openclaw import sessions_spawn, message
from rag_engine import RAGEngine
rag = RAGEngine(vector_db_path="./vectors", embedding_model="m3e-base")
def handle_question(user_id, question):
context = rag.retrieve(question, top_k=5)
answer = rag.generate(question, context)
message(action="send", channel="feishu", to=user_id, message=answer)
📋 实施计划
Phase 1 (第 1-3 天): 基础 RAG
ChromaDB、文档解析、向量检索、LLM 生成
Phase 2 (第 4-5 天): 混合检索
BM25、RRF 重排序、查询改写
Phase 3 (第 6-7 天): PageIndex 集成
长 PDF 树状索引、路由决策
Phase 4 (第 8-10 天): OpenClaw 集成
子 agent、飞书消息、端到端测试
💡 最终建议
RAG 是整个知识问答系统的核心架构,之前讨论的 ChromaDB 和 PageIndex 都是 RAG 的检索组件。
推荐采用 混合架构:短文档用 ChromaDB 向量检索,长 PDF 用 PageIndex 推理式检索,通过路由层统一调度。