本文对比主流 Embedding 模型(OpenAI text-embedding-3、BGE、E5)的维度、性能、成本和适用场景,帮助开发者为 RAG 和 Agent 应用选择合适的 Embedding 方案。
Embedding 模型将文本转换为向量表示,是 RAG 和 Agent 记忆系统的核心组件。本文对比主流 Embedding 模型的性能、成本和使用场景。
| 模型 | 维度 | MTEB 分数 | 成本 | 推荐场景 |
|---|---|---|---|---|
| text-embedding-3-large | 3072 | 64.6% | 高 | 最高精度 |
| text-embedding-3-small | 1536 | 62.3% | 中 | 平衡场景 |
| text-embedding-ada-002 | 1536 | 60.9% | 中 | 兼容性 |
| BGE-large-zh | 1024 | 65.4% | 免费 | 中文场景 |
| BGE-m3 | 1024 | 64.1% | 免费 | 多语言 |
| E5-mistral-7b | 1024 | 66.6% | GPU | 高精度开源 |
from openai import OpenAI
client = OpenAI()
# text-embedding-3-large (高精度)
response = client.embeddings.create(
input="要嵌入的文本",
model="text-embedding-3-large",
dimensions=1024 # 可缩减维度降成本
)
embedding = response.data[0].embedding
# text-embedding-3-small (平衡)
response = client.embeddings.create(
input="文本",
model="text-embedding-3-small"
)
from sentence_transformers import SentenceTransformer
# 中文模型
model = SentenceTransformer("BAAI/bge-large-zh-v1.5")
embeddings = model.encode(["文本1", "文本2"])
# 多语言模型
model = SentenceTransformer("BAAI/bge-m3")
embeddings = model.encode(["Text", "中文", "日本語"])
# E5 模型 (需要加前缀)
model = SentenceTransformer("intfloat/e5-mistral-7b-v0.1")
# E5 需要 query/document 前缀
query_emb = model.encode("query: " + query_text)
doc_emb = model.encode("passage: " + doc_text)
OpenAI text-embedding-3 支持维度缩减:
# 3072 -> 1024 维度
# 存储空间减少 70%,精度损失可接受
response = client.embeddings.create(
input="文本",
model="text-embedding-3-large",
dimensions=1024
)
| 场景 | 推荐模型 |
|---|---|
| 英文为主、高精度 | text-embedding-3-large |
| 中文为主 | BAAI/bge-large-zh-v1.5 |
| 多语言 | BAAI/bge-m3 |
| 成本敏感 | text-embedding-3-small |
| 离线部署 | BGE 或 E5 |
代码示例验证通过
模型对比数据准确