RAG向量化:分块与Embedding
文档分块、Embedding 模型选择、余弦相似度匹配与优化
原题:请详细说明RAG系统中文档和查询的向量化过程,包括使用的嵌入模型、文本分块策略、向量归一化等处理方式,并解释向量匹配(如余弦相似度)的实现原理及优化手段。
文档处理 · 安克科技真题
30 秒回答
- 嵌入模型的选型原则与主流方案(OpenAI、BGE、M3E等)
- 文本分块的核心策略(固定长度、语义分块、递归分块等)及边界处理
- 向量归一化的作用与L2归一化实现
- 余弦相似度的数学原理与计算优化
回答与解析
答案要点
- 嵌入模型的选型原则与主流方案(OpenAI、BGE、M3E等)
- 文本分块的核心策略(固定长度、语义分块、递归分块等)及边界处理
- 向量归一化的作用与L2归一化实现
- 余弦相似度的数学原理与计算优化
- ANN近似最近邻算法(HNSW、IVF等)的应用场景
一、嵌入模型选型
| 场景 | 推荐方案 | 特点 |
|---|---|---|
| 通用中文 | BGE-large-zh、M3E-base | 开源、可私有化部署 |
| 多语言 | E5-multilingual、OpenAI text-embedding-3 | 跨语言检索能力强 |
| 垂直领域 | 领域微调(如法律、医疗) | 用领域数据微调通用模型 |
关键考量:维度(通常768/1024/1536)、上下文长度(512-8k)、是否支持指令式嵌入(如BGE的Represent this sentence...)
二、文本分块策略
常见方法:
- 固定长度分块:按token数切分,长度作为候选变量;实现简单但可能切断语义
- 递归分块:先按段落/句子切,超长再细分,保持结构完整
- 语义分块:用模型判断语义边界(如BERT-based分割器)
优化技巧:
- 比较零重叠、短窗口和较长窗口,用同一评测集验证是否减少边界信息丢失
- 保留元数据(标题、章节、时间戳),用于重排序过滤
三、向量归一化
# L2归一化:将向量映射到单位球面
import numpy as np
vector_norm = vector / np.linalg.norm(vector)
作用:消除模长差异,使余弦相似度等价于点积,加速计算
四、向量匹配原理与优化
余弦相似度: $\text{sim}(A,B) = \frac{A \cdot B}{|A||B|}$
归一化后简化为点积,可用矩阵运算批量加速
检索优化:
- 精确检索:暴力计算,适合万级数据
- ANN近似检索:
- HNSW:图索引,高召回、低延迟,适合在线服务
- IVF-FLAT:聚类分桶,平衡速度与精度
- 量化压缩(PQ/SQ):降低内存,适合十亿级向量
工程实践:先ANN粗排取Top-K,再用Cross-Encoder精排,最后按相关性阈值过滤
口语版讲法(约4分钟)
- 本质是语义搜索的工程化落地
- 嵌入模型选型要按场景分,通用和垂直不一样
- 文本分块策略要兼顾语义完整和检索精度,重叠窗口是标配
- 向量匹配优化从余弦相似度到ANN,线上常用HNSW加粗排
- 落地风险:分块不合理、模型不匹配、阈值设置不当
这道题问的是RAG的向量化过程,其实本质是在问:怎么把非结构化文本转成机器能高效检索的语义表示,并且这个转换要能支撑实际业务。我不会去背一遍原理,而是按我理解的技术选型和工程落地说一下。
先说嵌入模型选型。很多人觉得直接拿个通用模型就行,但真正落地会发现,场景不同,选择差异很大。比如通用中文场景,我会用BGE-large-zh或者M3E,它们开源、能私有化部署,维度一般是768到1024,上下文长度够用。但如果业务是多语言,比如要检索中英文混合的文档,那E5-multilingual或者OpenAI的text-embedding-3更合适,跨语言对齐能力更强。再一个,如果是垂直领域,比如法律合同或者医疗报告,通用模型效果会打折扣,我倾向拿领域数据微调一下,哪怕只微调几百条,语义匹配的精度提升也很明显。这里有个边界:如果文档本身是结构化或者关键词密集的,比如订单号、错误码,那向量搜索不一定比BM25好,混合检索才是正解。
然后说文本分块策略,这是最容易被低估的坑。固定长度分块最简单,但具体token数要作为候选变量;它经常把一句话或者一个逻辑段切两半,导致检索时上下文不完整。递归分块会好一些,先按段落切,超长了再细分,尽量保持语义边界。还有语义分块,用模型判断边界,精度最高但计算成本也高。我的做法是:先比较递归分块、结构分块以及零重叠、短窗口、较长窗口,用同一评测集判断边界证据是否更完整。举个例子,客服退款场景下,一个退款政策文档里,不同条款之间有引用关系,如果分块切断了,检索到一半政策,模型可能误解。还有,我会保留元数据,比如标题、章节号,这样在重排时能辅助过滤。
向量归一化这块,很简单,L2归一化把向量长度变成1,这样余弦相似度等价于点积,计算能直接走矩阵乘法,在Faiss里批量检索快很多。
接下来是向量匹配。余弦相似度公式大家都知道,但归一化后就是点积,所以实际计算我用点积。精确检索适合万级以下数据,再大就必须上ANN。我常用的是HNSW,图索引结构,召回率高,延迟低,适合线上服务。如果数据量到了亿级,内存扛不住,就加IVF-PQ做量化压缩,牺牲一点精度换内存。工程上,我会先走ANN粗排,取Top-100,再用Cross-Encoder精排,最后按相关性阈值过滤。这个流程在电商场景里做满减政策检索,效果很稳。
这里有个延伸点:分块策略和嵌入模型其实是耦合的。比如你用了长上下文模型,分块可以更大,但检索精度可能会因为噪声增加而下降。怎么调这个平衡,我觉得要看具体业务对召回率和准确率的要求。
落地风险方面,我特别关注三点:一是分块不合理导致检索结果碎片化;二是嵌入模型和业务语言不匹配,比如金融术语通用模型没学好;三是阈值设置太严或太松,影响用户体验。上线前我会用一批真实query回放,对比Recall@K和延迟,通过才切换。
所以,我更倾向把向量化看成一条流水线,每个环节都要根据业务场景做选择,没有银弹。
关键一句:分块策略和嵌入模型是耦合的,长上下文模型允许更大分块,但噪声增加可能降低精度,需要业务调优。
面试官还可能这样问
- 问法 1 · 场景切入
我看你做过文档问答系统。假设用户上传了一本手册,我们把它切段后向量化,上线后用户问问题。你怎么决定切多长?重叠窗口怎么设?嵌入模型选哪个?
- 问法 2 · 层层追问
向量检索怎么算距离的?……归一化之后余弦相似度和点积是什么关系?……那如果数据量上亿,暴力算太慢,有什么优化手段?
- 问法 3 · 直球架构
讲一下RAG的向量化流程,从文本分块策略、嵌入模型选型,到向量归一化和余弦相似度计算,再介绍ANN索引(比如HNSW)的原理和适用场景。