刚接触 RAG 时,我把它理解成“接上知识库的聊天机器人”。但这个说法解释不了几个问题:资料放在哪里?每次回答都要读完整个知识库吗?答错了,该检查模型还是检索?
这篇笔记整理自“学习RAG基础知识”的正式第一课,先弄清一次问答的流程,再考虑框架怎么用。
文中的知识库规模、切块参数、检索分数和问答场景均为教学示意。真实 Embedding 检索与 BioRAG 项目留待后续实践。
从一个我会真正关心的问题出发
假设收集了 100 篇可变剪接论文,然后问模型:
SUPPA2 在什么情况下无法计算 differential splicing 的 p-value?
模型可能了解 SUPPA2,却未必读过这批论文。回答再流畅,也需要核对方法依据。
自己处理这个问题时,通常会先查论文或软件文档,找到统计检验的相关段落,核对版本和适用条件,再作答。
RAG(Retrieval-Augmented Generation,检索增强生成)采用类似流程:先检索相关资料,再交给大语言模型据此回答。
三个词分别对应三个动作:
| 环节 | 我对它的理解 |
|---|---|
| Retrieval,检索 | 从资料库中找到可能回答问题的内容 |
| Augmentation,增强 | 把资料与问题一起放入模型本次可见的上下文 |
| Generation,生成 | 由模型阅读这些内容,组织答案 |
可以把它想成开卷考试:检索器找书页,模型阅读并回答。翻错页和读错内容都可能导致答错,评价时需要分开检查。
一张图,把建库和问答分开
“问题 → RAG → 答案”还太笼统。拆成建库和问答两个阶段,各组件的作用才清楚。
图 1|以向量检索为例的基础 RAG。建库在资料接入或更新时进行;问答时读取已有索引。点击图片可查看大图。
建库阶段(Indexing):解析 PDF、网页、Word 等资料,切块、生成向量,保存原文和来源信息。通常不必每次提问都重新建库。
问答阶段:编码问题、检索片段,再将问题、资料和回答要求组成提示,交给模型。
图中,原始问题还会直接进入最终提示:向量用于检索,原始问题告诉模型要回答什么。检索结果也要带回片段原文,模型不能只拿到向量。
图中采用向量检索。RAG 也可使用关键词或混合检索,不一定需要向量数据库。
为什么不把所有论文一次塞进去?
假设每篇论文 8,000 tokens,100 篇约有 800,000 tokens,而一个问题可能只涉及几篇中的几个段落。这个估算仅作示意,不代表所有模型的上下文限制。
全部输入可能增加费用和等待时间,也会带入无关内容。RAG 按问题筛选资料,缩小模型的阅读范围;代价是检索可能漏掉证据。
Chunk:先把资料切成能读懂的片段
Document 是原始资料,Chunk 是切分后的文本块。这条流程通常以 Chunk 为检索单位。
一篇 SUPPA2 论文包含背景、方法、统计分析和性能比较。查某个检验步骤时,切块能帮助检索定位到方法段落。
切块还要保留语义。句子、限定条件或表格注释一旦被切断,片段就可能难以读懂。
图 2|Overlap 为边界处的语义留出缓冲。100/20 仅用于画图说明,并非通用参数建议。
块太大容易夹带无关内容,太小容易失去上下文。适当重叠能减少边界信息丢失,也会增加重复和存储开销。
第一课还举过 500 tokens / 100 tokens overlap 的例子。实际设置时,要明确单位是 token、字符还是词,再结合标题、段落和表格结构调整。
Embedding:让问题和资料能够比较
问题与相关段落未必用同样的措辞。例如,“RNA-seq differential expression”和“Differential gene expression from RNA sequencing”都在讨论相近的内容。
Embedding 模型将文本映射为向量。合适的模型通常让语义相关的文本在向量空间中更接近。问题与资料的编码方式必须兼容,才能比较。Sentence Transformers 的语义检索文档说明了这一过程,并区分问题和文档的编码方式。
图 3|左侧是为了理解而绘制的二维示意,不是真实向量降维结果;右侧分数也为人为设定,不是模型实测值。
“接近”由相似度或距离度量定义。常用的余弦相似度比较两个非零向量的方向,具体计算留到下一课。
语义相似的片段未必包含答案。SUPPA2 的背景介绍可能与问题接近,却没有说明 p-value 无法计算的条件。检索后仍要查看原文。
Retriever 与 Top-K:找到候选,还要判断是否够用
Retriever 负责检索。向量检索时,它根据问题向量查找相近的文档块,返回对应原文和来源。
top_k = 3 表示取前三个候选。图 3 的分数仅为示意,不是答案正确率;“超过 0.8 就相关”也不是通用门槛。
K 太小可能漏掉证据,太大可能带入重复或无关片段。即使知识库没有答案,Top-K 仍可能返回结果,因此还要判断证据是否够用。
资料少时可逐个比较向量,规模增大后可用索引或数据库加速。第一课提到 FAISS、Milvus、Qdrant 等工具,其中 FAISS 是向量相似度搜索与聚类库,与提供更完整数据管理能力的向量数据库有所区别。
准备做论文知识库时,每个片段还应保存标题、作者、年份、DOI、章节或页码,方便回到原文核对。
Augmentation:增强的是本次上下文
基础 RAG 在回答时将外部资料放入上下文,通常不修改模型参数。
Context 是模型本次可见的内容,包括检索片段。Prompt 把问题、资料和回答要求组织起来,例如:
请依据下列资料回答问题。
资料:
[1] 片段原文(文档标题、章节或页码、版本)
[2] 片段原文(文档标题、章节或页码、版本)
问题:SUPPA2 在什么情况下无法计算 differential splicing 的 p-value?
请在相应论断旁标注资料编号。
如果资料不足,请说明还缺少什么依据。
这是提示模板,未填入真实的 SUPPA2 结论;作答前还需检索并核对文档。
随后进入 Generation,模型根据问题和上下文生成回答。引用编号便于核验,仍需检查原文是否支持对应论断。
RAG、微调和后面的优化,各自改变什么?
区分 RAG 和 Fine-tuning(微调),可以看它们主要改变什么:
| 比较点 | 基础 RAG | 微调 |
|---|---|---|
| 主要改变 | 本次输入的资料与上下文 | 模型参数 |
| 更新资料的常见做法 | 更新文档及索引 | 准备训练数据并训练 |
| 常见目标 | 让回答使用指定或新近资料 | 调整任务表现、输出格式或行为 |
| 来源核验 | 可以保留片段与元数据,引用仍要检查 | 参数更新本身不提供逐条来源 |
要回答昨天更新的内部 SOP,可先考虑检索正确版本;要调整任务行为或输出格式,再评估微调。这只是起步判断,两者也能结合。RAG 的经典论文就研究了检索与生成模型结合训练的方案。
后续的 BM25、Hybrid Search 和 Reranker,也各有分工:
| 组件或方法 | 在流程中帮什么忙 |
|---|---|
| BM25 等关键词检索 | 利用词项匹配;对基因名、软件版本、数据集编号等精确字符串值得保留这类信号 |
| Hybrid Search,混合检索 | 结合关键词与向量检索结果 |
| Reranker,重排序 | 对已经召回的候选做更细致的相关性排序 |
| LLM | 阅读最终提供的上下文并组织回答 |
“先召回 30 段,再重排选 6 段”是流程示例,不是推荐参数。第一课先认清各组件的位置,后续再实现。
回答错了,先看检索出了什么
排查 RAG 时,先看 Retriever 找到了什么。
图 4|用两个简化案例区分检索失败与生成失败。实际系统也可能两者同时存在,或知识库本身缺少正确资料。
知识库有答案却没有检索出来,应检查解析、切块、过滤和召回。上下文证据充分且正确,回答仍有误读或补造,则要检查提示和生成过程。
检索端评价“找到没有、漏掉多少”,后续会学习 Recall@K、MRR、NDCG 等指标。生成端检查答案是否忠实于资料、切合问题,以及引用能否支持论断。一次回答成功,不能说明整个系统可靠。
资料质量、检索和模型理解都可能出错。后续做系统时,除了展示依据,也要让它在资料不足时明确说明。
用自己的话,重新解释一遍
现在,用一句话解释 RAG:
RAG 就是让 AI 回答前,先从指定资料里找出相关片段,再带着这些资料回答,并留下可以回头核对的出处。
第一课的术语,可以这样记:
| 术语 | 一句话理解 |
|---|---|
| RAG | 检索资料、增强上下文、再生成答案的组合流程 |
| Document | 原始知识来源,如一篇论文 |
| Chunk | 从资料中切出的文本单元 |
| Embedding | 把文本映射成向量的过程或表示 |
| Vector | 用于比较的数值表示 |
| Semantic Search | 利用语义表示检索相关内容 |
| Retriever | 找出并返回相关资料的组件 |
| Top-K | 取排序靠前的 K 个候选 |
| Context | 模型本次可见的上下文,包括提供的检索资料 |
| Generation | 模型根据输入组织答案 |
复习时,可以试着回答这几道题:
- Embedding 模型和 LLM 分别负责什么?
- 为什么长论文通常需要切块?重叠解决了什么问题?
top_k = 5能否保证找到五条有用证据?- 证据已充分且正确,模型仍然答错,该优先检查哪一端?
- 要回答昨天新发布的 SOP,为什么通常先考虑检索这份资料?
展开我的参考答案
① Embedding 为检索提供可比较的数值表示,LLM 阅读上下文并组织回答。② 切块帮助定位局部内容,重叠减少边界信息丢失。③ 不能,Top-K 只表示排名与数量。④ 优先检查生成端,同时核对证据是否确实足够。⑤ 首先需要取得最新、正确版本的资料,而基础 RAG 能在回答时将它提供给模型。
下一课准备使用少量生物信息学短文本,完成真实的 Embedding、相似度计算和 Top-K 检索,观察返回结果。之后再逐步加入 PDF、切块、向量索引和 LLM,搭建 Biomedical Paper RAG。
读到 loader、splitter、embedding、vectorstore、retriever 或 prompt 时,也可以先在图 1 中找到它们的位置,再看具体实现。这是第一课留下的阅读代码的方法。
来源与继续阅读
本文主线整理自个人对话“学习RAG基础知识”中的正式课程《RAG 第 1 课:真正理解 RAG 的基本原理》,按个人学习笔记重写。四张解释图均为本文绘制的概念示意。
- Lewis 等,Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks:了解 RAG 的经典研究背景。
- Sentence Transformers:Semantic Search:继续学习文本编码与语义检索。
- FAISS 官方仓库:了解向量搜索库的定位。