跳到正文

RAG向量化:分块与Embedding

文档分块、Embedding 模型选择、余弦相似度匹配与优化

原题:请详细说明RAG系统中文档和查询的向量化过程,包括使用的嵌入模型、文本分块策略、向量归一化等处理方式,并解释向量匹配(如余弦相似度)的实现原理及优化手段。

文档处理 · 安克科技真题

30 秒回答

  1. 嵌入模型的选型原则与主流方案(OpenAI、BGE、M3E等)
  2. 文本分块的核心策略(固定长度、语义分块、递归分块等)及边界处理
  3. 向量归一化的作用与L2归一化实现
  4. 余弦相似度的数学原理与计算优化

回答与解析

答案要点

  • 嵌入模型的选型原则与主流方案(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. 问法 1 · 场景切入

    我看你做过文档问答系统。假设用户上传了一本手册,我们把它切段后向量化,上线后用户问问题。你怎么决定切多长?重叠窗口怎么设?嵌入模型选哪个?

  2. 问法 2 · 层层追问

    向量检索怎么算距离的?……归一化之后余弦相似度和点积是什么关系?……那如果数据量上亿,暴力算太慢,有什么优化手段?

  3. 问法 3 · 直球架构

    讲一下RAG的向量化流程,从文本分块策略、嵌入模型选型,到向量归一化和余弦相似度计算,再介绍ANN索引(比如HNSW)的原理和适用场景。

同模块相关题目