系列导航:这是"无训练型检索增强生成(RAG)经典架构梳理"系列的第一篇。假设你和我一样,在此之前只在公众号标题里见过 RAG 这三个字母,没有精读过任何论文。 本系列路线:① Naive RAG 基线(T0,本篇)→ ② Modular RAG 图纸(F0)→ ③ 查询侧增强(T1)→ ④ 动态检索(T2)→ ⑤ 检索后治理(T3)→ ⑥ 边界讨论 → ⑦ 评价指标 → ⑧ 横向对比总表。方向声明:本系列只研究无训练型 RAG——生成器与检索器的参数全程冻结,只在检索侧与流程侧做改造。后面七篇按"改造位置"分为 T1 查询侧增强 / T2 动态检索 / T3 检索后治理 / T4 知识组织四类,外加 F0 编排框架层。
摘要:本文用"开卷考试"的类比讲清楚 RAG(Retrieval-Augmented Generation,检索增强生成)到底想解决什么,手画出"检索 → 拼接 → 生成"的完整流程,拆开三个核心机制(参数记忆与非参数记忆、DPR 向量检索、RAG-Sequence 与 RAG-Token),并澄清一个初学者最容易踩的坑:原始 RAG 论文其实是训练过的,那我们说的"无训练型 RAG"究竟指什么、本篇在这个系列里到底算什么位置。
关键词:RAG、检索增强生成、Naive RAG、T0 基线、Lewis 2020、DPR、向量检索、无训练
一、它要解决什么问题:大模型有四个"记不住"
假设你问一个聊天机器人:"我们公司 2024 版报销制度里,差旅住宿上限是多少?"它大概率会一本正经地编一个数字出来。幻觉(hallucination)这个词说的就是这种现象:模型不知道自己不知道,于是硬凑一个看起来合理的答案。
往深一层看,纯靠大模型自身回答问题,有四个绕不开的麻烦:
- 知识写死在参数里,改不动。大模型的能力来自训练时把海量文本"压缩"进几百亿个参数(可以理解为模型的脑细胞连接强度)。知识一旦学进去,就变成了参数的一部分,想改某一条事实,几乎只能重新训练。
- 知识有截止日期。训练语料截止到某一天,之后发生的事它一概不知。
- 私域知识根本没见过。公司内部文档、个人笔记、实验室数据,从来没进过训练集。
- 答完之后拿不出证据。它给的答案无法指出"这句话出自哪份文件的第几段",这在医疗、法律、金融场景下几乎不可用。
那有人会说:简单啊,把资料直接贴进提问里不就行了?确实,这是最直觉的做法,但它撑不住:一份资料几十万字,而模型一次能读进去的上下文窗口(context window,即模型一次能"看到"的字数上限)有限;而且资料一长,模型容易"大海捞针",被无关段落干扰;更现实的是成本——每次对话都塞一本书进去,token 费用吃不消。
于是 2020 年,Lewis 等人在 NeurIPS 上提出了 RAG。一句话概括它的想法:别让模型凭记忆答题,让它先翻资料再答题。用个生活类比——以前的模型在参加闭卷考试,全靠背;RAG 把它换成了开卷考试,允许先查书再下笔。更妙的是,这本书可以随时换(换成公司文档、换成今天的网页),而模型的"脑子"一个字都不用改。
二、工作流程:一次 RAG 问答到底发生了什么
RAG 系统分成"离线"和"在线"两件事。离线是考前整理资料,在线是考场上翻资料答题。
注意第 ② 步的"检索"不是关键词匹配,而是语义检索:你搜"怎么报销打车费",即使文档里一个"打车"都没有、只有"出租车费用",也可能被找出来。这就是"把语义变成向量、比距离"的威力。
【离线:只做一次,建索引】 原始文档 → 切块(chunk) → 每块压成一个向量(embedding) → 存进向量数据库 ↑ ↑ 比如按 100 个词一段 "把一段话变成一串数字, 意思相近的段落在数字空间里也挨得近" 【在线:每次提问都走一遍】 用户提问 "差旅住宿上限是多少?" │ ▼ ① 把问题也压成向量(用同一个编码器) ▼ ② 在向量库里做相似度检索:找和问题向量"距离最近"的若干段落(取 Top-K,通常 5~10 条) ▼ ③ 把这 K 条段落和问题拼成一个新的提示词(prompt): "请参考以下资料回答:资料1…… 资料2…… 问题:……" ▼ ④ 大模型读这个提示词,生成答案 ▼ ⑤ (可选)附上答案引用了哪几条资料三、核心机制拆三个点
关键点一:参数记忆 vs 非参数记忆——这篇论文最值钱的一句话
原论文把知识分成两种:
- 参数记忆(parametric memory):预训练模型本身,知识被压缩进权重,读不出来、改不动、说不清来源。
- 非参数记忆(non-parametric memory):外部的 Wikipedia 段落库,用检索器直接查,看得见、能更新、能溯源。
RAG 的本质就是把这两种记忆拼在一起用:模型负责"理解和表达",外部库负责"提供事实"。这个区分非常关键——本系列后面所有方法的改进,本质上都是在这两块之间重新安排"谁干什么活",而不是去动模型本身。
关键点二:DPR——让问题和资料能在同一个空间里比距离
怎么判断"这段文字和问题相不相关"?论文用了 DPR(Dense Passage Retriever,稠密段落检索器),结构是双塔:一个编码器专门编码问题,另一个专门编码段落,两者都吐出固定长度的向量。训练目标是让"问题向量"和"它的正确答案段落向量"尽量接近,和不相关段落尽量远离。
向量(embedding):把一段文字变成一串固定长度的数字(比如 768 个),语义相近的文本在这串数字构成的空间里距离也近。
检索时,先离线把每段文档都编码好存起来,线上只编码这一次的问题,然后在库里找最近的 K 个——这个"在亿级向量里找最近邻"的动作由近似检索库(如 FAISS)毫秒级完成。论文用的是 Wikipedia 的 2100 万个段落,每段约 100 个词。
今天请把它当"背景知识"看:实际落地时,我们通常直接用现成的 embedding 模型(参数冻结、拿来即用),而不是自己训一个 DPR。
关键点三:RAG-Sequence 与 RAG-Token——资料怎么"喂"进生成器
有了资料,还有个细节问题:K 条资料怎么用?论文给了两种方案:
- RAG-Sequence:挑一份资料,从头写到尾。可以理解为"我选定了资料 A,就按它把整段答案写完";因为不确定哪份最好,就让每份资料都试着写一遍,最后按各自的可信度加权选出最佳答案。
- RAG-Token:每写一个词,都重新看一遍所有资料。可以理解为"边写边翻书,写到哪一句就现场决定参考哪一份"。粒度更细,适合需要拼接多份资料的长答案,代价是计算更贵。
大白话:RAG-Sequence 是"选一本书抄完",RAG-Token 是"写每个字都扫一眼桌上的五本书"。而今天绝大多数落地系统(也就是 Naive RAG)其实更简单:把 K 条资料一股脑拼进 prompt 就完事了,连加权都省了。
四、和上一代比:好在哪,局限在哪
好在哪(对比"纯生成模型"和更早的"抽取式 + 生成"方案):
- 知识可热更新:换库不换模型,今天的新闻明天就能用。
- 答案可溯源:能指出依据来自哪一段。
- 更小更省:论文中 4 亿参数的 RAG 在开放域问答上超过了参数量大得多的闭卷模型,说明"查资料"比"死记硬背"划算。
- 表达更灵活:不像抽取式方法必须原样抄原文片段,RAG 能自己组织语言。
局限在哪(这五个坑,就是后面几篇各自的出发点):
- 检索是一锤子买卖:查一次就定终身,查偏了就一路错到底 →T2 动态检索来解决。
- 从不问该不该查:简单问题也要走一遍检索,浪费还可能引入噪声 →T2 动态检索来解决。
- 噪声文档直接进 prompt:K 条里哪怕只有 2 条是垃圾,也会带偏答案 →T3 检索后治理来解决。
- 切块破坏语义:一刀切 100 词,可能把因果关系劈成两半 →T4 知识组织来解决。
- 单次检索做不了多跳:"《流浪地球》导演的母校在哪座城市"这种要连查两次的问题,它很难 → 同样由T2解决。
还有一个更隐蔽的坑:问法和说法对不上。你问"感冒了要不要吃消炎药",文档里写的是"上呼吸道感染多由病毒引起,抗生素无效"——一个字都不重合,检索直接落空。这是第三篇T1 查询侧增强要解决的事。
五、它为什么属于"无训练型":一个必须先说清楚的坑
这里要诚实,否则后面整个系列都会读歪:Lewis 2020 的原始 RAG 是训练过的。它的检索器(DPR,基于 BERT-base)和生成器(BART-large,4 亿参数)被端到端联合微调过,让检索器学会"去取对生成有用的段落"。
用本系列统一的训练部位三分法来判定,差别一目了然:
部位 | 原始 RAG 论文(Lewis 2020) | Naive RAG 落地范式(本系列 T0 基线) |
生成器 | BART-large 微调 | 冻结(直接调用现成 LLM) |
检索器 | DPR 微调 | 冻结(直接用现成 embedding 模型) |
判别器 / 分类器 | 无 | 无 |
判定结论:原始论文是训练型;本系列的 T0 基线是纯无训练。
那第一篇为什么还要读它?因为它提供的是思想地基,不是无训练的具体做法——"参数记忆 + 非参数记忆""先检索再生成""资料怎么融合"这三个想法,支撑了后面七篇的全部讨论。我们真正要对比的基线,是它的落地简化版 Naive RAG:冻结大模型、冻结现成检索器,检索 → 拼接 → 生成,一个参数都不动。
顺带把本系列的总口径一次说清:无训练型 RAG = 生成器与检索器全程冻结,只在检索侧、流程侧、提示词上做改造。至于"用现成的预训练模型算不算训练"这类边界问题,第六篇会专门讨论。
六、一个能记住它的类比:开卷考试里的三种考生
想象一场开卷考试,几种考生的差别,正好对应本系列的几类方法:
- Naive RAG(本篇,T0):翻开书,找到啥就抄啥,不检查书对不对、也不检查抄得对不对。简单,但容易被带偏——这就是我们系列的起点。
- 先把问题想清楚的考生(T1):知道自己要找什么,先把问法换成书里可能用的说法,再去翻——找得更全。
- 边写边查的考生(T2):写到哪句没把握了,就现场再翻一次书,一句一句往前推。
- 找完之后先审一遍的考生(T3):翻到的资料不急着抄,先请人帮忙判断"这几页到底有没有用",只把有用的留下。
- 而原始 RAG 论文里的模型,更像一个考前刷过大量真题、连"翻书的肌肉记忆"都练过的考生——训练有效,但我们不一定有那个算力。
七、小结与下一篇预告
这一篇我们只需要记住三件事:RAG 的动机是把闭卷变开卷;Naive RAG 的骨架是"检索 → 拼接 → 生成",检索找的是语义相近的向量而不是关键词,它的开销记为 1×,是后面所有对比的分母;"无训练"指的是生成器与检索器全程冻结,原始 RAG 论文只是思想地基,本身是训练型的。
而 T0 最大的软肋也很清楚:它对检索质量完全不设防——查得准不准没人管,查回来是不是垃圾也没人管。
下一篇我们先不急着往里塞零件,而是读Modular RAG(arXiv 2407.21059):它不提新算法,只给整个 RAG 领域画一张"乐高说明书"——一个 RAG 系统能拆成哪些模块、每个模块里有哪些可替换的零件、零件之间又能怎么拼。有了这张图纸,后面 T1 到 T4 的每一个方法,你都能一眼看出它改的是哪一块积木。
📊 本篇指标卡(系列统一字段,八篇汇总即对比矩阵)
维度 | 本篇:Naive RAG(T0 基线) |
类型归属 | T0 基线型 |
训练依赖(生成器 / 检索器 / 判别器) | 冻结 / 冻结 / 无 |
改造位置 | 无——这是全系列所有对比的基准线 |
额外开销 | 1×(基准值,其余各篇均以此为分母) |
是否需白盒访问 | 否 |
论文报告指标 | Lewis 2020 在 NQ / TriviaQA / WebQuestions 上取得开放域问答 SOTA(实验条件:BART-large + DPR,Wikipedia 2100 万段落,K = 5/10)。⚠️ 原论文为训练型(联合微调),本系列取的是它"冻结参数、直接拼接"的落地范式 |
抗噪性 | 弱——K 条里混入噪声会直接带偏答案,无任何过滤机制 |
拒答能力 | 无——库里没答案时仍会硬凑一个 |
适用边界 | 事实型、单跳、答案可直接从某一段摘出的问题;多跳、长文本生成、高噪声检索场景不适用 |
附:本篇术语小抄
术语 | 一句话解释 |
RAG | 检索增强生成:先查资料,再让模型基于资料作答 |
Naive RAG | 最朴素的 RAG:检索 → 拼进提示词 → 生成,不训练任何参数(本系列 T0 基线) |
幻觉 | 模型一本正经地编造不存在的事实 |
上下文窗口 | 模型一次能读进去的字数上限 |
Embedding(向量) | 把文字变成一串数字,语义近则距离近 |
DPR | 稠密段落检索器,用"双塔"编码器把问题和段落放到同一空间比距离 |
Top-K | 只取最相似的 K 条结果 |
Chunk(切块) | 把长文档切成小段,便于检索和塞进上下文 |
参数记忆 / 非参数记忆 | 模型脑子里写死的知识 / 外部可随时更换的文档库 |
无训练型 RAG | 生成器与检索器全程冻结,只在检索侧与流程侧改造 |
训练部位三分法 | 分别判定生成器 / 检索器 / 判别器是否训练,用来裁定方法归属 |
版权声明:本文为原创学习笔记,转载请注明出处。系列标签:#RAG #检索增强生成 #NaiveRAG #大模型 #论文精读 #无训练RAG #课程笔记下一篇预告:Modular RAG(arXiv 2407.21059)——给整个 RAG 领域画一张乐高说明书