《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 | ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ |
整个流程可以分为两个阶段:
- 索引阶段(离线):文档 → 向量 → 存入向量数据库
- 查询阶段(在线):用户问题 → 检索相关文档 → 组合提示词 → LLM 生成答案
2. RAG 核心概念
在深入代码之前,我们需要理解几个核心概念。
2.1 LLM vs Embedding
这是 RAG 中最重要的两个角色:
- LLM(推理模型):像大脑,负责”思考”和”回答问题”
- Embedding(向量化):像眼睛,负责”理解”文字的”含义”
1 | "红烧肉的做法" → Embedding → [0.12, -0.34, 0.56, 0.89, ...] |
💡 关键点:文字被转换成向量后,意思相近的文字会有相似的向量,这样我们就能通过”相似度”找到相关文档!
2.2 向量数据库
向量数据库是存储”向量”的地方,就像图书馆存放书籍一样。
常见的向量数据库:
- Chroma - 轻量级,易上手(本项目使用)
- Pinecone - 云服务,功能强大
- Weaviate - 开源,功能丰富
- Milvus - 国产,大规模部署
2.3 文本分块
为什么要分块?
因为:
- LLM 有上下文限制 - 太长的文档无法一次性处理
- 检索精度更高 - 小块更容易找到相关内容
- 降低噪音 - 无关内容少,答案更准确
1 | 原始文档: |
3. 实战代码解析
接下来,我们通过 langchain_rag_demo 项目来深入理解 RAG 的每个环节。
3.1 项目结构
1 | langchain_rag_demo/ |
3.2 文档加载
1 | from src.agent.loader import load_sample_data |
项目内置了 3 个菜谱文档:
- 红烧肉做法
- 番茄炒蛋做法
- 早餐推荐
3.3 文本分块
1 | from src.agent.splitter import split_by_recursive |
💡 技巧:chunk_size 和 chunk_overlap 需要根据实际情况调整,通常 200-500 字符效果较好。
3.4 向量存储
1 | from src.agent.vectorstore import create_vectorstore |
这里使用 Chroma 向量数据库,它是轻量级的选择,非常适合入门学习。
3.5 检索
1 | from src.agent.retriever import create_retriever |
检索策略对比:
| 策略 | 说明 | 适用场景 |
|---|---|---|
similarity |
基于向量相似度,返回最相似的 k 个 | 大多数场景 |
mmr |
最大边际相关性,增加结果多样性 | 需要避免重复结果 |
similarity_score_threshold |
设置相似度阈值 | 精确筛选 |
3.6 构建 RAG 链
1 | from src.agent.llm import get_model |
RAG 链的内部流程:
1 | 用户问题: "红烧肉怎么做?" |
4. 实际体验
项目内置了家常菜谱知识库,可以直接运行体验:
1 | cd ~/github/langchain_rag_demo |
首次运行会自动提示创建数据目录,选择”使用示例文档”后,进入主菜单:
1 | 1. 📚 查看原始文档 - 分级浏览,先列表后详情 |
可以尝试提问:
- “红烧肉怎么做?”
- “早餐吃什么好?”
- “新手学什么菜简单?”
回答时会显示引用来源,让你知道答案来自哪个文档!
5. 进阶技巧
5.1 优化检索效果
- 调整 chunk_size:根据文档特点选择合适的分块大小
- 尝试不同 Embedding 模型:中文推荐使用 BGE 系列
- 使用混合检索:结合关键词检索和向量检索
5.2 常见问题
| 问题 | 解决方案 |
|---|---|
| 检索不到相关内容 | 调整 chunk_size,或使用更好的 Embedding 模型 |
| 答案不准确 | 增加 k 值,检索更多相关文档 |
| 生成内容太长 | 在提示词中限制答案长度 |
5.3 下一步学习
- 将 RAG 集成到 Agent 中
- 使用更高级的检索策略(如 Hybrid Search)
- 学习 RAG 在企业知识库中的应用
6. 总结
RAG 是解决 LLM 幻觉问题、提升 AI 回答准确性的核心技术。
核心流程:
- 文档加载 → 读取各种格式的文档
- 文本分块 → 把大文档切成小块
- 向量化 → 把文字转换成向量
- 存储 → 把向量存到向量数据库
- 检索 → 找到与问题相关的文档
- 生成 → 把检索到的内容交给 LLM 生成答案
学会了 RAG,你就掌握了构建知识库问答系统的核心技能!
📚 建议动手运行项目代码,感受 RAG 的魅力!
相关阅读: