摘要:本文系统拆解大模型“根据用户问题查资料并回答”的完整链路:离线阶段完成文档解析、文本切分、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:控制候选词范围,影响用词的多样性和稳定性。
- 重复惩罚:抑制复读机式的重复输出。
知识问答场景通常用较低温度,保证答案稳定、忠于资料。
七、后处理与质量保障
模型输出之后,系统通常还会做几件事:
- 引用校验:检查回答中标注的编号是否真实存在于资料中,防止“编造引用”。
- 事实一致性检查:用另一个模型或规则判断回答是否与资料矛盾。
- 格式规范化:把输出整理成 Markdown、JSON 或前端需要的结构。
- 敏感内容过滤:按合规要求拦截不当内容。
- 反馈闭环:记录用户点赞/点踩,用于优化切分策略、检索权重和 Prompt 模板。
八、回答“是不是只有余弦相似度”
结论很明确:不是。余弦相似度只是向量检索环节中的一种相似度度量,而整个问答链路里还有大量非相似度的机制在起作用。
| 环节 | 是否依赖余弦相似度 | 实际使用的方法 |
|---|---|---|
| 文本切分 | 否 | 规则、语义边界、结构解析 |
| 关键词召回 | 否 | BM25、TF-IDF、倒排索引 |
| 向量召回 | 可能是 | 余弦、内积、L2 距离、ANN 索引 |
| 结果融合 | 否 | RRF、加权打分、规则过滤 |
| 重排 | 否 | Cross-Encoder 打分模型 |
| 上下文组装 | 否 | 模板拼接、长度截断、去重 |
| 答案生成 | 否 | 自注意力、自回归解码 |
| 后处理 | 否 | 引用校验、一致性检查、规则过滤 |
可以这样理解:余弦相似度负责“从海量资料里粗筛出一小撮可能相关的”,而“判断哪条真正相关”“怎么组织成通顺答案”靠的是重排模型和生成模型的能力。
九、常见误区与工程建议
9.1 三个常见误区
- 误区一:模型自己会上网查。除非显式接入搜索工具(Tool Calling),否则模型只能看到 Prompt 里的内容。
- 误区二:向量检索越相似越正确。语义相似不等于事实正确,编号、否定词、时间条件都可能被相似度忽略。
- 误区三:检索到就一定答对。资料进了上下文,模型仍可能理解错、漏读、或过度概括。
9.2 提升效果的实践方向
- 切分要贴合业务结构:FAQ 按问答对切,手册按章节切,代码按函数切。
- 混合检索优先:向量 + 关键词,再加重排,通常比单一向量检索稳定得多。
- 元数据过滤前置:按权限、时间、产品线先过滤,再算相似度,能显著减少噪声。
- Prompt 明确边界:要求“仅依据资料回答”“无答案时说明”,并给出引用格式。
- 建立评测集:用真实问题构造召回率、准确率、引用正确率的评测,避免凭感觉调参。
- 保留溯源链路:前端展示引用来源,既提升可信度,也方便排查错误。
十、小结
模型“根据用户问题查资料并回答正确”,本质是一条由多个模块协作的工程链路:文档被切分、编码、入库;问题被改写、编码、检索;候选被重排、筛选、拼进 Prompt;模型基于这段上下文逐 token 生成答案;最后经过校验与后处理返回给用户。
余弦相似度只是这条链路中向量召回环节的一种度量方式,既不是唯一手段,也不是决定答案正确性的关键。真正决定效果的,是切分质量、检索策略、重排精度、上下文组织和生成约束的共同作用。