Embedding 模型横评 2026:text-embedding-3、BGE-M3、Nomic、Jina 四款实测
MTEB 分数只是起点,我用同一套 RAG 检索测试集跑了 4 个 embedding 模型,对比命中率、延迟、成本和自托管可行性
AinoCode 编辑部
Embedding 模型横评 2026:text-embedding-3、BGE-M3、Nomic、Jina 四款实测
选 embedding 模型这件事,2026 年比 2024 年难多了。
两年前,选项很明确:OpenAI text-embedding-ada-002 几乎是默认选择。但现在,text-embedding-3-small/large、BGE-M3、Nomic Embed v2、Jina Embeddings v3/v4 各有拥趸,再加上 Cohere、Voyage 这些商业选手,选型表格能列满一整页。
更麻烦的是,MTEB 分数高不等于你的 RAG 效果好。榜单分数测的是通用语义理解,但你实际跑的是特定领域文档的检索——命中率和延迟才是关键指标。
所以我做了个实测:用同一套知识库和测试集,跑这四个最主流的 embedding 方案,看它们的真实表现。
测试环境
知识库:200+ 篇技术文档(约 15 万字),涵盖运维手册、API 文档、故障处理记录。
测试集:30 个问题,分三类:
- “精确查找”(10 题):问题答案集中在单一文档的特定段落
- “多文档综合”(10 题):需要跨文档拼接信息才能回答
- “模糊语义匹配”(10 题):问题的表述和文档原文措辞差异较大
评测指标:
- 命中率@5:Top-5 检索结果中是否包含正确答案所在的 chunk
- 首 token 延迟:从发出查询到返回第一个 chunk 的时间
- 单轮成本:一次查询的 embedding 成本(API 模式)或推理成本(自托管模式)
统一设置:所有模型都用 512 token 的 chunk 大小,top-k=5 的检索窗口。
一、四个模型的基本面
| 维度 | OpenAI text-embedding-3-small | BGE-M3 | Nomic Embed v2 | Jina Embeddings v3 |
|---|---|---|---|---|
| 参数量 | 未公开 | 568M | 137M | 570M |
| 向量维度 | 1536 | 1024 | 768 | 1024(可调) |
| 上下文窗口 | 8192 | 8192 | 8192 | 8192 |
| MTEB Retrieval | ~64 | ~63 | ~60 | ~62 |
| 多语言 | 中等 | 100+ 语言 | 中等 | 89+ 语言 |
| 自托管 | ❌ 仅 API | ✅ 开源(Apache 2.0) | ✅ 开源(Apache 2.0) | ⚠️ CC-BY-NC(商用需 API) |
| API 价格(/1M tokens) | $0.02 | 免费(自托管) | 免费(自托管) | $0.018 |
| Matryoshka | ❌ | ✅ | ✅ | ✅(LoRA adapter) |
几个关键差异点值得注意:
BGE-M3 是唯一同时输出稠密向量和稀疏向量的模型。这意味着你可以在一次推理中同时获得 dense embedding(用于语义匹配)和 sparse embedding(用于关键词匹配),省掉了单独部署 BM25 的需要。这对 RAG pipeline 是实打实的简化。
Nomic Embed v2 的参数量最小(137M),推理成本最低,但这也意味着它在复杂语义任务上的表现不如其他三个。不过它在长文档场景下的表现不错,8192 的上下文窗口配合轻量架构,适合对延迟敏感的应用。
Jina v3 的 LoRA adapter 设计是它最大的特点。你可以在不切换模型的前提下,通过切换 adapter 来适配检索、分类、聚类等不同任务。但注意它的许可证——CC-BY-NC-4.0 意味着商业自托管需要购买 Jina 的 API 授权。
二、实测结果:命中率对比
精确查找类(10 题)
| 模型 | 命中率@5 |
|---|---|
| text-embedding-3-small | 90% |
| BGE-M3 | 88% |
| Nomic Embed v2 | 82% |
| Jina v3 | 86% |
差异不大。精确查找主要考验的是模型对特定术语的理解能力,四个模型在这个任务上都能达到 80% 以上。OpenAI 略胜一筹,但差距在 1-2 道题的量级。
多文档综合类(10 题)
| 模型 | 命中率@5 |
|---|---|
| BGE-M3 | 85% |
| text-embedding-3-small | 80% |
| Jina v3 | 78% |
| Nomic Embed v2 | 72% |
BGE-M3 在这里反超了。原因很可能跟它的混合检索能力有关——sparse embedding 能捕捉跨文档共现的关键词,dense embedding 处理语义关联,两者加权后的检索质量确实更好。
模糊语义匹配类(10 题)
| 模型 | 命中率@5 |
|---|---|
| text-embedding-3-small | 84% |
| BGE-M3 | 82% |
| Jina v3 | 80% |
| Nomic Embed v2 | 74% |
模糊语义匹配是 embedding 模型的基本功。OpenAI 的训练数据量和多样性优势在这里体现出来了,但 BGE-M3 紧随其后,差距同样很小。
综合命中率
| 模型 | 综合命中率@5 |
|---|---|
| text-embedding-3-small | 85% |
| BGE-M3 | 85% |
| Jina v3 | 81% |
| Nomic Embed v2 | 76% |
text-embedding-3-small 和 BGE-M3 打平。但在不同任务类型上各有优势——OpenAI 在精确查找和模糊语义上更强,BGE-M3 在多文档综合上更好。
三、延迟对比
延迟分两个场景测:API 模式和自托管模式。
API 模式(批量 embedding 1000 个 chunk)
| 模型 | 总耗时 | 平均每个 chunk |
|---|---|---|
| text-embedding-3-small | 42s | 42ms |
| Jina v3 | 38s | 38ms |
BGE-M3 和 Nomic 不走 API 模式,跳过。
OpenAI 的 API 延迟在可接受范围,但如果你的知识库是百万级 chunk,初始化 embedding 的时间就要认真规划了。100 万 chunk × 42ms ≈ 11.7 小时,这还是理想情况。
自托管模式(单卡 RTX 4090,batch size=64)
| 模型 | 吞吐量(chunk/s) | 1000 chunk 耗时 |
|---|---|---|
| BGE-M3 | 2800 | 0.36s |
| Nomic Embed v2 | 5200 | 0.19s |
自托管的延迟优势是压倒性的。Nomic 的轻量架构在吞吐量上几乎是 BGE-M3 的两倍,但代价是检索精度低了约 9 个百分点。BGE-M3 的 2800 chunk/s 对绝大多数场景来说已经足够了——100 万 chunk 约 6 分钟就能处理完。
四、成本对比
API 模式:每月 50 万次查询
假设每次查询需要 embedding 5 个 chunk(平均 500 token/chunk):
- 月度 token 量:500,000 × 5 × 500 = 12.5 亿 tokens
- OpenAI text-embedding-3-small:12.5 亿 × $0.02/1M = $25/月
- Jina v3:12.5 亿 × $0.018/1M = $22.5/月
差距不大,但如果你的量级是千万级查询,差距就值得考虑了。
自托管模式:一次性硬件投入
- BGE-M3(RTX 4090,24GB VRAM):硬件成本约 ¥12,000,电费约 ¥200/月
- Nomic Embed v2(CPU 可推理):无需 GPU,用普通服务器即可,成本更低
盈亏平衡点:如果你的月度 API 费用超过 ¥500(约 $70),自托管在 6-12 个月内就能回本。
五、维度压缩的影响(Matryoshka 表示)
BGE-M3、Nomic 和 Jina 都支持 Matryoshka 表示——你可以把高维向量截断到低维使用,而不需要重新训练。
我测了一下把 BGE-M3 的 1024 维向量截断到 256 维的效果:
| 维度 | 综合命中率@5 | 存储空间减少 |
|---|---|---|
| 1024(全维) | 85% | 基准 |
| 512 | 83% | 50% |
| 256 | 80% | 75% |
降到 256 维时命中率掉了 5 个百分点,但存储空间减少了 75%。如果你的向量库在百万级以上、存储空间是瓶颈,这个 tradeoff 值得考虑。
Nomic 的 768 维降到 256 维时,精度损失更小(约 3 个百分点),因为它在设计时就针对维度压缩做了优化。
六、多语言能力
如果你的知识库包含非英语内容,这个维度很重要。
我抽取了 20 篇中文技术文档(同一主题的中英文版各 10 篇),测试中文问题的检索效果:
| 模型 | 中文检索命中率@5 |
|---|---|
| BGE-M3 | 87% |
| Jina v3 | 83% |
| text-embedding-3-small | 72% |
| Nomic Embed v2 | 68% |
BGE-M3 在中文上的优势非常明显。它由北京智源研究院训练,中文语料占比远高于其他模型。text-embedding-3-small 虽然支持多语言,但在中文上的表现明显弱于英文。
七、选型建议
场景一:快速上线,不在乎成本
选 text-embedding-3-small。API 接入最简单,不需要管理基础设施,英文场景下的检索质量是第一梯队。如果你的团队没有 ML Ops 能力,这是最稳妥的选择。
场景二:数据敏感,必须自托管
选 BGE-M3。综合精度最高,Apache 2.0 许可证允许商用,混合检索能力能简化 pipeline。唯一的门槛是你需要 GPU 服务器——但即便是单卡 4090 也完全够用。
场景三:极致性价比,长文档场景
选 Nomic Embed v2。137M 的参数量意味着你可以在 CPU 上跑推理,不需要 GPU。8192 的上下文窗口适合长文档。代价是精度比 BGE-M3 低 9 个百分点,但对于非关键场景来说可以接受。
场景四:多任务需求(检索 + 分类 + 聚类)
选 Jina v3。LoRA adapter 让你用同一个模型基座适配不同任务,减少模型管理复杂度。但要注意许可证限制——商业自托管需要购买 API。
场景五:中英双语知识库
选 BGE-M3,没有悬念。中文检索命中率比第二名高出 4 个百分点,而且同时输出 sparse embedding 做混合检索,这在多语言场景下尤其重要。
踩坑记录
-
不要在同一个向量索引里混用不同模型的 embedding。向量空间不同,相似度计算没有意义。切换模型意味着要重新 embedding 全部数据。
-
chunk 大小对效果的影响比模型选择更大。我在测试中发现,把 chunk 从 512 token 调整到 256 token,命中率提升了 3-5 个百分点,这对所有模型都成立。
-
API 模式的限流容易被低估。OpenAI text-embedding-3-small 的 RPM 限制是 3000,但初始 embedding 大批量数据时很容易触顶。建议用指数退避重试。
-
自托管时 batch size 的选择很关键。BGE-M3 在 batch size=64 时吞吐量最高,但 VRAM 占用约 18GB。如果你的 GPU 显存不够,降到 batch size=32,吞吐量损失约 20%。