引言
Embedding 模型是 RAG 系统的核心组件之一——它将文本转换为向量表示,决定了检索阶段能否找到最相关的内容。选错 Embedding 模型,后续的检索优化再努力也事倍功半。
用户查询 → Embedding模型 → 查询向量 → 向量检索 → 相关文档
↑
Embedding质量决定检索天花板
本文将全面对比主流 Embedding 模型,帮助你在不同场景下做出最优选择。
一、什么是 Embedding 模型?
Embedding 模型将文本映射到高维向量空间,使得语义相似的内容在向量空间中的距离更近。
from openai import OpenAI
client = OpenAI()
response = client.embeddings.create(
model="text-embedding-3-small",
input="RAG系统的核心组件"
)
embedding = response.data[0].embedding
# 输出: [0.0123, -0.0456, ..., 0.0789] (1536维)
核心特性
| 特性 | 说明 |
|---|---|
| 维度(Dimensions) | 向量的长度,越高越精确但存储/计算成本也越高 |
| 上下文长度 | 模型一次能编码的最大 token 数 |
| 语言支持 | 是否支持中文、多语言 |
| 归一化 | 输出向量是否为单位向量(影响相似度计算方式) |
二、主流 Embedding 模型对比
2.1 商业模型
| 模型 | 提供商 | 维度 | 最大输入 | 语言 | 价格(/1M tokens) | MTEB |
|---|---|---|---|---|---|---|
| text-embedding-3-large | OpenAI | 3072 | 8191 | 多语言 | $0.13 | 64.6 |
| text-embedding-3-small | OpenAI | 1536 | 8191 | 多语言 | $0.02 | 62.3 |
| text-embedding-ada-002 | OpenAI | 1536 | 8191 | 多语言 | $0.10 | 61.0 |
| embed-english-v3.0 | Cohere | 1024 | 512 | 英语 | $0.10 | 64.5 |
| embed-multilingual-v3.0 | Cohere | 1024 | 512 | 多语言 | $0.10 | 65.0 |
| voyage-2 | VoyageAI | 1536 | 4096 | 多语言 | $0.10 | 64.1 |
| voyage-large-2-instruct | VoyageAI | 1536 | 16000 | 多语言 | $0.12 | 65.3 |
2.2 开源模型
| 模型 | 维度 | 最大输入 | 语言 | 模型大小 | MTEB |
|---|---|---|---|---|---|
| BAAI/bge-large-zh-v1.5 | 1024 | 512 | 中文优化 | 1.3GB | 64.0 |
| BAAI/bge-large-en-v1.5 | 1024 | 512 | 英文 | 1.3GB | 64.2 |
| intfloat/multilingual-e5-large | 1024 | 512 | 多语言 | 2.2GB | 65.0 |
| Alibaba-NLP/gte-large-zh | 1024 | 512 | 中文优化 | 1.3GB | 63.8 |
| hkunlp/instructor-xl | 2048 | 512 | 英文 | 4.5GB | 64.7 |
| sentence-transformers/all-mpnet-base-v2 | 768 | 384 | 英文 | 420MB | 61.6 |
2.3 中文优化模型
对于中文场景,以下模型经过了针对性优化:
| 模型 | 维度 | 说明 | 适用场景 |
|---|---|---|---|
| BAAI/bge-large-zh-v1.5 | 1024 | 中文检索最佳选择之一 | 通用中文文档检索 |
| Alibaba-NLP/gte-large-zh | 1024 | 阿里出品,中文效果好 | 电商、企业文档 |
| shibing624/text2vec-base-chinese | 768 | 轻量级中文Embedding | 资源受限环境 |
| moka-ai/m3e-base | 768 | 中等规模中文模型 | 综合场景平衡 |
三、维度与性能的权衡
3.1 维度影响
| 维度 | 存储空间(100万文档) | 检索速度 | 精度 |
|---|---|---|---|
| 384 | ~1.5 GB | 极快 | 较低 |
| 768 | ~3 GB | 快 | 中等 |
| 1024 | ~4 GB | 中等 | 较高 |
| 1536 | ~6 GB | 中等 | 高 |
| 3072 | ~12 GB | 较慢 | 最高 |
3.2 维度压缩
OpenAI text-embedding-3 系列支持输出维度压缩:
# 将 3072 维压缩为 256 维
response = client.embeddings.create(
model="text-embedding-3-large",
input="需要索引的文本内容",
dimensions=256 # 关键参数!
)
压缩效果:
- 3072→1024:精度损失约 0.5%
- 3072→512:精度损失约 1.5%
- 3072→256:精度损失约 3-5%
四、MTEB 基准解读
MTEB(Massive Text Embedding Benchmark)是当前最权威的 Embedding 评估基准,涵盖 8 个任务类型:
| 任务类别 | 说明 | 评估指标 |
|---|---|---|
| 分类(Classification) | 文本分类准确率 | Accuracy / F1 |
| 聚类(Clustering) | 文本聚类质量 | V-Measure |
| 配对分类(Pair Classification) | 判断文本对相似度 | Accuracy / F1 |
| 重排序(Reranking) | 重排序准确率 | MAP / MRR |
| 检索(Retrieval) | 检索召回率 | NDCG@10 / Recall@100 |
| STS(语义相似度) | 句子对相似度打分 | Spearman |
| 摘要(Summarization) | 摘要与原文相似度 | Spearman |
| 排序(Ranking) | 文本排序质量 | Spearman |
注意: MTEB 分数高并不一定代表在你的特定场景上表现好。建议:
- 用 MTEB 做初步筛选
- 用自己的数据做二次验证
- 关注 Retrieval 子分数而非总分
五、模型选型决策框架
你的场景是什么?
│
├── 仅有英文 → Cohere embed-english-v3.0 或 bge-large-en-v1.5
│
├── 多语言/中文
│ ├── 预算充足 → text-embedding-3-large 或 voyage-large-2
│ ├── 自托管可行 → bge-large-zh-v1.5 或 multilingual-e5-large
│ └── 资源受限 → m3e-base 或 text2vec-base-chinese
│
└── 特殊场景
├── 长文档(>512 tokens) → voyage-large-2-instruct(16K上下文)
├── 代码检索 → code-search-* 或 instructor-xlm
├── 高吞吐低延迟 → text-embedding-3-small(最快+最便宜)
└── 最高精度 → text-embedding-3-large 或 voyage-large-2
代码示例:使用 HuggingFace 开源模型
from sentence_transformers import SentenceTransformer
import torch
# 加载中文模型
model = SentenceTransformer(
'BAAI/bge-large-zh-v1.5',
device='cuda' if torch.cuda.is_available() else 'cpu'
)
# BGE 模型需要添加指令前缀
queries = ['查询:RAG系统的工作原理']
passages = ['文档:RAG通过检索外部知识...']
# 编码
query_embeddings = model.encode(
queries,
normalize_embeddings=True,
show_progress_bar=True
)
passage_embeddings = model.encode(
passages,
normalize_embeddings=True,
show_progress_bar=True
)
# 计算相似度
from sklearn.metrics.pairwise import cosine_similarity
similarity = cosine_similarity(query_embeddings, passage_embeddings)
print(f"相似度: {similarity[0][0]:.4f}")
代码示例:使用 Cohere API
import cohere
co = cohere.Client("your-api-key")
# 编码
response = co.embed(
texts=["RAG系统的核心是检索与生成的结合"],
model="embed-multilingual-v3.0",
input_type="search_document"
)
embeddings = response.embeddings
print(f"维度: {len(embeddings[0])}")
六、中文场景特别考量
6.1 分词差异
中文没有空格分隔,Embedding 模型对中文的 tokenization 处理差异很大:
| 模型 | 中文 token 化方式 | 中文字数/token |
|---|---|---|
| OpenAI text-embedding-3 | BPE(字节对编码) | ~1.5 字/token |
| bge-large-zh-v1.5 | WordPiece | ~2 字/token |
| multilingual-e5 | SentencePiece | ~1.8 字/token |
6.2 实际测试建议
# 在自己的数据上测试模型效果
def evaluate_retrieval(
model_name: str,
queries: list[str],
relevant_docs: list[list[int]],
candidates: list[str]
) -> float:
model = SentenceTransformer(model_name)
q_emb = model.encode(queries, normalize_embeddings=True)
c_emb = model.encode(candidates, normalize_embeddings=True)
hits = 0
for i, q in enumerate(queries):
scores = cosine_similarity([q_emb[i]], c_emb)[0]
top_k = scores.argsort()[-3:][::-1]
if any(doc in top_k for doc in relevant_docs[i]):
hits += 1
return hits / len(queries)
七、最佳实践总结
| 场景 | 推荐模型 | 原因 |
|---|---|---|
| 快速原型 | text-embedding-3-small | 最便宜,速度快,效果好 |
| 中文生产环境 | bge-large-zh-v1.5 | 免费自托管,中文最优之一 |
| 多语言生产 | multilingual-e5-large | 多语言支持最好 |
| 最高精度 | voyage-large-2-instruct | MTEB 最高分,支持指令 |
| 数据隐私敏感 | bge-large-zh-v1.5 | 完全本地部署 |
关键原则:
- 在自己数据上测试 — MTEB 分数只是参考
- 维度不是越高越好 — 平衡精度、存储、速度
- 考虑总成本 — API 调用的长期费用 vs 自托管的维护成本
- 留意输入长度限制 — 确保文档分块适配模型的上下文窗口
相关资源: