给新手看的 RAG(检索增强生成)完整入门指南
看得懂流程、记得住原理、能在本地跑起来一个知识库问答系统。
一、什么是 RAG?(一句话)
RAG = 先"查资料",再"让大模型回答"
📌 核心作用:
👉 减少幻觉、提升准确率、让回答有依据
二、RAG 全流程(新手必背)
📌 一条完整流水线
text
文档加载
→ 切分
→ 向量化
→ 存储
→ 检索
→ 重排序
→ 生成回答
📌 记忆口诀(强烈推荐)
读 → 切 → 算 → 存 → 找 → 排 → 说
三、RAG 每一步在干什么?(通俗版)
1️⃣ 文档加载(Load)
📌 干什么?
把 PDF / txt / md 读进来
🌰 类比:
把书搬进图书馆
常见工具(LangChain 已封装):
- TextLoader
- PyPDFLoader
2️⃣ 文档切分(Split)【非常重要】
📌 干什么?
把长文档切成"小块"
❓ 为什么要切?
- 模型有上下文长度限制
- 检索时更精准
📌 常用策略
- 每块 300~500 字
- 有重叠(Overlap)
🌰 类比:
把一本书拆成一页一页
3️⃣ 向量化(Embedding)
📌 干什么?
把文本 → 数字向量
text
"Redis 是内存数据库"
→ [0.12, 0.88, 0.01, ...]
📌 作用:
- 为"相似度搜索"做准备
🌰 类比:
给每段话一个"坐标"
4️⃣ 向量存储(Store)
📌 干什么?
把向量存进向量数据库
新手推荐:
- Chroma(最简单)
- FAISS(更底层)
🌰 类比:
把坐标放进地图系统
5️⃣ 检索(Retrieve)
📌 干什么?
根据问题,找"最相关的文本块"
常见方式:
- 向量相似度(Top K)
- BM25(关键词)
6️⃣ 重排序(Rerank)
📌 干什么?
把"看起来相关的",再排一次名
👉 解决:
- 向量检索"语义对但答案不对"
- 提升 Top 1 准确率
7️⃣ 生成(Generate)
📌 干什么?
把"检索到的内容 + 问题"喂给 LLM
📌 关键点:
模型只能基于"给它的内容"回答
四、BM25 + 向量混合检索(很重要)
1️⃣ 为什么只用向量不够?
| 问题 | 向量检索 |
|---|---|
| 专有名词 | ❌ 容易漏 |
| 数字 / ID | ❌ 不敏感 |
| 代码 / 表格 | ❌ 表现差 |
2️⃣ BM25 是什么?(一句话)
BM25 = 高级关键词匹配
📌 擅长:
- 精确词
- 专有名词
- 技术文档
3️⃣ 混合检索怎么理解?
先"按意思找",再"按关键词补充"
text
向量检索 Top 20
BM25 检索 Top 20
→ 合并 → 重排序 → Top 5
📌 口诀:
语义 + 关键词,效果才稳定
五、RAG 幻觉问题 & 解决方案(重点)
1️⃣ RAG 幻觉从哪来?
| 原因 | 解释 |
|---|---|
| 检索不到 | 模型开始"编" |
| 检索不准 | 给错资料 |
| 提示词太松 | 模型自由发挥 |
2️⃣ 新手可落地的 6 个解决方法
✅ 方法 1:强约束 Prompt
text
只能根据提供的文档回答,
如果文档中没有答案,请回答"未找到相关信息"。
✅ 方法 2:Top-K 不要太小
- 推荐:k = 3~5
- 太小 → 容易漏
- 太大 → 噪声多
✅ 方法 3:重排序(非常关键)
向量检索 ≠ 最终答案
✅ 方法 4:答案必须引用来源
(哪一段文档)
✅ 方法 5:问题改写(Query Rewrite)
- 原问题 → 多种问法
- 提升召回率
✅ 方法 6:没资料就拒答
比瞎编好一万倍
六、常见检索重排序算法(认识即可)
| 算法 | 用途 |
|---|---|
| Cross-Encoder | 语义最强,慢 |
| Cohere Rerank | 商用常见 |
| LLM Rerank | 用大模型打分 |
| TF-IDF | 关键词 |
📌 新手建议:
先理解"为什么要重排",再管算法
七、实战:本地知识库问答(LangChain + Chroma)
🎯 目标
用本地文档,回答问题(不联网)
1️⃣ 安装依赖
bash
pip install langchain chromadb sentence-transformers
2️⃣ 准备文档
text
data/
└─ docs.txt
3️⃣ 核心代码(最小可用)
python
from langchain.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI
from langchain.chains import RetrievalQA
# 1. 加载文档
loader = TextLoader("data/docs.txt", encoding="utf-8")
docs = loader.load()
# 2. 切分
splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
docs = splitter.split_documents(docs)
# 3. 向量化
embeddings = HuggingFaceEmbeddings()
# 4. 存储
vectorstore = Chroma.from_documents(docs, embeddings)
# 5. 检索 + 生成
qa = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=vectorstore.as_retriever(search_kwargs={"k": 3})
)
# 6. 提问
result = qa.run("什么是 Redis?")
print(result)
📌 你已经完成一个完整 RAG 系统
八、新手常见误区
❌ 文档不切
❌ 只用向量,不重排
❌ Prompt 不约束
❌ 查不到也硬答
九、终极 RAG 记忆口诀(一定要背)
先查再说,
查准再说,
没资料就不说。
十、参考文档
LangChain 官方文档
B 站 "RAG 实战教程"
有任何问题欢迎在评论区交流。