嵌入模型深入 本节摘要: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 节(信息检索)。
阅读完本节,你应当能够:
你的 RAG 系统四成时候捞错段落。罪魁很少是向量库或提示,而是嵌入模型。
2026 选嵌入,要在五条轴上权衡:
三种嵌入模式:
text-embedding-3-large、BGE-M3 稠密模式、Voyage-3。默认选择。💡 Matryoshka 表示学习:训练得使向量的前 N 维本身构成一个可用的独立嵌入。把 1,536 维向量截到 256 维,掉约 1% 精度换 6 倍存储节省。OpenAI text-3、Cohere v4、Voyage-4、Jina v5、Gemini Embedding 2、Nomic v1.5+ 都支持。
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)或交叉编码器重排器 |
多数生产栈三者都用。
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 使点积等于余弦相似度。总设上它。
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)截断时退化剧烈。
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
权重在你领域上调。
from mteb import MTEB tasks = ["ArguAna", "SciFact", "NFCorpus"] evaluation = MTEB(tasks=tasks) results = evaluation.run(encoder, output_folder="./mteb-results")
在有代表性的子集上跑候选模型。别只信排行榜名次——你的领域要紧。
见 code/main.py。纯标准库的平均哈希技巧嵌入。不能与 Transformer 嵌入竞争,但展示了形状:分词 → 向量 → 归一化 → 点积。
bge-* 模型需要给查询前缀「Represent this sentence for searching relevant passages: 」。忘了就掉 3~5 点召回。2026 的栈:
| 情形 | 选 |
|---|---|
| 纯英、快、API | text-embedding-3-large 或 voyage-3-large |
| 开源、英 | BAAI/bge-large-en-v1.5 |
| 开源、多语 | BAAI/bge-m3 或 Qwen3-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.
bge-small-en-v1.5 把 100 句编到全维(384),再编到 Matryoshka 128,在 10 条查询上测 MRR 下降。下一节,我们钻进 RAG 性能的第一杠杆——进入「RAG 分块策略」,看定长、句子感知、语义、父文档、递归摘要这些策略如何决定检索器拿到的是不是对的段落。