RAG(检索增强生成)完全指南:2026年如何让 AI 引用你自己的数据
通用大模型的缺点是"不知道你的内部数据"。RAG(Retrieval-Augmented Generation,检索增强生成)解决了这个问题:让 AI 在回答时先检索你的知识库,再结合检索结果生成答案。本文详解 2026 年 RAG 的最佳实践。
💡 RAG 核心流程:你的文档 → 向量化 → 存入向量数据库 → 用户提问时检索相关片段 → 拼接进 Prompt → AI 结合检索结果回答。
RAG 完整流程图
| 步骤 | 操作 | 工具举例 |
|---|---|---|
| 1. 文档处理 | PDF/Word/Markdown 切分 | LangChain, Unstructured |
| 2. 向量化 | Text → Vector | OpenAI Embeddings, BGE |
| 3. 存储 | 向量数据库 | ChromaDB, FAISS, Milvus |
| 4. 检索 | 相似度搜索 | 向量数据库查询 |
| 5. 生成 | 结合检索结果回答 | GPT-4o, Claude |
向量数据库选型
| 数据库 | 类型 | 适用场景 | 优点 |
|---|---|---|---|
| ChromaDB | 轻量嵌入式 | 个人/小项目 | 简单,Python 原生 |
| FAISS | 本地向量索引 | 离线大批量 | Meta 开源,速度快 |
| Milvus | 分布式向量数据库 | 企业级生产 | 支持亿级向量 |
| Pinecone | 云原生 | SaaS 场景 | 免运维 |
完整 RAG 实现(Python)
# 1. 安装依赖
# pip install langchain langchain-community chromadb openai
from langchain.document_loaders import DirectoryLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatAnthropic
from langchain.chains import RetrievalQA
# 2. 加载文档
loader = DirectoryLoader("./docs", glob="**/*.md")
docs = loader.load()
# 3. 切分文本
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)
# 4. 向量化并存入 ChromaDB
embeddings = OpenAIEmbeddings(
openai_api_key="sk-holysheep-xxx",
openai_api_base="https://api.holysheep.ai/v1"
)
db = Chroma.from_documents(chunks, embeddings)
# 5. 构建检索链
qa = RetrievalQA.from_chain_type(
llm=ChatAnthropic(
model="claude-3-5-sonnet-20241022",
anthropic_api_key="sk-holysheep-xxx",
base_url="https://api.holysheep.ai/v1"
),
chain_type="stuff",
retriever=db.as_retriever()
)
# 6. 提问
query = "我们公司的退款政策是什么?"
result = qa.run(query)
print(result)
Embedding 模型选择
| 模型 | 维度 | 价格 | 适用语言 |
|---|---|---|---|
| text-embedding-3-large | 3072 | ¥4.5/1M | 多语言 |
| text-embedding-3-small | 1536 | ¥0.13/1M | 多语言 |
| BGE-large-zh | 1024 | 免费(本地) | 中文优先 |
RAG 常见问题
Q:Chunk 大小多少合适?
A:一般 500-1000 字符,代码可以更小(200-500),长文档分析可以更大(1000-2000)。
Q:检索不到相关内容怎么办?
A:调整 chunk_overlap(增加重叠),尝试混合检索(关键词+向量),或增加 top_k 参数。
Q:如何提升检索质量?
A:使用 rerank 模型对检索结果重新排序,或使用多路召回(Hybrid search)。