嵌入模型深入


文档摘要

嵌入模型深入 本节摘要:Word2Vec 给你每个词一个向量,现代嵌入模型给你每段文本一个向量——跨语言,带稀疏、稠密、多向量三种视图,大小还能按你的索引裁。选错了,RAG 就捞错段落。你的 RAG 系统四成时候捞错段落,罪魁往往不是向量库也不是提示,而是嵌入模型。2026 选嵌入要在五条轴上权衡:稠密/稀疏/多向量、语言覆盖、上下文长度、维度预算、开源 vs 托管。本节逐一命名权衡:稠密嵌入按余弦排语义邻近是默认;稀疏(SPLADE 式)给每个词表 token 一个学习权重,强于关键词查询;多向量(ColBERTv2)每个 token 一个向量、用 MaxSim 打分,贵但在长查询与领域语料上胜出;BGE-M3 一个 checkpoint 同时输出三者;Matryoshka 让前 N

嵌入模型深入

本节摘要:Word2Vec 给你每个词一个向量,现代嵌入模型给你每段文本一个向量——跨语言,带稀疏、稠密、多向量三种视图,大小还能按你的索引裁。选错了,RAG 就捞错段落。你的 RAG 系统四成时候捞错段落,罪魁往往不是向量库也不是提示,而是嵌入模型。2026 选嵌入要在五条轴上权衡:稠密/稀疏/多向量、语言覆盖、上下文长度、维度预算、开源 vs 托管。本节逐一命名权衡:稠密嵌入按余弦排语义邻近是默认;稀疏(SPLADE 式)给每个词表 token 一个学习权重,强于关键词查询;多向量(ColBERTv2)每个 token 一个向量、用 MaxSim 打分,贵但在长查询与领域语料上胜出;BGE-M3 一个 checkpoint 同时输出三者;Matryoshka 让前 N 维就是个可用的小嵌入,1,536 截到 256 只掉约 1% 精度却省 6 倍存储。MTEB 排行榜讲了部分故事——它必要但不充分,总要在你自己的领域上跑。最后点明三层模式(稠密初筛→稀疏 RRF 提召回→多向量/交叉编码器提精确)是多数生产栈的默认。

对应原课程:Phase 5 · Lesson 22 · embedding-models-deep-dive(原英文 phases/05-nlp-foundations-to-advanced/22-embedding-models-deep-dive/docs/en.md)。前置依赖:第 03 节(Word2Vec)、第 14 节(信息检索)。

学习目标

阅读完本节,你应当能够:

  1. 在稠密、稀疏、多向量三种嵌入模式间按查询特征取舍,并说明 BGE-M3 如何一次输出三者。
  2. 解释 Matryoshka 表示学习为何能把 1,536 维安全截到 256,以及截过头会怎样。
  3. 区分对称与非对称编码,并识别「漏前缀」「上下文截断」等嵌入陷阱。
  4. MTEB 在自有领域上基准候选模型,而不盲信排行榜名次。

一、问题与直觉

你的 RAG 系统四成时候捞错段落。罪魁很少是向量库或提示,而是嵌入模型。

2026 选嵌入,要在五条轴上权衡:

  1. 稠密 vs 稀疏 vs 多向量:每段一个向量,还是每 token 一个,还是带权稀疏词袋。
  2. 语言覆盖:纯英语模型在纯英语任务上仍胜出,语料混合时多语模型胜出。
  3. 上下文长度:512 vs 8,192 vs 32,768——真实有效容量常常只有标称上限的 60~70%。
  4. 维度预算:3,072 个全精浮点 = 每向量 12 KB。一亿向量存储每月 1,300 美元。Matryoshka 截断省 4 倍。
  5. 开源 vs 托管:开源权重意味着你控栈与数据;托管意味着用控制权换「永远最新」。

三种嵌入模式:

  • 稠密嵌入:每段一个向量(常 384~3,072 维),余弦相似度按语义邻近排。OpenAI text-embedding-3-large、BGE-M3 稠密模式、Voyage-3。默认选择。
  • 稀疏嵌入:SPLADE 式。Transformer 给每个词表 token 预测一个权重,再把多数清零,得到大小为 |词表| 的稀疏向量。捕捉词法匹配(像 BM25)但权重是学出来的,关键词密集的查询上强。
  • 多向量(晚期交互):ColBERTv2、Jina-ColBERT。每 token 一个向量,用 MaxSim 打分:对每个查询 token 找最相似的文档 token,求和。存储与打分更贵,但在长查询与领域专用语料上胜出。
  • BGE-M3:三合一:单个模型同时输出稠密、稀疏、多向量表示。每种可独立查询,分数按加权和融合。2026 要从一个 checkpoint 得到灵活性时的默认。

💡 Matryoshka 表示学习:训练得使向量的前 N 维本身构成一个可用的独立嵌入。把 1,536 维向量截到 256 维,掉约 1% 精度换 6 倍存储节省。OpenAI text-3、Cohere v4、Voyage-4、Jina v5、Gemini Embedding 2、Nomic v1.5+ 都支持。

MTEB 排行榜讲了部分故事

Massive Text Embedding Benchmark——发布时(2022)跨 8 类任务 56 个,MTEB v2 扩到 100+ 任务。2026 年初,Gemini Embedding 2 拿下检索第一(67.71 MTEB-R);Cohere embed-v4 领跑通用(65.2 MTEB);BGE-M3 领跑开源多语(63.0)。排行榜必要但不充分——总要在你自己的领域上跑。

三层模式

用例 模式
快速初筛 稠密双编码器(BGE-M3、text-3-small)
提召回 稀疏(SPLADE、BGE-M3 sparse)+ RRF 融合
前 50 提精确 多向量(ColBERTv2)或交叉编码器重排器

多数生产栈三者都用。

二、从零实现

第 1 步:基线——用 Sentence-BERT 做稠密嵌入

from sentence_transformers import SentenceTransformer import numpy as np encoder = SentenceTransformer("BAAI/bge-small-en-v1.5") corpus = [ "The first iPhone launched in 2007.", "Apple released the iPod in 2001.", "Android is an operating system from Google.", ] emb = encoder.encode(corpus, normalize_embeddings=True) query = "When was the iPhone released?" q_emb = encoder.encode([query], normalize_embeddings=True)[0] scores = emb @ q_emb print(sorted(enumerate(scores), key=lambda x: -x[1]))

normalize_embeddings=True 使点积等于余弦相似度。总设上它。

第 2 步:Matryoshka 截断

def truncate(vectors, dim): out = vectors[:, :dim] return out / np.linalg.norm(out, axis=1, keepdims=True) emb_256 = truncate(emb, 256) emb_128 = truncate(emb, 128)

截断后要重新归一化。Nomic v1.5、OpenAI text-3、Voyage-4 训练得使这对前几级无损;非 Matryoshka 模型(原始 Sentence-BERT)截断时退化剧烈。

第 3 步:BGE-M3 多功能性

from FlagEmbedding import BGEM3FlagModel model = BGEM3FlagModel("BAAI/bge-m3", use_fp16=True) output = model.encode( corpus, return_dense=True, return_sparse=True, return_colbert_vecs=True, ) # output["dense_vecs"]: (n_docs, 1024) # output["lexical_weights"]: list of dict {token_id: weight} # output["colbert_vecs"]: list of (n_tokens, 1024) arrays

一次推理,三个索引。分数融合:

dense_score = ... # dense_vecs 上的余弦 sparse_score = model.compute_lexical_matching_score(q_lex, d_lex) colbert_score = model.colbert_score(q_col, d_col) final = 0.4 * dense_score + 0.2 * sparse_score + 0.4 * colbert_score

权重在你领域上调。

第 4 步:自定义任务上的 MTEB 评估

from mteb import MTEB tasks = ["ArguAna", "SciFact", "NFCorpus"] evaluation = MTEB(tasks=tasks) results = evaluation.run(encoder, output_folder="./mteb-results")

有代表性的子集上跑候选模型。别只信排行榜名次——你的领域要紧。

第 5 步:从零手搓余弦

code/main.py。纯标准库的平均哈希技巧嵌入。不能与 Transformer 嵌入竞争,但展示了形状:分词 → 向量 → 归一化 → 点积。

三、框架对比

陷阱

  • 查询与文档用同一编码路径:有些模型(Voyage、Jina-ColBERT)用非对称编码——查询与文档走不同路径。总查模型卡。
  • 漏前缀:bge-* 模型需要给查询前缀「Represent this sentence for searching relevant passages: 」。忘了就掉 3~5 点召回。
  • Matryoshka 截过头:1,536→256 通常安全,1,536→64 不安全。要在你的评估集上验。
  • 上下文截断:多数模型对超过最大长度的输入静悄悄截断。长文档要分块(见第 23 节)。
  • 忽视延迟长尾:MTEB 分数藏住 p99 延迟。一个 600M 模型可能只比 335M 模型高 2 分,但每查询贵 3 倍。

2026 的栈:

情形
纯英、快、API text-embedding-3-largevoyage-3-large
开源、英 BAAI/bge-large-en-v1.5
开源、多语 BAAI/bge-m3Qwen3-Embedding-8B
长上下文(32k+) Voyage-3-large、Cohere embed-v4、Qwen3-Embedding-8B
仅 CPU 部署 Nomic Embed v2(137M 参数,MoE)
存储受限 Matryoshka 截断 + int8 量化
关键词密集查询 加 SPLADE 稀疏,与稠密 RRF 融合

💡 2026 模式:从 BGE-M3 或 text-3-large 起步,用 MTEB 在你领域上评估,若有领域专用模型高出 3 分以上才换。

四、可复用产物

保存为 outputs/skill-embedding-picker.md:

--- name: embedding-picker description: Pick embedding model, dimension, and retrieval mode for a given corpus and deployment. version: 1.0.0 phase: 5 lesson: 22 tags: [nlp, embeddings, retrieval] --- Given a corpus (size, languages, domain, avg length), deployment target (cloud / edge / on-prem), latency budget, and storage budget, output: 1. Model. Named checkpoint or API. One-sentence reason. 2. Dimension. Full / Matryoshka-truncated / int8-quantized. Reason tied to storage budget. 3. Mode. Dense / sparse / multi-vector / hybrid. Reason. 4. Query prefix / template if required by the model card. 5. Evaluation plan. MTEB tasks relevant to domain + held-out domain eval with nDCG@10. Refuse recommendations that truncate Matryoshka to <64 dims without domain validation. Refuse ColBERTv2 for corpora under 10k passages (overhead not justified). Flag long-document corpora (>8k tokens) routed to models with 512-token windows.

五、练习

  1. 基础:用 bge-small-en-v1.5 把 100 句编到全维(384),再编到 Matryoshka 128,在 10 条查询上测 MRR 下降。
  2. 进阶:在你领域的 500 段上对比 BGE-M3 的稠密、稀疏、colbert,哪个在 recall@10 上赢?RRF 融合是否胜过最佳单模?
  3. 挑战:在你 Top-2 领域任务上对三个候选模型跑 MTEB,报告 MTEB 分数、100 查询批的 p99 延迟、每百万查询美元成本,挑帕累托最优的。

本节要点回顾

  1. RAG 捞错四成常因嵌入:不是向量库也不是提示,是嵌入模型。
  2. 五条轴权衡:稠密/稀疏/多向量、语言、上下文长度、维度预算、开源 vs 托管。
  3. 稠密是默认:每段一个向量,余弦排语义邻近。
  4. 稀疏 SPLADE 强于关键词:每词表 token 一个学习权重,关键词密集查询胜出。
  5. 多向量 ColBERTv2 贵但准:每 token 一向量、MaxSim 打分,长查询与领域语料占优。
  6. BGE-M3 三合一:一个 checkpoint 同时出稠密/稀疏/多向量,加权和融合。
  7. Matryoshka 截前 N 维即小嵌入:1,536→256 掉约 1% 省 6 倍,截到 64 不安全。
  8. MTEB 必要但不充分:总在自有领域上跑,别盲信排行榜。
  9. 非对称编码查询≠文档:Voyage/Jina-ColBERT 走不同路径,bge-* 漏前缀掉 3~5 点召回。
  10. 三层模式是生产默认:稠密初筛→稀疏 RRF 提召回→多向量/交叉编码器提精确。

下一节,我们钻进 RAG 性能的第一杠杆——进入「RAG 分块策略」,看定长、句子感知、语义、父文档、递归摘要这些策略如何决定检索器拿到的是不是对的段落。


发布者: 作者: Rohit Gupta 转发
评论区 (0)
U