Learn AI · 模型硬功底(由内而外)
第 20 课 / 经典论文 P19  ·  阶段五:检索与 Agent(开篇 · Lewis et al., 2020)

RAG:
给冻结的模型外接一个可检索的知识库
——你「改不了权重就改上下文」的正路

上一课结尾你抓住了那条铁律:你能动的永远是「上下文」,动不了「权重」。但模型的知识冻在权重里——训练截止后的事不知道、你的私有数据不知道、不知道还会硬编(幻觉),而更新知识要重训,贵到不现实。 这一课 RAG 给出「往上下文里喂知识」的系统做法来了问题,先去一个外部知识库检索相关片段,塞进 prompt,再让模型基于「问题 + 检索到的证据」作答。 它正是所有「知识库问答」产品在做的事的理论根,也回答:怎么让一个冻结的模型,可靠地用上它「本来不知道」的知识?
一句话:RAG = 参数化模型(LLM,知识在权重里)+ 非参数化记忆(外挂的可检索文档库)。
三步走——检索(Retrieve):按问题从知识库捞出相关片段;增强(Augment):把片段拼进 prompt;生成(Generate):模型基于「问题 + 证据」作答。
于是知识可更新(改库不改模型)、可溯源(能给出处)、少幻觉(答案接地在证据上)这就是「改不了权重就改上下文」最正的那条路。

一、立靶:知识冻在权重里,四个硬伤

模型的知识,是预训练时压进权重的(你前面学的「压缩即理解」)。这带来四个绕不开的硬伤:

立靶:知识焊死在权重里 → 过时、不私有、会胡编、难更新

过时:训练截止后的事一概不知;② 不含私有数据:你公司的文档、用户的资料,它没见过; ③ 不知道也硬答(幻觉):它不会说「我不知道」,会编一个像样的;④ 更新要重训:想让它知道新事实,得重新训练,贵到不可行。 上一课的铁律说权重你改不了——那把知识放到权重外面、用时再取,行不行?

二、抽框架:检索 → 增强 → 生成

做什么关键
① 检索 Retrieve把问题变成向量,去知识库里找语义最相近的若干片段embedding 近邻——同一向量空间里找最近邻
② 增强 Augment把检索到的片段,拼进 prompt 的上下文这一步纯粹是「往上下文塞文本」——不碰权重
③ 生成 Generate模型基于「问题 + 检索到的证据」作答答案接地在证据上,而非凭权重里的记忆猜
关键:把「会推理的脑子」和「装事实的库」拆开

Lewis 等人(2020)把参数化的生成模型(知识/语言能力在权重里)和一个非参数化的外部记忆(Wikipedia 向量索引)结合: 模型负责理解问题、组织语言、推理,库负责装最新、最全、最私有的事实。 两者解耦——你想换知识,只改库(增删文档、重建索引),模型一动不动。这就是知识「可热更新」的根。

三、核心洞察:解耦知识、靠近邻检索、用证据接地

三个洞察,第一个是范式级,第二个把你前面学的 embedding 接上了,第三个是它最大的实用价值。

洞察说明
① 知识与模型解耦参数化记忆(权重,擅长推理/语言、但冻结)+ 非参数化记忆(文档库,可随时更新/替换/溯源)。两者能独立扩展、独立更新——这是 RAG 的范式贡献。
② 检索 = 向量空间找最近邻问题和文档都被 embedding 模型(bge/e5/gte 等,BERT 系)映到同一向量空间,距离近 = 语义相关。这正是你 word2vec 学的「语义=几何」在工程上的兑现。
③ grounding:用证据压住幻觉让模型「照着检索到的文本答、并标出处」,把回答锚在可核查的证据上,而非权重里的模糊记忆——大幅减少编造,还能溯源、可审计

四、动手玩:同一个问题,有没有 RAG 差在哪

一个模型「权重里没有」的问题(私有/最新知识)。点两边,看没 RAG 怎么胡编,有 RAG 怎么基于证据答对、还给出处。

用户问:你们公司的退货政策是多少天?
选方式: 

看出门道了吗:模型没变,变的只是「上下文里有没有那条证据」。RAG 不是让模型「学会」了退货政策,而是每次把对的那段事实,临时取来放它眼前——这就是「改上下文」的正路。

五、对照表(一):无 RAG vs 有 RAG

维度无 RAG(纯模型)有 RAG
训练截止后的新知识不知道知道(库里有就行)
私有/领域数据没见过可用(指向你的库)
幻觉不知道也硬编接地在证据上,大幅减少
溯源能给出处,可审计
更新知识要重训(贵)改库即可(便宜、即时)

六、对照表(二):RAG vs 微调 vs 长上下文,以及 RAG 的命门

手段改什么适合
RAG不改权重,外挂知识需要最新/私有事实、知识常变、要溯源
LoRA/微调改权重(永久)换风格/学技能/固定格式
长上下文不改权重,一次性塞一次性大输入(一篇长文档当场问)

一句话区分:要它「知道某些事实」→ RAG;要它「换个做事方式」→ 微调;「就这一篇,当场读」→ 长上下文。(呼应 LoRA 课那张表。)

🔮 但 RAG 的命门是检索质量——检索回来的是垃圾,再强的模型也答不对(garbage in, garbage out)。瓶颈通常不在生成、而在检索:分块策略、embedding 选型、top-k、重排(rerank)全在影响它。这正是 RAG 落地时真正的战场。下一课 P20 ReAct 再进一步:把「检索」从固定的前置一步,变成 agent 在推理中主动决定何时去查的一个动作——对话式 agent 都站在这条线上。

七、映射到你的项目

你工作里的东西其实就是这篇论文的什么
你做的 RAG 知识库问答 / 知识注入就是 RAG 的非参数化记忆 + 检索那一半——天天在调的就是这套「检索→增强→生成」
入库语料要「质 ≥ 量、要清洗」的直觉正中 RAG 命门:检索质量是天花板,库脏/分块烂/检索偏,模型再强也救不回(呼应 WebText/C4 同一信条)
你纠结「上 RAG 还是微调还是塞长上下文」就是上面那张取舍表:事实变/私有 → RAG;技能/风格 → 微调;一次性大输入 → 长上下文,常组合用
Claude Code 这类编程 agent 的 memory 系统(先检索相关记忆文件再注入)本质就是一个 RAG:按相关性检索记忆 → 注入上下文,让冻结的模型用上「这个项目/这个用户」的专属知识
「检索回来一堆不相关片段,反而把模型带歪」RAG 的真实坑:无关证据是噪声、甚至误导——所以要 rerank、控 top-k、过滤低相关,检索精度比召回更要紧

八、检索练习(关掉上文,凭记忆答)

1. RAG 的三步是?
2. RAG 的范式贡献是?
3. RAG 系统最常见的命门是?

九、常见问题 FAQ

把这一课接到你真实工作上的几个关键问。点开看答。

既然可以塞超长上下文了,RAG 是不是要被淘汰了?

没有,长上下文解决不了 RAG 的核心问题。长上下文是「把已有的一堆文本一次性塞进去」,但:① 你的知识库可能有百万级文档,再长的窗口也塞不下,仍需先检索出相关的;② 长上下文每次都按全长付费、按全长增延迟KV cache、计算量都涨),把无关内容全塞既贵又慢还可能「迷失在中间」;③ 知识更新还是得有个可增删的库

正确关系:长上下文让 RAG 更好用(每次能放更多检索结果、对分块更宽容),而不是替代它。检索这步——「从海量里挑出该看的」——长上下文消不掉。

RAG 能彻底消除幻觉吗?

不能,只是大幅降低、并让错误可定位。RAG 把答案接地在证据上,但仍会出错的几种情况:① 检索错了(捞回不相关/过时片段,模型照着错的答);② 模型无视证据(仍用权重里的旧记忆,或证据与它"先验"冲突时不信);③ 证据本身错(库里就是脏数据);④ 检索没命中但模型硬答(没找到相关却不说「不知道」)。

缓解:① 检索质量优先(rerank、过滤低相关);② prompt 明确「只依据给定材料、没有就说不知道、并引用出处」;③ 让它标注每句的来源便于核查(把幻觉变成可抓的引用错误);④ 库要清洗。RAG 把幻觉从「凭空编」变成「可溯源、可定位」,这本身就是巨大进步。

检索这步,到底哪几个旋钮最影响效果?(检索层选型该看什么)

按影响排,几个核心旋钮:

旋钮在调什么
分块(chunking)文档怎么切——太大塞不下且稀释、太小丢上下文。最被低估、却最影响效果的一环
embedding 模型决定「语义相近」判得准不准(中文/领域要选对,bge/e5/gte 系)
top-k + rerank召回几条、再用更强的重排模型把最相关的顶上来——精度比召回更要紧
混合检索向量(语义)+ 关键词(BM25)结合,补稠密检索对专有名词/精确匹配的短板

心法:质 ≥ 量、检索精度 ≥ 召回数量。先把分块和 rerank 做对,比换更大的生成模型划算得多——因为命门在检索不在生成。建个小评测集(问题→应检索到哪些片段)量化检索命中率,是搭 RAG 最该先做的事。

稠密检索(向量)vs 关键词检索(BM25),用哪个?要混合吗?

两者互补

稠密(向量)BM25(关键词)
强在语义(近义、改写)精确(专名、ID、术语、码)
弱在精确匹配会糊掉漏掉没语义,近义词不通

大多数情况混合(hybrid)最稳:两路都跑、RRF 融合、再 rerank。语料里精确标识符多(代码/法条/SKU/人名)→ BM25 不能省(纯向量会静默漏);对话式查询+散文→ 稠密吃香。默认推荐 hybrid + reranker。但别过度工程:调好的 BM25 基线强得惊人又近乎零成本,刚起步先用它打底、量化后再决定加不加向量。

分块到底怎么切才好,有经验法则吗?

核心矛盾:太大→盖多主题、embedding 糊、稀释相关性;太小→丢上下文("它要 30 块"——"它"是啥)。法则:

按语义/结构边界切,别盲目按字数——沿标题/段落/列表项/Q&A 对,一块=一个完整意思;② 典型 ~200-500 token 起步(随密度变,非铁律);③ 相邻块 10-20% 重叠,免得一个意思被劈两半;④ 每块带上下文——把文档标题/小节名拼到块首(进阶:Contextual Retrieval,用 LLM 给每块加一句"它在全文何处");⑤ 父子块(small-to-big)——小块做精确检索、喂模型时给大块(精度+上下文兼得)。

实操:先做"结构感知分块 + 每块带标题上下文",再用下条的评测去调——没有通用最优,依赖你的语料和查询,所以必须量化。

怎么量化评测检索质量,而不是凭感觉调?

第一层 · 单独评检索(最重要,多数 RAG 失败在这):① 攒一批代表性查询;② 给每个标"应检索到哪些块"(gold set;可自举——拿一段文档让 LLM 生成它能答的问题,该段即 ground-truth,抽样人工验);③ 算指标:

指标测什么
Recall@k相关块有几个进 top-k——RAG 最关键(没检索到,生成再强也答不出)
Precision@ktop-k 里几个真相关(噪声多少)
MRR / NDCG对的块排得够不够靠前(模型更关注前文)

第二层 · 端到端:faithfulness(答案忠于证据吗)+ 正确性,用 LLM-as-judge(做过对话质检评分器的话直接复用)。纪律:检索和生成分开诊断——先分清"没捞到"还是"捞到了答歪"。

工作流:改一个旋钮 → 重跑评测集 → 看 Recall@k/NDCG 动没动 → 留或回退(就是「生成→评分→改进」的调优闭环套到 RAG)。配 held-out 查询集防过拟合(Goodhart)。现成工具看 RAGAS。永远先量化、再调;命门在检索。

本课主源

读原典:Lewis et al. — Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks(2020)

配套回看:word2vec(语义=几何) + BERT(检索用的 embedding 模型都是 BERT 系)——检索这半套,你前面已经埋好了根。

阶段五「检索与 Agent」开篇。下一篇 P20 ReAct:把「检索/查工具」变成 agent 在推理中主动交错的「想一步、做一步」——工具调用 agent 的理论原型。收官 P21 Toolformer 讲工具调用的由来。

我是你的老师,随时提问。 比如:「稠密检索(向量)和关键词检索(BM25),我该用哪个、要不要混合?」「分块到底怎么切才好,有没有经验法则?」 「RAG 的检索质量,我怎么量化评测、而不是凭感觉调?」——别带着模糊往下走。

参考:
Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, 2020.