模型的知识,是预训练时压进权重的(你前面学的「压缩即理解」)。这带来四个绕不开的硬伤:
① 过时:训练截止后的事一概不知;② 不含私有数据:你公司的文档、用户的资料,它没见过; ③ 不知道也硬答(幻觉):它不会说「我不知道」,会编一个像样的;④ 更新要重训:想让它知道新事实,得重新训练,贵到不可行。 上一课的铁律说权重你改不了——那把知识放到权重外面、用时再取,行不行?
| 步 | 做什么 | 关键 |
|---|---|---|
| ① 检索 Retrieve | 把问题变成向量,去知识库里找语义最相近的若干片段 | 靠 embedding 近邻——同一向量空间里找最近邻 |
| ② 增强 Augment | 把检索到的片段,拼进 prompt 的上下文 | 这一步纯粹是「往上下文塞文本」——不碰权重 |
| ③ 生成 Generate | 模型基于「问题 + 检索到的证据」作答 | 答案接地在证据上,而非凭权重里的记忆猜 |
Lewis 等人(2020)把参数化的生成模型(知识/语言能力在权重里)和一个非参数化的外部记忆(Wikipedia 向量索引)结合: 模型负责理解问题、组织语言、推理,库负责装最新、最全、最私有的事实。 两者解耦——你想换知识,只改库(增删文档、重建索引),模型一动不动。这就是知识「可热更新」的根。
三个洞察,第一个是范式级,第二个把你前面学的 embedding 接上了,第三个是它最大的实用价值。
| 洞察 | 说明 |
|---|---|
| ① 知识与模型解耦 | 参数化记忆(权重,擅长推理/语言、但冻结)+ 非参数化记忆(文档库,可随时更新/替换/溯源)。两者能独立扩展、独立更新——这是 RAG 的范式贡献。 |
| ② 检索 = 向量空间找最近邻 | 问题和文档都被 embedding 模型(bge/e5/gte 等,BERT 系)映到同一向量空间,距离近 = 语义相关。这正是你 word2vec 学的「语义=几何」在工程上的兑现。 |
| ③ grounding:用证据压住幻觉 | 让模型「照着检索到的文本答、并标出处」,把回答锚在可核查的证据上,而非权重里的模糊记忆——大幅减少编造,还能溯源、可审计。 |
一个模型「权重里没有」的问题(私有/最新知识)。点两边,看没 RAG 怎么胡编,有 RAG 怎么基于证据答对、还给出处。
看出门道了吗:模型没变,变的只是「上下文里有没有那条证据」。RAG 不是让模型「学会」了退货政策,而是每次把对的那段事实,临时取来放它眼前——这就是「改上下文」的正路。
| 维度 | 无 RAG(纯模型) | 有 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、过滤低相关,检索精度比召回更要紧 |
把这一课接到你真实工作上的几个关键问。点开看答。
没有,长上下文解决不了 RAG 的核心问题。长上下文是「把已有的一堆文本一次性塞进去」,但:① 你的知识库可能有百万级文档,再长的窗口也塞不下,仍需先检索出相关的;② 长上下文每次都按全长付费、按全长增延迟(KV cache、计算量都涨),把无关内容全塞既贵又慢还可能「迷失在中间」;③ 知识更新还是得有个可增删的库。
正确关系:长上下文让 RAG 更好用(每次能放更多检索结果、对分块更宽容),而不是替代它。检索这步——「从海量里挑出该看的」——长上下文消不掉。
不能,只是大幅降低、并让错误可定位。RAG 把答案接地在证据上,但仍会出错的几种情况:① 检索错了(捞回不相关/过时片段,模型照着错的答);② 模型无视证据(仍用权重里的旧记忆,或证据与它"先验"冲突时不信);③ 证据本身错(库里就是脏数据);④ 检索没命中但模型硬答(没找到相关却不说「不知道」)。
缓解:① 检索质量优先(rerank、过滤低相关);② prompt 明确「只依据给定材料、没有就说不知道、并引用出处」;③ 让它标注每句的来源便于核查(把幻觉变成可抓的引用错误);④ 库要清洗。RAG 把幻觉从「凭空编」变成「可溯源、可定位」,这本身就是巨大进步。
按影响排,几个核心旋钮:
| 旋钮 | 在调什么 |
|---|---|
| 分块(chunking) | 文档怎么切——太大塞不下且稀释、太小丢上下文。最被低估、却最影响效果的一环 |
| embedding 模型 | 决定「语义相近」判得准不准(中文/领域要选对,bge/e5/gte 系) |
| top-k + rerank | 召回几条、再用更强的重排模型把最相关的顶上来——精度比召回更要紧 |
| 混合检索 | 向量(语义)+ 关键词(BM25)结合,补稠密检索对专有名词/精确匹配的短板 |
心法:质 ≥ 量、检索精度 ≥ 召回数量。先把分块和 rerank 做对,比换更大的生成模型划算得多——因为命门在检索不在生成。建个小评测集(问题→应检索到哪些片段)量化检索命中率,是搭 RAG 最该先做的事。
两者互补:
| 稠密(向量) | 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@k | top-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 讲工具调用的由来。
参考:
Lewis et al., Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks, 2020.