RAG 一眼看懂

用大白话 + 流程图 + 类比,把 RAG 的核心组件、工作原理和十模块学习路径一次性讲清楚。不需要任何前置知识。

面向初学者 10 模块 × 3 档 检索 · 生成 · 引用 · 评估
1 RAG 到底是什么?
一句话:让 AI 在回答前先去“翻资料”,而不是凭记忆瞎编。
类比:开卷考试。传统的 AI 像“闭卷考试”——它只能靠训练时记在脑子里的东西答题,题目一超出范围就会编造(这叫“幻觉”)。RAG 就是把它变成“开卷考试”:先给它一本参考书(你的文档),它每答一道题之前,先去书里翻出相关段落,对照着回答。这样答案有据可查,还能告诉你“我是从第几页看到的”。
📚

解决“知识过时”

模型训练完就“冻结”了,不知道昨天的新闻、你公司的内部文档。RAG 把最新资料外挂进来,不用重新训练模型。

外部知识
🎯

解决“胡说八道”

模型在没有依据时会编造。RAG 强制它先检索、再回答,答案里的每一句都能追溯到原文片段。

减少幻觉
🔍

解决“找不到重点”

你的文档可能有几百页,直接全塞给模型既贵又超长。RAG 只挑出最相关的几段,精准投喂。

精准检索
2 RAG 的完整流程:两个阶段
RAG 不是一条线,而是两条线:一条“准备资料”(离线建索引),一条“回答问题”(在线检索生成)。

阶段 A · 准备资料(离线,只做一次)

📄 加载文档Markdown / 文本
→
✂️ 切分切成小块
→
🔢 向量化每块 → 一串数字
→
🗄️ 存入向量库内存 / SQLite / PG

阶段 B · 回答问题(在线,每次提问都跑)

❓ 用户问题“它的第二点是什么”
→
✏️ 查询改写把问题变清楚
→
🔢 问题向量化同样变成数字
→
🔍 检索找最像的几块
→
🏆 重排重新排序
→
📝 拼上下文塞进提示词
→
🤖 模型生成带引用作答
把两阶段串起来看:阶段 A 像“把一本书拆成一页页卡片、每张卡片编好号、按内容分类放进柜子”;阶段 B 像“你来问一个问题,管理员先理解你到底想问什么,然后从柜子里抽出最相关的几张卡片递给你,你对照卡片给出答案,并注明‘以上来自第 3、7、12 张卡片’”。
3 六个核心组件,拼出整个 RAG
不管多复杂的 RAG 系统,拆开来看都离不开这六件事。搞懂它们,你就掌握了 80%。
✂️

① 切分(Chunking)

把长文档切成小块。切太大:检索不准、塞不进提示词;切太小:上下文断裂、语义不完整。好的切分要按标题层级来切,块与块之间还要留一点重叠,避免把一句话劈成两半。

M01
🔢

② 向量化(Embedding)

把一段文字变成一串数字(比如 1024 个小数)。语义相近的文字,数字也相近。这样计算机才能“算”两段话像不像。这一步要调 embedding 模型,通常按批发送以省钱省时间。

M02
🔍

③ 向量检索

把用户问题也变成向量,然后在库里找“数字最像”的几块。最朴素的算法是手写余弦相似度;数据量大时用 pgvector 的 HNSW 索引做近似检索,用一点点精度换大量速度。

M03
🏆

④ 混合检索与重排

光靠向量不够——专有名词、型号、人名它可能找不到。所以要同时跑一路关键词检索,再把两路结果融合(RRF 算法),最后用一个打分器重新排序,把最相关的顶上来。

M04
📝

⑤ 上下文构造与生成

把检索到的几块拼成一段提示词,告诉模型“请根据以下资料回答”。要注意 token 预算——不能全塞进去。还要处理“资料里没有答案”的情况,这时候应该拒答而不是硬编。

M05 · M06
📊

⑥ 评估

怎么知道检索好不好?用一组“问题 → 期望命中”的黄金集,算命中率、召回率、MRR 三个指标。关键是设一条基线:指标掉下去就判失败,防止改着改着越改越差。

M08
4 向量化到底在干什么?
这是 RAG 里最抽象的一步。用一张图说明:文字 → 数字 → 比距离。
“猫喜欢吃鱼”
0.82
0.11
0.47
0.93
0.05
“小猫爱吃鱼”
0.80
0.13
0.45
0.91
0.07
“汽车需要加油”
0.12
0.88
0.31
0.09
0.74

👆 前两句的数字几乎一样(因为它们意思相近),第三句的数字差很远(意思无关)。检索时就是算“问题向量”和“每块向量”的距离,取最近的几个。这就是向量检索的全部原理。

5 十个模块,十个台阶
你 PRD 里的 10 个模块,每个都解决 RAG 链路里一个具体问题。每个模块分三档:basic(先跑通)、advanced(加功能)、enterprise(接真实服务)。
M01

📄 加载与切分

怎么把文档切成合适的小块。basic 用定长切,advanced 按标题层级切并加重叠,enterprise 配置驱动 + 幂等。

定长窗口 结构感知 配置驱动
M02

🔢 向量化

把文字变成数字。basic 批量调模型,advanced 切批 + 磁盘缓存 + 413 重试,enterprise 缓存落 PG + 可续跑。

批量调用 磁盘缓存 PG 缓存
M03

🔍 向量检索

找最像的几块。basic 手写余弦相似度,advanced SQLite + 阈值 + 回环,enterprise pgvector + HNSW 调优。

手写余弦 SQLite pgvector
M04

🏆 混合检索与重排

向量 + 关键词双路召回,再融合排序。basic 字符 bigram 倒排,advanced RRF 融合,enterprise 可替换打分器。

关键词倒排 RRF 融合 可替换重排
M05

📝 上下文与生成

把检索结果拼进提示词让模型作答。basic 直接拼,advanced 预算裁剪 + 引用编号,enterprise 拒答 + 降级 + 重试。

直接拼接 预算裁剪 拒答降级
M06

🔗 引用溯源

答案里的 [1][2] 到底来自哪一段。basic 带角标,advanced 回链到原文偏移,enterprise 可验证 + 完整溯源链。

角标 原文偏移 可验证
M07

✏️ 查询改写与多轮

用户的问题往往不适合直接检索。basic 单轮改写,advanced 指代消解 + 历史裁剪,enterprise 路由 + 缓存 + PG 会话。

单轮改写 指代消解 查询路由
M08

📊 评估

怎么知道检索好不好。basic 跑 10 条看命中,advanced 算三个指标,enterprise 黄金集 + 基线 + 回归门禁。

样例跑通 三个指标 回归门禁
M09

🤖 Agentic RAG

让模型自己决定要不要检索、检索几次。basic 把检索变成工具,advanced 自主多轮 + 步数上限,enterprise 预算护栏 + 人工审批。

检索工具化 自主多轮 预算护栏
M10

🎯 端到端实战

把前面九个模块串成一个完整应用。basic 单命令跑通,advanced 多轮 + 流式 + 持久化,enterprise pgvector + PG 检查点 + 评估门禁 + 可观测。

单命令 流式多轮 全企业级
6 三档到底差在哪?
每个模块都有 basic / advanced / enterprise 三档。不是三份不同的代码,而是同一个问题的三层演进——加了什么、为什么加、代价是什么。
维度 basic(先跑通) advanced(加功能) enterprise(接真实服务)
目标 理解核心概念,一条命令跑出结果 补上工程上必需的细节 接真实外部服务,处理失败与代价
外部依赖 无(纯函数,可离线跑) 本机 ollama(embedding) ollama + PostgreSQL + pgvector + DeepSeek Key
存储 内存 磁盘 / SQLite PostgreSQL + pgvector
典型新增 — 缓存、切批、重试、阈值、融合 索引调优、跨进程共享、评估门禁、降级、可观测
代价 功能最少,但最容易看懂 多一层缓存与重试逻辑 要装数据库、要配凭据、失败面变多
为什么要有三档?因为学习曲线不是一条直线。basic 让你先看到“这个东西能跑”;advanced 让你知道“要跑得稳需要什么”;enterprise 让你面对“真实世界的复杂”。每一档都要能独立跑通一条 demo 命令,退出码为 0。
7 给你的学习路径
按四个阶段推进。每个阶段结束时,你都应该能演示出一些东西——演示不出来就不算学完。
阶段 S1 · 打地基

先把文档切成块

M01 加载与切分

理解为什么不能把整本书塞给模型。学会按标题层级切分、加重叠窗口、给每块打元数据。这一步是后面所有环节的基础——切得不好,检索再准也没用。

阶段 S2 · 检索链路

向量化 + 检索 + 重排

M02 向量化 M03 向量检索 M04 混合重排

学会把文字变成向量、算相似度、找 top-k。然后补上关键词检索做混合,用 RRF 融合两路结果。最后接上 pgvector,理解 HNSW 索引“用精度换速度”的取舍。

阶段 S3 · 生成与评估

让答案有据可查

M05 上下文生成 M06 引用溯源 M07 查询改写 M08 评估

学会构造提示词、控制 token 预算、处理“没答案就拒答”。然后做到每条引用都能回链到原文。再解决多轮对话里的指代消解。最后用黄金集和基线,让“检索质量”变成可判定的数字。

阶段 S4 · 自主与实战

让模型自己决定怎么检索

M09 Agentic RAG M10 端到端实战

把检索变成模型可以调用的工具,让它自主多轮——“证据不够?改写问题再查一次”。加上预算护栏和人工审批。最后把十个模块串成一个完整应用:可检索、可引用、可评估、可自主多轮。

8 刚开始最容易踩的 5 个坑
这些都是概念层面最容易困惑的地方,提前知道能少走弯路。
⚠️

坑 1:以为 RAG 就是“把文档丢给模型”

不是。RAG 的核心是“检索”——先找到最相关的几段,再喂给模型。直接丢整个文档既超长又低效,而且模型会“中间忘掉”(lost in the middle)。

⚠️

坑 2:切分太随意

很多人随手按固定字数切,结果一句话被劈成两半、一个标题和它的内容被分到两块。切分粒度直接决定检索质量——切错了,后面全白搭。

⚠️

坑 3:只做向量检索,不做关键词

向量检索对“意思相近”很擅长,但对专有名词、型号、人名可能失灵。比如搜“A100 显卡”,向量可能给你一堆“GPU 相关”的内容,但搜不到精确提到 A100 的那段。所以要加一路关键词检索。

⚠️

坑 4:不处理“检索不到”的情况

如果资料里根本没有答案,模型会倾向于硬编一个。正确做法是:当检索结果为空或分数全低于阈值时,明确拒答——“根据现有资料无法回答”。

⚠️

坑 5:不评估就上线

“感觉还行”不是标准。你需要一组带标准答案的问题(黄金集),算出命中率、召回率、MRR,并设一条基线。否则改了参数之后,你根本不知道是变好了还是变坏了。