04.大模型是如何“查资料”并回答的:RAG 检索与生成原理详解

发布时间:2026/10/27 10:31:14
04.大模型是如何“查资料”并回答的:RAG 检索与生成原理详解

摘要:本文系统拆解大模型“根据用户问题查资料并回答”的完整链路:离线阶段完成文档解析、文本切分、Embedding 向量化与向量库入库;在线阶段完成问题改写、向量检索、混合检索与重排,再把候选资料拼装进 Prompt,由大模型自回归逐 token 生成答案,最后经引用校验与后处理返回。文章同时说明余弦相似度只是向量召回环节的一种度量方式,内积、L2 距离、BM25、RRF 融合与 Cross-Encoder 重排等机制共同决定最终回答质量。

目录

一、先厘清一个常见误解

二、整体链路:一次问答到底发生了什么

三、离线阶段:资料是怎么变成“可检索”的

3.1 文档解析与清洗

3.2 文本切分(Chunking)

3.3 向量化(Embedding)

3.4 写入向量数据库

四、在线阶段:用户提问后发生了什么

4.1 问题理解与改写

4.2 向量检索

4.3 混合检索:不止向量一种

4.4 重排(Rerank)

五、上下文组装:模型看到的到底是什么

六、生成阶段:模型如何“组装文字”

6.1 自回归逐 token 生成

6.2 注意力机制如何利用资料

6.3 解码策略的影响

七、后处理与质量保障

八、回答“是不是只有余弦相似度”

九、常见误区与工程建议

9.1 三个常见误区

9.2 提升效果的实践方向

十、小结

一、先厘清一个常见误解

很多人以为,模型“根据用户问题去查资料”是模型自己主动上网搜索、自己判断哪段资料有用、自己把答案拼起来。实际上,在绝大多数企业级应用里,这套流程是由外部工程系统编排完成的,模型本身只负责其中“理解问题”和“组织语言”两个环节。

换句话说,模型并不具备“打开数据库翻页”的能力。真正做检索的是向量数据库、搜索引擎或关键词索引;真正决定“用哪几段资料”的是检索与重排模块;模型拿到的是被塞进上下文窗口的一段文本,然后基于这段文本生成回答。

这套“先检索、再生成”的范式,通常被称为RAG(Retrieval-Augmented Generation,检索增强生成)。

二、整体链路:一次问答到底发生了什么

把一次完整的 RAG 问答拆开,大致可以分为离线建库和在线问答两个阶段。

flowchart TD A[原始文档 PDF/Word/网页] --> B[解析与清洗] B --> C[文本切分 Chunking] C --> D[Embedding 模型编码] D --> E[(向量数据库)] Q[用户问题] --> F[问题改写/扩展] F --> G[Embedding 编码] G --> H[向量检索 Top-K] E --> H H --> I[重排 Rerank] I --> J[上下文组装 Prompt] J --> K[大模型生成回答] K --> L[引用标注与后处理]

下面按顺序说明每个环节的原理。

三、离线阶段:资料是怎么变成“可检索”的

3.1 文档解析与清洗

原始资料往往是 PDF、Word、HTML 或数据库记录,需要先抽取纯文本,去掉页眉页脚、导航栏、乱码等噪声。表格和图片通常还要单独处理,比如把表格转成结构化文本,或用多模态模型生成图片描述。

3.2 文本切分(Chunking)

模型上下文窗口有限,不能把整本书塞进去,所以要把长文档切成几百字一段的“块”。切分策略直接影响检索质量:

  • 固定长度切分:按 token 数或字符数硬切,简单但容易把一句话切断。
  • 按语义边界切分:优先在段落、标题、句号处断开,保留语义完整性。
  • 重叠切分:相邻块保留一定重叠(如 10%~20%),避免关键信息正好落在边界上被割裂。
  • 结构化切分:按 Markdown 标题层级、代码函数、表格行等结构单元切分。

3.3 向量化(Embedding)

每个文本块会被一个 Embedding 模型编码成一个高维向量,例如 768 维或 1024 维的浮点数数组。这个向量的含义是:语义相近的文本,其向量在空间中的距离也相近。

注意,这里用的 Embedding 模型和生成回答的大模型通常是两个不同的模型。前者负责“把语义压缩成坐标”,后者负责“读懂上下文并写答案”。

3.4 写入向量数据库

向量连同原始文本、来源、章节、时间等元数据一起写入向量数据库(如 Milvus、Qdrant、pgvector、FAISS 等)。数据库会建立近似最近邻(ANN)索引,例如 HNSW、IVF,用来在百万级向量中快速找到最相近的若干条。

四、在线阶段:用户提问后发生了什么

4.1 问题理解与改写

用户的原始问题往往很短、有指代、有省略。系统通常会先做一轮处理:

  • 指代消解:把“它”“这个方案”替换成前文中的具体对象。
  • 查询扩展:补充同义词、专业术语,或让模型生成多个不同角度的子查询。
  • 意图识别:判断这是知识问答、闲聊还是需要调用工具,从而决定走不走检索。

4.2 向量检索

把改写后的问题同样用 Embedding 模型编码成向量,然后在向量库中做相似度搜索,取回 Top-K(常见 K=5~50)个候选块。

这一步的核心是相似度度量。常见的有:

度量方式计算含义特点
余弦相似度两向量夹角的余弦值只看向量方向,不受长度影响,最常用
内积(Dot Product)向量逐元素相乘再求和向量已归一化时等价于余弦相似度
欧氏距离(L2)空间中两点的直线距离距离越小越相似,对向量模长敏感

所以,余弦相似度只是其中一种度量,并不是唯一方式。很多向量库默认用内积,因为归一化后计算更快;也有系统用 L2 距离。选哪种更多取决于 Embedding 模型的训练方式,而不是“必须用余弦”。

4.3 混合检索:不止向量一种

纯向量检索擅长语义匹配,但对精确关键词、编号、人名、代码符号不敏感。比如用户问“错误码 E1024 是什么”,向量检索可能召回一堆语义相近但编号不同的内容。因此工业界普遍采用混合检索:

  • 稀疏检索:BM25、TF-IDF 等关键词算法,擅长精确匹配。
  • 稠密检索:向量相似度,擅长语义泛化。
  • 融合排序:用 RRF(Reciprocal Rank Fusion)或加权分数把两路结果合并。

此外还有基于知识图谱的检索、基于 SQL 的结构化查询、基于规则的过滤(按时间、权限、文档类型)等。检索从来不是单一手段。

4.4 重排(Rerank)

向量检索用的是“双塔”结构,问题和文档分别编码,速度快但精度有限。取回 Top-K 后,通常再用一个 Cross-Encoder 重排模型,把“问题 + 候选块”拼在一起打分,精度更高但计算更贵,所以只对少量候选做。

重排之后,往往还会做去重、按来源多样性筛选、按时间新鲜度加权,最终留下 3~10 个真正要喂给模型的块。

五、上下文组装:模型看到的到底是什么

检索完成后,系统会把选中的文本块按模板拼成一段 Prompt,大致结构如下:

你是一个严谨的知识助手,请仅依据以下资料回答问题。 如果资料中没有答案,请明确说明“资料中未提及”,不要编造。 【资料 1】来源:产品手册 第 3 章 ……文本内容…… 【资料 2】来源:运维文档 第 7 节 ……文本内容…… 【用户问题】 如何配置超时重试? 【回答要求】 先给结论,再给步骤; 引用资料时标注编号; 不要输出资料之外的内容。

这里有几个关键点:

  • 资料是“贴”进去的,不是模型“查”出来的。模型看到的只是这段拼接好的文本。
  • 顺序和编号很重要,方便模型引用,也方便前端做溯源高亮。
  • 约束指令决定行为边界,比如“资料中没有就说没有”,这是抑制幻觉的主要手段之一。

六、生成阶段:模型如何“组装文字”

6.1 自回归逐 token 生成

大模型本质是一个“下一个 token 预测器”。它把整段 Prompt(系统指令 + 资料 + 问题)编码成内部表示,然后一个 token 一个 token 地往外吐。每生成一个 token,就把它接到输入后面,再预测下一个,直到遇到结束符或达到长度上限。

所以“组装文字”并不是模型先在脑子里写好整篇再输出,而是边想边写、逐步展开的过程。

6.2 注意力机制如何利用资料

Transformer 的自注意力机制让每个输出位置都能“回看”输入中的所有位置。生成答案时,模型会根据当前要写的内容,动态地把注意力分配到资料中的相关句子上。这就是为什么它能把分散在多个块里的信息整合成一段连贯回答。

但要注意:注意力是软对齐,不是数据库查询。模型可能关注错位置,也可能把两段资料的内容混在一起,这正是幻觉的来源之一。

6.3 解码策略的影响

同样的上下文,不同的解码参数会得到不同风格的回答:

  • Temperature:越低越确定、越保守;越高越发散、越有创造性,也越容易跑偏。
  • Top-p / Top-k:控制候选词范围,影响用词的多样性和稳定性。
  • 重复惩罚:抑制复读机式的重复输出。

知识问答场景通常用较低温度,保证答案稳定、忠于资料。

七、后处理与质量保障

模型输出之后,系统通常还会做几件事:

  1. 引用校验:检查回答中标注的编号是否真实存在于资料中,防止“编造引用”。
  2. 事实一致性检查:用另一个模型或规则判断回答是否与资料矛盾。
  3. 格式规范化:把输出整理成 Markdown、JSON 或前端需要的结构。
  4. 敏感内容过滤:按合规要求拦截不当内容。
  5. 反馈闭环:记录用户点赞/点踩,用于优化切分策略、检索权重和 Prompt 模板。

八、回答“是不是只有余弦相似度”

结论很明确:不是。余弦相似度只是向量检索环节中的一种相似度度量,而整个问答链路里还有大量非相似度的机制在起作用。

环节是否依赖余弦相似度实际使用的方法
文本切分否规则、语义边界、结构解析
关键词召回否BM25、TF-IDF、倒排索引
向量召回可能是余弦、内积、L2 距离、ANN 索引
结果融合否RRF、加权打分、规则过滤
重排否Cross-Encoder 打分模型
上下文组装否模板拼接、长度截断、去重
答案生成否自注意力、自回归解码
后处理否引用校验、一致性检查、规则过滤

可以这样理解:余弦相似度负责“从海量资料里粗筛出一小撮可能相关的”,而“判断哪条真正相关”“怎么组织成通顺答案”靠的是重排模型和生成模型的能力。

九、常见误区与工程建议

9.1 三个常见误区

  • 误区一:模型自己会上网查。除非显式接入搜索工具(Tool Calling),否则模型只能看到 Prompt 里的内容。
  • 误区二:向量检索越相似越正确。语义相似不等于事实正确,编号、否定词、时间条件都可能被相似度忽略。
  • 误区三:检索到就一定答对。资料进了上下文,模型仍可能理解错、漏读、或过度概括。

9.2 提升效果的实践方向

  • 切分要贴合业务结构:FAQ 按问答对切,手册按章节切,代码按函数切。
  • 混合检索优先:向量 + 关键词,再加重排,通常比单一向量检索稳定得多。
  • 元数据过滤前置:按权限、时间、产品线先过滤,再算相似度,能显著减少噪声。
  • Prompt 明确边界:要求“仅依据资料回答”“无答案时说明”,并给出引用格式。
  • 建立评测集:用真实问题构造召回率、准确率、引用正确率的评测,避免凭感觉调参。
  • 保留溯源链路:前端展示引用来源,既提升可信度,也方便排查错误。

十、小结

模型“根据用户问题查资料并回答正确”,本质是一条由多个模块协作的工程链路:文档被切分、编码、入库;问题被改写、编码、检索;候选被重排、筛选、拼进 Prompt;模型基于这段上下文逐 token 生成答案;最后经过校验与后处理返回给用户。

余弦相似度只是这条链路中向量召回环节的一种度量方式,既不是唯一手段,也不是决定答案正确性的关键。真正决定效果的,是切分质量、检索策略、重排精度、上下文组织和生成约束的共同作用。