AI Agent 学习笔记(四):RAG 检索增强生成,给 Agent 一座图书馆

AI-摘要
DeepSeek GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
AI Agent 学习笔记(四):RAG 检索增强生成,给 Agent 一座图书馆
JieAI Agent 学习笔记(四):RAG 检索增强生成,给 Agent 一座图书馆
上一篇给 Agent 装上了“手”,这篇给它开一座“图书馆”——RAG(Retrieval-Augmented Generation,检索增强生成),让它基于真实资料回答问题,而不是瞎编。
一. 为什么需要 RAG
大模型有两个让人头疼的问题:
- 幻觉:不知道的事它会一本正经地编;
- 知识过时:训练数据是过去的数据,不知道现在的事,更不知道你公司内部的文档。
解决方案有三种思路,先看对比:
| 方案 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 直接问模型 | 啥也不做 | 简单 | 幻觉、过时 |
| 微调(Fine-tune) | 用数据再训练模型 | 改变模型风格/能力 | 贵、慢、知识更新难 |
| RAG | 先把资料检索出来,塞进 Prompt | 便宜、实时、可追溯、不用训练 | 检索质量决定上限 |
RAG 的思路特别朴素:模型不知道答案?没关系,我们先把答案相关的资料找出来,喂给它,让它看着资料回答。 就像开卷考试。
二. RAG 的整体流程(先看全景)
1 | 【离线阶段:建图书馆】(做一次,资料更新时重做) |
三. 离线阶段:给文档建档
3.1 文档解析与清洗
PDF、Word、网页要先转成纯文本。常用的工具:
| 格式 | 工具 |
|---|---|
| pypdf、PyMuPDF | |
| Word | python-docx |
| HTML | BeautifulSoup |
| Markdown | 直接读(博客、文档站最友好) |
1 | # 示例:读取 Markdown 文件(本项目博客就是 Markdown) |
3.2 分块(Chunking):RAG 质量的第一道关
整个文档太长不能直接塞进模型,要切成语义完整的小块。
分块策略对比:
| 策略 | 做法 | 适合 |
|---|---|---|
| 固定大小 | 每 N 个字符一块,块间重叠 M 字符 | 快速起步 |
| 按段落/标题 | 按 Markdown 的 ## 标题切 | 结构化文档(手册、博客) |
| 按句子/语义 | 语义完整处切分 | 长文本、混合内容 |
| 递归分割 | 先按段落,太长再按句子 | 通用默认 |
1 | def chunk_by_size(text: str, size: int = 500, overlap: int = 50) -> list: |
分块太小(<100 字)上下文不全,太大(>2000 字)噪音太多。500
800 字 + 50100 字重叠是常见起点,具体按文档调。
3.3 Embedding:把文本变成向量
(上一篇提过)Embedding 把文本变成一串数字,语义相近的文本向量距离近。常用模型:
| 模型 | 维度 | 特点 |
|---|---|---|
| text-embedding-3-small | 1536 | OpenAI,便宜好用 |
| bge-large-zh / bge-m3 | 1024 | 中文效果好,可本地部署 |
| text2vec-large-chinese | 1024 | 中文场景常见 |
| jina-embeddings-v3 | 1024 | 多语言 |
3.4 存入向量数据库
1 | import chromadb |
四. 在线阶段:回答问题
1 | # 1. 问题向量化 |
4.1 检索结果的相似度阈值
向量检索永远会返回 K 条结果,但可能全是无关的。要设置阈值过滤:
1 | # Chroma 的 distance 是 L2 距离,越小越相似(0 = 完全一致) |
五. 进阶:检索质量不够怎么办
RAG 的效果上限由检索决定。检索结果不准,后面生成得再好也没用。常用升级手段:
5.1 混合检索(Hybrid Search)
向量检索懂语义但不懂“精确关键词”,BM25 关键词检索刚好相反,两者结合效果最好:
1 | 用户问题 |
1 | # 思路:两个检索结果按分数归一化后加权合并 |
5.2 重排序(Rerank)
先用便宜方法召回 20 条,再用**重排序模型(如 bge-reranker、Cohere Rerank)**精排成 Top 5。重排序模型会看“问题和文档的匹配程度”,比纯向量相似度准得多。
5.3 查询改写
用户问“它多少钱”这种指代不清的问题,先用 LLM 把问题补全成“这个产品的价格是多少”再检索。
5.4 分块优化
- 保留章节标题作为元数据,检索后返回“标题+正文”,让模型知道上下文;
- 父子分块:检索小块(精确),回传大块(完整上下文)。
六. RAG 与 Memory、Tool 怎么配合
它们解决不同问题,可以同时用:
1 | 用户提问 |
七. RAG 常见坑(初学者避雷)
| 坑 | 表现 | 对策 |
|---|---|---|
| 分块不合理 | 答案断章取义 | 按结构分块、加重叠 |
| 不设阈值 | 无关资料被引用 | 相似度阈值过滤 |
| 中文 Embedding 效果差 | 搜不准 | 换中文模型(bge 等) |
| 只检索不溯源 | 无法验证对错 | 返回来源(文件名/页码) |
| 资料太多 | 超出上下文窗口 | 限制 K、截断、重排序 |
| 知识库不更新 | 资料过期 | 定期重建索引 |
八. 小结与作业
小结
- RAG = 检索 + 生成:先找资料,再让模型看着资料回答;
- 离线建索引:解析 → 分块 → Embedding → 向量库;
- 在线问答:问题向量化 → 检索 Top K → 拼 Prompt → 生成;
- 质量升级三件套:混合检索、重排序、查询改写;
- RAG 治“知识”,Memory 记“人”,Tool 干“活”。
作业
- 用你自己的一篇博客 Markdown 建一个 Chroma 知识库,问 3 个关于文章内容的问题;
- 实验不同分块大小(200 / 500 / 1000 字),对比回答质量;
- 故意问一个知识库里没有的问题,确认 Agent 会说“不知道”而不是编造。
下一篇:Skill 技能——把常用的提示词、流程和工具打包成可复用的“技能”。







