RAG检索增强生成入门:让大模型拥有你的私有知识库
大模型很强大,但也有”硬伤”
ChatGPT、DeepSeek等大模型让人惊艳,但用多了你会发现三个致命问题:幻觉(一本正经地胡说八道)、知识截止(训练数据有时间限制,不知道最近的事)、无法访问私有数据(你公司的内部文档、个人笔记,模型从未见过)。直接问大模型”我们公司的报销流程是什么”,它只能编一个看似合理的答案。
有没有办法让大模型”开卷考试”,根据真实文档来回答?这就是RAG检索增强生成要解决的问题。如果你还不熟悉大模型的基本用法,建议先看看 DeepSeek使用教程 和 Prompt Engineering实战。
RAG是什么?一个通俗的比喻
想象一场考试:闭卷考试靠死记硬背,容易记错(这就是纯大模型的状态);而开卷考试允许你翻书,答案来自书本,准确率大大提升。
RAG(Retrieval-Augmented Generation)就是给大模型”开卷考试”的能力。 它的工作方式是:用户提问→系统从知识库中检索相关文档片段→把检索结果和问题一起交给大模型→大模型基于真实材料生成回答。
这样一来,大模型不再凭记忆”编造”,而是基于你提供的文档”引用作答”,幻觉问题大幅减少。这就是 rag检索增强生成 的核心思想。
RAG工作原理:三步搞定

RAG的整体流程分为三步:
第一步:文档切分。 把你的PDF、Markdown、网页等文档切成小段(chunk),每段通常500-1000字。太长检索不精准,太短缺少上下文。
第二步:向量化存储。 用Embedding模型把每段文字转换成一组数字(向量),存入向量数据库。语义相近的文字,向量也相近,这样就能实现”语义搜索”而不是简单的关键词匹配。
第三步:检索+生成。 用户提问时,同样把问题向量化,在数据库中找到最相似的文档片段,然后连同问题一起发送给大模型生成最终回答。
环境准备
安装所需依赖,只需三条命令:
pip install langchain langchain-community langchain-openai
pip install chromadb
pip install pypdf unstructured
我们选用LangChain框架和Chroma向量数据库。如果想用本地大模型替代OpenAI,可以参考 大模型本地部署教程 搭建Ollama环境。
实战:搭建个人文档问答系统
下面用一个完整例子,手把手搭建一个能回答你私有文档问题的RAG系统。
Step 1: 加载文档
from langchain_community.document_loaders import PyPDFLoader, DirectoryLoader
# 加载单个PDF
loader = PyPDFLoader("my_docs/产品手册.pdf")
docs = loader.load()
# 或批量加载目录下所有Markdown文件
loader = DirectoryLoader("my_docs/", glob="**/*.md")
docs = loader.load()
Step 2: 文档切分
from langchain.text_splitter import RecursiveCharacterTextSplitter
splitter = RecursiveCharacterTextSplitter(
chunk_size=800, # 每段800字符,推荐500-1000
chunk_overlap=100, # 段间重叠100字符,防止切断语义
separators=["\n\n", "\n", "。", ",", " "]
)
chunks = splitter.split_documents(docs)
配置建议: 中文文档chunk_size建议600-1000,overlap占chunk_size的10%-15%。技术文档可以适当增大chunk_size以保留完整上下文。
Step 3: 向量化
from langchain_openai import OpenAIEmbeddings
# 使用OpenAI的Embedding模型
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
# 如果想用本地模型,可以用HuggingFace
# from langchain_community.embeddings import HuggingFaceBgeEmbeddings
# embeddings = HuggingFaceBgeEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
Step 4: 存入向量数据库
from langchain_community.vectorstores import Chroma
vectorstore = Chroma.from_documents(
documents=chunks,
embedding=embeddings,
persist_directory="./chroma_db" # 持久化到本地
)
Step 5: 检索+生成
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
return_source_documents=True
)
# 提问!
result = qa_chain.invoke({"query": "产品的退款政策是什么?"})
print(result["result"])
print("参考来源:", result["source_documents"])
以上就是一个完整的RAG知识库搭建流程。如果你想进一步构建更智能的AI助手,可以结合 AI Agent入门指南 让Agent自主决定何时检索知识库。
向量数据库对比选型
选对向量数据库很关键,以下是主流方案对比:
| 数据库 | 特点 | 适用场景 | 部署方式 | 学习成本 |
|---|---|---|---|---|
| Chroma | 轻量嵌入式,零配置 | 入门学习、原型验证 | 本地嵌入 | ⭐ 最低 |
| Milvus | 高性能,支持十亿级向量 | 中大型生产项目 | Docker/K8s | ⭐⭐⭐ |
| Qdrant | Rust实现,速度快,过滤灵活 | 中小项目 | Docker/云 | ⭐⭐ |
| Pinecone | 全托管云服务,无需运维 | 企业级、快速上线 | 纯云 | ⭐⭐ |
| Weaviate | 内置向量化,支持多模态 | 复杂搜索场景 | Docker/云 | ⭐⭐⭐ |
个人学习和小型知识库搭建,Chroma完全够用。项目上线后可以平滑迁移到Milvus或Qdrant。
优化技巧:让RAG更好用
掌握了基础之后,以下几个优化技巧能显著提升效果:
1. 优化切分策略。 按语义而非固定字数切分。可以用Markdown的标题层级作为天然分隔符,或者用LangChain的MarkdownHeaderTextSplitter。
2. 混合检索。 同时使用向量检索(语义匹配)和关键词检索(BM25精确匹配),两者结合覆盖面更广。
3. 重排序(Reranking)。 检索返回的top-k结果,用Cross-Encoder模型重新排序,把最相关的排到最前面,效果提升明显。
4. 优化Prompt。 在System Prompt中明确指示模型”仅基于提供的上下文回答,如果找不到答案就说不知道”,有效减少幻觉。更多Prompt技巧可以参考 Prompt Engineering实战。
常见问题与解决
Q:检索到的内容不相关怎么办? A:调整chunk_size大小,尝试不同的Embedding模型,增加检索数量k的值。
Q:回答不完整,只引用了部分内容? A:增大chunk_size,或在检索时返回更多片段(增大k值),给模型更完整的上下文。
Q:想接入微信/飞书怎么办? A:可以结合 MCP协议完全指南 中的工具调用能力,将RAG系统封装为API服务,再对接即时通讯平台。
Q:本地运行不想花钱调API?
A:Embedding用本地的bge-small-zh模型,大模型用Ollama部署的 DeepSeek,完全免费离线运行。
总结
RAG检索增强生成是目前最实用的AI落地技术之一。它不需要训练模型、不需要GPU,几十行Python代码就能让大模型基于你的私有文档准确回答问题。无论是搭建企业知识库、个人笔记助手还是产品FAQ机器人,RAG都是首选方案。
掌握了RAG之后,你可以进一步探索AI Agent,让系统不仅能检索知识,还能自主执行操作——这就是更高级的AI应用形态了。