Embedding 与向量化
Embedding 是把文本映射成高维向量的过程,核心性质:语义相近的文本在向量空间里距离近。“苹果发布会”的向量能靠近含“iPhone 发布”的段落,这是向量检索比关键词检索强的地方,也是 RAG 语义召回的基础。
双编码器与交叉编码器
两个经常被混淆的概念:
- 双编码器(Bi-Encoder):query 和 document 分别编码成向量,用余弦相似度或内积打分。文档向量可以离线算好存进向量库,检索时只编码 query,一次比对海量向量。检索阶段用它
- 交叉编码器(Cross-Encoder):query 和 document 拼接成一个输入,模型做细粒度相关性打分。精度高但必须逐对计算,无法预计算,成本高。重排阶段用它
生产里的标准分工:双编码器粗召回 Top-50,交叉编码器精排取 Top-5 到 10。
模型选型
| 考虑项 | 说明 |
|---|---|
| 语言匹配 | 中文场景优先中文优化的模型(bge 系列、m3e),通用模型对中文语义理解偏弱 |
| 最大输入长度 | bge-large-zh 约 512 token,text-embedding-3 支持 8191。块大小不能超过它,要留余量 |
| 向量维度 | 高维精度好但存储和检索开销大。部分模型支持 MRL 降维,用低维子向量 |
| 领域适配 | 法律、医疗等垂直领域,通用模型可能不够,需要领域微调的嵌入模型 |
| 归一化 | 文本向量通常做 L2 归一化,让余弦相似度和内积等价 |
检索时的两个细节
query 向量化用同一个模型。 索引阶段和检索阶段必须用同一个嵌入模型,换了模型整个索引要重建,因为不同模型的向量空间不可比。
query 通常做与文档向量同样的归一化处理,保证相似度分数可解释。
常见坑
- 换了嵌入模型忘记重建索引,检索结果莫名变差
- 块大小贴着嵌入模型窗口上限,长块被截断,向量语义残缺
- 混合语言语料用单语言模型,跨语言语义匹配差
- 向量维度选太高,小规模知识库白付存储和检索成本
面试追问
- Embedding 是什么? 文本到高维向量的映射,语义相近的文本向量距离近。这是语义检索的基础
- 双编码器和交叉编码器区别? 双编码器分别编码、可预计算、速度快,用于粗召回;交叉编码器拼接输入、精度高、逐对计算成本高,用于重排
- 为什么索引和检索要用同一个嵌入模型? 不同模型的向量空间不可比,换模型必须重建索引
- 块大小和嵌入模型什么关系? 块不能超过嵌入模型最大输入长度,超出会被截断、语义残缺。留余量
- 中文场景怎么选? 优先中文优化的模型(bge 系列),通用模型对中文语义理解偏弱。垂直领域考虑领域微调