RAG(Retrieval-Augmented Generation,检索增强生成)的核心思想是:先从外部知识库里检索出与问题相关的内容,再把这些内容连同问题一起交给 LLM 生成答案。它要解决的是大模型的几个天然短板:
RAG 系统在结构上分为两个阶段:离线(Offline)建索引 和 在线(Online)检索生成。理解这两个阶段的边界,是理解整个 RAG 的前提。
【离线 Offline:索引构建】
原始文档
↓ 解析 / 清洗(去噪、抽取正文)
↓ Chunking(分块)
文本块 chunks
↓ Embedding(向量化,跑完整 encoder + pooling)
chunk 向量
↓ 写入
Vector DB(向量库 + 可选稀疏索引 / 元数据)
【在线 Online:检索生成】
用户 Query
↓ Embedding(与 chunk 用同一套参数)
query 向量
↓ 检索(向量检索 + 稀疏检索 BM25 并行)
多路 Top-K 候选
↓ 融合(RRF:倒数排名融合)
合并后的候选列表
↓ Rerank(cross-encoder 精排,截取 Top-N)
精排后的少量 chunk
↓ Prompt 组装(context + 问题 + 指令)
↓ LLM 生成
最终答案
离线阶段决定了"知识以什么形态被存下来",在线阶段决定了"如何把最相关的那一小撮知识捞出来交给模型"。下面分阶段拆解。
原始资料的格式五花八门(PDF、Word、HTML、Markdown、网页、代码)。第一步是把它们解析成纯文本,并尽量保留结构信息(标题层级、表格、列表、代码块),同时去掉页眉页脚、导航栏等噪声。结构信息在后续的"结构感知分块"里非常有价值,不要在解析阶段就丢光。
文档通常太长,无法整篇向量化,也无法整篇塞进 LLM,所以要切成 chunk。两个核心参数是 chunk size(块大小) 和 chunk overlap(块重叠):
这两个参数不是固定的、也没有放之四海皆准的最优解,但有清晰的权衡框架。