《RAG 完全指南:让 AI 学会"查资料"的实战教程》

你是否遇到过这样的情况:问 AI 一个专业问题,它回答得头头是道,但仔细一想,发现它在”胡编乱造”?

比如你问它:”我们公司去年第三季度的财报显示营收多少?”

AI 可能会一本正经地回答:”根据财报显示,营收是 1.5 亿元。” 但实际上,这个数据可能是它编的!

这就是所谓的 幻觉问题 —— AI 在”一本正经地胡说八道”。

那么,如何让 AI 回答得准确、可靠、可追溯呢?

答案就是:RAG(检索增强生成)

项目地址langchain_rag_demo —— 一个演示 RAG 完整流程的入门项目,内置家常菜谱知识库,建议边读文章边对照代码!


1. 什么是 RAG?

RAG = Retrieval Augmented Generation(检索增强生成)。

简单来说,RAG 就是让 AI 学会”查资料”后再回答问题。

传统 LLM vs RAG

方式 回答方式 优势 劣势
传统 LLM 仅靠训练时的知识 生成流畅 知识可能过时,无法回答新信息
RAG 先查资料,再生成 答案可追溯,更准确 需要额外的数据处理

RAG 解决的核心问题

问题 RAG 解决方案
LLM 知识过时 检索最新文档获取最新信息
缺乏领域知识 接入专业文档库
幻觉问题 基于真实文档生成答案
无法追溯来源 引用源文档,可验证答案

RAG 工作流程

1
2
3
4
5
6
7
8
┌──────────────┐    ┌──────────────┐    ┌──────────────┐
│ 文档加载 │───▶│ 文本分块 │───▶│ 向量嵌入 │
└──────────────┘ └──────────────┘ └──────────────┘


┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ LLM 生成 │◀───│ 提示词组装 │◀───│ 相似度检索 │
└──────────────┘ └──────────────┘ └──────────────┘

整个流程可以分为两个阶段:

  1. 索引阶段(离线):文档 → 向量 → 存入向量数据库
  2. 查询阶段(在线):用户问题 → 检索相关文档 → 组合提示词 → LLM 生成答案

2. RAG 核心概念

在深入代码之前,我们需要理解几个核心概念。

2.1 LLM vs Embedding

这是 RAG 中最重要的两个角色:

  • LLM(推理模型):像大脑,负责”思考”和”回答问题”
  • Embedding(向量化):像眼睛,负责”理解”文字的”含义”
1
2
3
4
5
6
7
"红烧肉的做法" → Embedding → [0.12, -0.34, 0.56, 0.89, ...]


"怎么做红烧肉" → Embedding → [0.11, -0.35, 0.55, 0.88, ...]


相似度高!→ 检索到相关内容

💡 关键点:文字被转换成向量后,意思相近的文字会有相似的向量,这样我们就能通过”相似度”找到相关文档!

2.2 向量数据库

向量数据库是存储”向量”的地方,就像图书馆存放书籍一样。

常见的向量数据库:

  • Chroma - 轻量级,易上手(本项目使用)
  • Pinecone - 云服务,功能强大
  • Weaviate - 开源,功能丰富
  • Milvus - 国产,大规模部署

2.3 文本分块

为什么要分块?

因为:

  1. LLM 有上下文限制 - 太长的文档无法一次性处理
  2. 检索精度更高 - 小块更容易找到相关内容
  3. 降低噪音 - 无关内容少,答案更准确
1
2
3
4
5
6
7
原始文档:
"今天天气很好,我和朋友去公园野餐。我们带了水果、三明治和饮料。..."

分块后:
- 块1: "今天天气很好,我和朋友去公园野餐。"
- 块2: "我们带了水果、三明治和饮料。"
- 块3: ...

3. 实战代码解析

接下来,我们通过 langchain_rag_demo 项目来深入理解 RAG 的每个环节。

3.1 项目结构

1
2
3
4
5
6
7
8
9
langchain_rag_demo/
├── main.py # 主入口,包含 RAG 演示
├── src/
│ └── agent/
│ ├── loader.py # 文档加载器
│ ├── splitter.py # 文本分块器
│ ├── vectorstore.py # 向量存储
│ ├── retriever.py # 检索器
│ └── rag_chain.py # RAG 链

3.2 文档加载

1
2
3
4
from src.agent.loader import load_sample_data

# 加载示例数据(内置知识库:家常菜谱)
documents = load_sample_data()

项目内置了 3 个菜谱文档:

  • 红烧肉做法
  • 番茄炒蛋做法
  • 早餐推荐

3.3 文本分块

1
2
3
4
5
6
7
8
from src.agent.splitter import split_by_recursive

# 递归分割,保持语义完整
chunks = split_by_recursive(
documents,
chunk_size=300, # 每个块的大小(字符数)
chunk_overlap=50, # 块之间的重叠(避免信息丢失)
)

💡 技巧:chunk_size 和 chunk_overlap 需要根据实际情况调整,通常 200-500 字符效果较好。

3.4 向量存储

1
2
3
4
5
6
7
8
from src.agent.vectorstore import create_vectorstore

# 创建 Chroma 向量数据库
vectorstore = create_vectorstore(
chunks,
collection_name="recipes", # 集合名称
persist_directory="./chroma_db", # 持久化存储
)

这里使用 Chroma 向量数据库,它是轻量级的选择,非常适合入门学习。

3.5 检索

1
2
3
4
5
6
7
8
9
10
11
from src.agent.retriever import create_retriever

# 创建检索器
retriever = create_retriever(
vectorstore,
search_type="similarity", # 检索策略
k=3, # 返回最相似的 3 个文档
)

# 检索相关文档
relevant_docs = retriever.invoke("红烧肉怎么做?")

检索策略对比:

策略 说明 适用场景
similarity 基于向量相似度,返回最相似的 k 个 大多数场景
mmr 最大边际相关性,增加结果多样性 需要避免重复结果
similarity_score_threshold 设置相似度阈值 精确筛选

3.6 构建 RAG 链

1
2
3
4
5
6
7
8
9
10
11
from src.agent.llm import get_model
from src.agent.rag_chain import create_rag_chain

# 获取 LLM 模型
model = get_model()

# 创建 RAG 链
rag_chain = create_rag_chain(retriever, model)

# 问答!
answer = rag_chain.invoke("红烧肉怎么做?")

RAG 链的内部流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
用户问题: "红烧肉怎么做?"


[检索相关文档] ──▶ "红烧肉食材:五花肉 500g..."


[组合提示词]
"""
基于以下文档回答问题。
文档内容:红烧肉食材:五花肉 500g,酱油...

问题:红烧肉怎么做?
"""


[LLM 生成答案]


回答: "红烧肉做法:1. 五花肉切块..."

4. 实际体验

项目内置了家常菜谱知识库,可以直接运行体验:

1
2
cd ~/github/langchain_rag_demo
uv run python main.py

首次运行会自动提示创建数据目录,选择”使用示例文档”后,进入主菜单:

1
2
3
4
1. 📚 查看原始文档 - 分级浏览,先列表后详情
2. 📦 查看分块数据 - 查看 RAG 处理后的文本片段
3. 💬 开始问答 - 交互式问答,会显示引用来源
4. 🚪 退出

可以尝试提问:

  • “红烧肉怎么做?”
  • “早餐吃什么好?”
  • “新手学什么菜简单?”

回答时会显示引用来源,让你知道答案来自哪个文档!


5. 进阶技巧

5.1 优化检索效果

  1. 调整 chunk_size:根据文档特点选择合适的分块大小
  2. 尝试不同 Embedding 模型:中文推荐使用 BGE 系列
  3. 使用混合检索:结合关键词检索和向量检索

5.2 常见问题

问题 解决方案
检索不到相关内容 调整 chunk_size,或使用更好的 Embedding 模型
答案不准确 增加 k 值,检索更多相关文档
生成内容太长 在提示词中限制答案长度

5.3 下一步学习

  1. 将 RAG 集成到 Agent 中
  2. 使用更高级的检索策略(如 Hybrid Search)
  3. 学习 RAG 在企业知识库中的应用

6. 总结

RAG 是解决 LLM 幻觉问题、提升 AI 回答准确性的核心技术。

核心流程:

  1. 文档加载 → 读取各种格式的文档
  2. 文本分块 → 把大文档切成小块
  3. 向量化 → 把文字转换成向量
  4. 存储 → 把向量存到向量数据库
  5. 检索 → 找到与问题相关的文档
  6. 生成 → 把检索到的内容交给 LLM 生成答案

学会了 RAG,你就掌握了构建知识库问答系统的核心技能!

📚 建议动手运行项目代码,感受 RAG 的魅力!


相关阅读