维度线性影响存储和内存;prefix 约定各模型不一致(E5/BGE/Cohere 各有要求);embedding-3 支持 Matryoshka 可变维度压缩成本;部分模型有非商业许可限制。
注意这个列表里没有的内容: benchmark 排名。它在下面的列表里,被降级了。
MTEB —— Massive Text Embedding Benchmark,Muennighoff 等,2022 —— 是一项真正有用的工作。它聚合了检索、聚类、分类、重排序、语义相似度等多个任务类型的数十个数据集,让这个领域变得可比较。但它也是迄今为止所有人都在针对训练的东西,而一个所有人都针对训练 benchmark 就不会再是一个留出测试。
从榜单头部读数的两个结构性问题。首先,标题数字是跨任务类型的平均分,而你没有一项平均任务。一个在分类和语义文本相似度上领先的模型,在检索上可能只是中等,而检索可能是你唯一关心的列。读取检索子分数,以及其中与你的领域相似的那些数据集。
其次,零样本的图景并不像榜单暗示的那么好看。BEIR(Thakur 等,2021),MTEB 吸收的检索 benchmark,恰恰是为了测试域外泛化能力而构建的,其核心发现是:BM25 仍然是一个强有力的基线,许多密集检索器在未见过的域上无法击败它。这个发现才是你应该带入自己评估的东西:一个模型在十八个公开语料库上的分数,只能松散地预测它在你的工单上的行为。
来自两个不同模型的嵌入是不可比较的。不是近似可比较 —— 在一起毫无意义,因为每个模型学习了自己任意的轴。更换模型意味着重新嵌入整个语料库,所以这个选择携带了一张可以预先计算账单。
以一个 500 万个 chunk、平均 350 个 token 的语料库为例。这是 17.5 亿个输入 token。按 OpenAI 2024 年 1 月发布的 text-embedding-3-small 每百万 token 0.02 美元的费率计算,一次全量通过是 35 美元。按每百万 0.13 美元计算 text-embedding-3-large,是 227.50 美元。两个数字都很小,这就是值得内化的要点:在这个规模下,模型价格对决策几乎无关紧要,为了节省 190 美元而选择更便宜的模型是在优化错误的行项目。存储和索引内存随维度缩放,比那每月花费更多。
算术在 5 亿个 chunk 时改变了性质,同样的计算给出 1750 亿个 token、3500 美元和 22750 美元。在那里模型价格是一个真实的决策,而且你切换的那天还要再付一次也是如此。
三个候选模型,一个下午,以及一个关于你的数据而不是关于 Reddit 的答案。
构建一个包含 50 个查询的金标准集。从你真实的搜索日志或工单收件箱中获取,而不是凭想象。对于每个查询,标记真正回答它的 chunk 或 chunks。50 个足以区分有差异的模型;不足以排名接近的两个,知道这一点可以让你避免过度解读两分的差距。
用每个候选模型嵌入语料库 —— 每个模型有自己的前缀约定,正确应用,这是大多数自研比较出错的地方。
计算 Recall@10 和 MRR@10。Recall@10 问的是正确的 chunk 是否在你将喂给模型的十个之中。这是 RAG 系统实际赖以生存的数字;第三位小数的 nDCG 差异不是。
然后应用约束条件 —— 许可证、最大输入、维度与你的存储预算、是否可以截断。一个领先两分但存储是 4 倍的模型通常是错误的答案。
将金标准集放入版本控制。它才是资产,而不是模型选择;它让你在一小时内而不是一个下午评估下一个候选,它告诉你供应商升级是否有帮助。
结构化建议,故意不做排名。如果你想要一个托管模型且是英文内容,来自主要提供商的中间尺寸 1536 维通用模型是一个不会被解雇的防御性默认值;text-embedding-3 系列还支持通过 dimensions 参数截断,这保留了你的选项。如果你需要本地部署或每个请求成本接近零,BGE 和 E5 系列在 384 或 768 维可以在 CPU 上运行并采用宽松许可证。如果你的内容是多语言的,这个约束优先于本页所有其他内容,你应该从明确说明语言覆盖范围的模型开始。
无论你选什么,在你存储的每个向量旁边记录模型名称和版本。替代方案 —— 一个包含两个模型版本向量的索引,无法区分,对一部分查询静默产生乱码 —— 是这个集群中最糟糕的故障模式,而且完全可以用一列来预防。
Embedding 模型按输入 token 定价,没有输出组件,这使得它们在可比性上与聊天模型不同:每个模型一个数字就能告诉你全部故事。模型列表显示了维度、最大输入长度和每百万 token 费率并列,这是上述六个属性中的三个。
Embedding Dimensions: Does 3072 Beat 768?
Matryoshka Embeddings: Truncating Vectors Without Losing Much
Storing Vectors Cheaply: The Real Cost of 100M Embeddings