Embedding-01.模型性能对比与评测方法

文本嵌入(text embedding)将变长文本映射为固定维度的稠密向量,供语义检索、聚类、分类与 RAG 等下游任务使用。OpenAI、Google、阿里、火山、BGE、E5 等厂商与开源社区均提供多种 Embedding 模型——排行榜上的第一名,未必是你业务场景的最优解

本文给出多维度、可复现的对比框架:先区分「测什么」,再选「用什么指标」,最后约定「怎么测才公平」。文中不重复介绍 Embedding 的基本概念;概念入门可参考 0009.概念-术语-embeddings嵌入

缩写体例:缩写首次出现写「中文全称(English,ABB)」;段末 段末注释 释义;后文沿用缩写。


1. 评测前先回答三个问题

问题 决定什么
下游任务是什么? 检索、重排序、分类、聚类、STS,指标完全不同
语料域是否匹配? 通用新闻 vs 医学文献 vs 代码/蛋白序列,泛化能力不可外推
部署约束是什么? 维度、延迟、GPU/CPU、API 成本往往与精度 trade-off

核心原则:Embedding 评测是任务对齐(task-aligned)的,不是单一标量排名。MTEB 均分适合初筛;上线前必须在自有验证集上复测。

段末注释RAG(Retrieval-Augmented Generation,检索增强生成)先检索相关文档再喂给 LLM;Embedding 质量直接决定召回上限。


2. 评测维度总览

Embedding 评测维度总览

图 1 评测维度总览:内在语义、检索排序、下游代理三类任务指标汇入 MTEB/CMTEB 等公开基准;工程指标(延迟、维度、成本)与基准分数共同决定选型,不可只看单一排行榜分数。

维度 典型指标 适用场景
语义相似度 Spearman $\rho$、Pearson $r$ STS、去重、问答匹配
检索 Recall@$k$、MRR@$k$、nDCG@$k$ RAG、搜索引擎、文档库
分类 Accuracy、F1、AUROC 意图识别、主题分类
聚类 V-measure、NMI 文档挖掘、无监督分组
重排序 MAP、MRR 两阶段检索的 rerank 头
工程 QPS、P99 延迟、$/1M tokens 生产 SLA 与成本核算

3. 相似度与检索类指标

3.1 余弦相似度

给定向量 $\mathbf{u}, \mathbf{v} \in \mathbb{R}^d$,余弦相似度(cosine similarity)为:

[
\mathrm{sim}(\mathbf{u}, \mathbf{v}) = \frac{\mathbf{u} \cdot \mathbf{v}}{|\mathbf{u}| , |\mathbf{v}|}
]

多数 Embedding 模型输出已 L2 归一化,此时 $\mathrm{sim}$ 等价于点积。对比不同模型时,必须统一:是否归一化、距离度量(cosine vs L2 vs inner product)、ANN 索引参数(HNSW 的 efConstruction / M)。

段末注释ANN(Approximate Nearest Neighbor,近似最近邻)在大规模向量库上加速检索;不同索引参数会改变 Recall@$k$,对比时需固定。

3.2 语义文本相似度 STS

语义文本相似度(Semantic Textual Similarity,STS)任务:人工标注句子对相似度 $s \in [0,5]$(或 $[0,1]$),模型用 $\mathrm{sim}(\mathbf{e}_1, \mathbf{e}_2)$ 预测,报告 Spearman 秩相关系数 $\rho$ 或 Pearson $r$:

[
\rho = 1 - \frac{6\sum_i d_i^2}{n(n^2-1)}
]

其中 $d_i$ 为第 $i$ 对样本在「人工排序」与「模型相似度排序」中的秩差。STS 衡量连续语义梯度是否保序,对 paraphrase、问答匹配敏感;但对长文档检索代表性不足。

3.3 检索指标

设查询 $q$,语料库文档集合 $\mathcal{C}$,相关文档集合 $\mathrm{rel}(q) \subset \mathcal{C}$。按相似度降序得到排名列表 $\pi_q$。

指标 公式 / 含义 解读
Recall@$k$ $|\mathrm{rel}(q) \cap \pi_q[:k]| / |\mathrm{rel}(q)|$ 前 $k$ 条是否覆盖足够多相关文档;RAG 常用 $k=5,10,20$
MRR@$k$ $\frac{1}{ Q
nDCG@$k$ 归一化折损累积增益,考虑多级相关度 多级标注(高相关 / 部分相关)时使用
MAP 各查询 AP 的均值 多相关文档、排序质量整体评估

nDCG@$k$ 的 DCG 定义为:

[
\mathrm{DCG@}k = \sum_{i=1}^{k} \frac{2^{\mathrm{rel}_i} - 1}{\log_2(i+1)}
]

再除以理想排序下的 IDCG 得到 nDCG。RAG 场景建议同时报告 Recall@$k$ 与 MRR@$k$:前者看「有没有召回」,后者看「排得靠不靠前」。

段末注释nDCG(normalized Discounted Cumulative Gain,归一化折损累积增益)是信息检索(Information Retrieval,IR)经典排序指标。


4. 下游任务代理指标

公开基准(如 MTEB)很少端到端训练大模型,而是用 Embedding + 轻量头 代理下游能力:

任务类型 典型做法 主指标
文本分类 冻结 Embedding,训练 logistic regression Accuracy、Macro-F1
聚类 mini-batch k-means,$k$=真实类别数 V-measure、NMI
句子对分类 拼接或差分向量 + 分类器 Average Precision
重排序 query-doc 向量相似度排序 MRR@$k$、MAP
检索 双塔编码 query/doc,全库 brute-force 或 ANN nDCG@$k$、Recall@$k$

这些指标反映 Embedding 的线性可分性度量空间结构,与「只调 API、不重训分类头」的生产用法部分一致,但不等于完整 RAG 链路(分块、重排、LLM)的最终效果。


5. 公开基准:初筛与横向对比

5.1 MTEB

大规模文本嵌入基准(Massive Text Embedding Benchmark,MTEB)覆盖 8 类任务、58+ 数据集、100+ 语言,是英文及多语场景最通用的横向对比框架。

使用注意

  1. 任务分组均分(Retrieval / Classification / Clustering …),不要只看总分;
  2. 确认模型是否针对 MTEB 任务过拟合(训练数据污染);
  3. 多语模型在英文子集上的分数可能与英文专用模型不可直接比「性价比」。
1
2
3
4
5
6
7
8
9
# 最小可复现:单任务评测
from mteb import MTEB
from sentence_transformers import SentenceTransformer

model_name = "BAAI/bge-small-en-v1.5"
model = SentenceTransformer(model_name)

evaluation = MTEB(tasks=["Banking77Classification"])
results = evaluation.run(model, output_folder=f"results/{model_name}")

5.2 CMTEB

中文大规模文本嵌入基准(Chinese Massive Text Embedding Benchmark,CMTEB)基于 MTEB 扩展,含 TNews、DuRetrieval、CMedQA 等 35 个中文数据集,分 6 类任务。中文 RAG / 分类选型应优先参考 CMTEB 对应子任务,而非英文 MTEB 排名外推。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 中文任务列表示例(完整列表见 FlagEmbedding / MTEB 文档)
ChineseTaskList = [
"TNews", "IFlyTek", "DuRetrieval", "MMarcoRetrieval",
"T2Retrieval", "ATEC", "BQ", "LCQMC", "STSB",
]

import mteb
from mteb import MTEB
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
tasks = mteb.get_tasks(task_types=None, languages=["cmn", "cmn-Hans"])
# 或显式传入 ChineseTaskList 子集
for task in tasks[:3]: # 演示:实际应跑全量或选定子集
MTEB(tasks=[task]).run(model, output_folder="zh_results/bge-large-zh")

更完整的 CMTEB 跑分脚本见:特征工程-数据编码-Embedding性能测评方式

5.3 BEIR 与其他检索基准

BEIR(Benchmarking IR,零样本信息检索基准)强调跨域零样本检索:模型未在目标域微调,直接 encode query 与 corpus。适合评估 RAG 知识库「冷启动」泛化。

基准 侧重点
BEIR 18 个异构检索数据集,nDCG@10
AIR-Bench 对齐 RAG 真实 query 分布
LoCo / LongEmbed 长上下文、长文档检索
MLDR / C-MTEB Retrieval 多语 / 中文检索子集

蛋白、药物、代码等垂直域另有专用评测;蛋白域详见 Embedding-02.蛋白Embedding模型评价标准与常用方法,通用 MTEB 高分不代表域内最优。


6. 领域对齐评测(上线前必做)

公开基准是代理任务;生产效果取决于你的 query、文档长度、分块策略与标注方式。推荐构建三层验证集:

层级 内容 用途
Gold 检索集 $(q, d^+, {d^-})$ 或 $(q, \mathrm{rel_rankings})$ Recall@$k$、MRR、nDCG
Hard negative 集 语义相近但错误的 chunk 区分「看起来像我」的误召回
端到端 RAG 集 同一 $q$ 下对比 answer faithfulness / EM 链路级验收(Embedding 只是其中一环)

Hard negative 构造

  • 同文档相邻 chunk(边界混淆);
  • BM25 高分但语义无关段落;
  • 同主题不同实体(如不同酶家族条目)。

标注规模:检索对比至少 200–500 条 query 可有稳定排序;少样本可用 k-fold 重复 encode,但结论置信区间会变宽。


7. 工程与成本指标

精度相近时,生产选型常由工程指标决定:

指标 测量方法 典型 trade-off
向量维度 $d$ 模型 card $d$ 越大存储与 ANN 内存越高
编码延迟 batch=1 / batch=32 的 P50/P99 ms 小模型 + CPU 可胜过大模型 + GPU
吞吐 QPS 固定硬件下 tokens/s 批处理与 ONNX/TensorRT 优化
索引体积 $N \times d \times 4$ bytes(float32) 量化(int8)可省 4× 内存,略损 Recall
API 成本 $/1M tokens 云 API vs 自托管 break-even 点

对比示例(需在同硬件、同 batch、同序列长度下测):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
import numpy as np
from sentence_transformers import SentenceTransformer

texts = ["示例句子"] * 128
model = SentenceTransformer("BAAI/bge-small-en-v1.5")

# 预热
model.encode(texts[:8])

t0 = time.perf_counter()
emb = model.encode(texts, batch_size=32, normalize_embeddings=True)
elapsed = time.perf_counter() - t0

print(f"dim={emb.shape[1]}, ms/doc={elapsed/len(texts)*1000:.2f}")

公平对比清单

  • 相同硬件、驱动、精度(fp32 / fp16 / bf16)
  • 相同 max_seq_length 与截断策略
  • 相同 normalize_embeddings 与距离度量
  • 相同 ANN 索引类型与 efSearch
  • 相同分块大小、overlap、metadata 拼接方式(RAG)
  • 报告均值 ± 标准差(多 seed 或 bootstrap)

8. 推荐对比流程

Embedding 模型对比流程

图 2 推荐对比流程:从明确下游任务出发,经公开基准初筛、自有 Gold 集与 hard negative 压测、工程指标过滤,再到端到端 RAG A/B,最终选定模型并文档化评测协议。

Step 1 — 初筛:按任务类型从 MTEB/CMTEB 取对应列(如 Retrieval、Classification),剔除维度 / 延迟明显不满足的模型。

Step 2 — 域内检索:在 Gold 集上算 Recall@5/10、MRR@10、nDCG@10;画 Recall–延迟 Pareto 前沿。

Step 3 — 统计检验:多模型在同一验证集上的指标差是否显著,可用 bootstrap 或 paired t-test($p<0.05$ 且效应量 $\Delta$ Recall@10 > 2% 再宣称「更好」)。

Step 4 — 链路验收:固定 chunk、top-$k$、prompt,只换 Embedding,测 LLM 答案质量(如 RAGAS context precision、人工评分)。


9. 常见误区

误区 说明
只看 MTEB 总分 检索任务与分类任务权重不同,总分掩盖短板
英文榜外推中文 多语模型中文子集仍可能与中文专用模型有 gap
忽略分块 同一 Embedding,chunk 512 vs 1024 可差 10+ pt Recall
混用 API 与本地版本 同名模型不同 revision、量化方式结果不同
不设 hard negative 高 Recall 可能来自「容易的正样本」,线上误召回到位
单指标决策 Recall@10 高但 MRR 低 → 相关文档排得靠后,RAG 仍差

10. 模型对比报告模板

对内或论文附录建议固定表格,便于复现:

模型 维度 CMTEB Ret. 自有 Recall@10 MRR@10 P99 ms/doc 索引 GB/100万条
model-A 768 0.62 0.81 0.54 12 2.9
model-B 1024 0.65 0.78 0.58 28 3.9

附:评测日期、代码 commit、数据集版本、硬件、分块参数、ANN 配置


11. 工具链速查

工具 用途
mteb MTEB / CMTEB 标准跑分
sentence-transformers 本地 encode + 简易评测
FlagEmbedding BGE 系列与 C-MTEB 脚本
ranx nDCG、MRR、MAP 快速计算
RAGAS RAG 链路级指标
fAISS / Milvus / Qdrant 大规模 ANN 与召回评测

12. 小结

  • Embedding 性能不是单一分数,而是「任务指标 + 领域数据 + 工程约束」的联合优化。
  • MTEB / CMTEB / BEIR 适合缩小候选范围;自有 Gold 集 + hard negative 才是上线依据。
  • 对比时必须写清协议:归一化、截断、分块、索引、硬件;否则数值不可复现、不可信。

下一步可在本系列补充:分块策略对 Recall 的敏感性实验、多模态 Embedding(图文)评测;蛋白域评测见 Embedding-02

-------------本文结束感谢您的阅读-------------