Skip to content
🔗 分享本题
查看我的学习进度 →

Embedding 模型选型动漫知识图:用领域标注集比较语言适配、检索质量、输入长度、维度存储、吞吐延迟、成本隐私和指令兼容性

记忆点:用自己的数据测检索,再算部署、存储和迁移成本。

💡 答案要点

选择维度

维度考虑因素推荐
1. 语言中文 / 英文 / 多语言中文首选BGE,多语言用M3
2. 成本闭源API / 开源自部署预算少用开源,省钱
3. 性能MTEB排行榜得分看检索任务NDCG@10指标
4. 维度256 / 768 / 1024 / 3072大数据集用低维(256),小数据集高维
5. Token限制512 / 8192RAG分块用512够,长文本用8K
6. 部署API / 本地推理数据敏感用本地,方便用API

主流模型对比(2024)

闭源API模型

模型维度语言价格(百万token)优势劣势
text-embedding-3-large256~3072可调多语言$0.13OpenAI官方,质量稳定贵,数据外传
text-embedding-3-small512~1536可调多语言$0.02便宜,性能够用不如large
Cohere embed-v31024多语言$0.10支持检索/分类双模式小众
Voyage-21024英文$0.12专为RAG优化只支持英文

选择建议:

  • 预算充足: text-embedding-3-large (3072维)
  • 性价比: text-embedding-3-small
  • RAG专用: Voyage-2 (英文) / Cohere (多语言)

开源模型(可本地部署)

模型维度语言MTEB得分模型大小推荐场景
bge-large-zh-v1.51024中文⭐64.531.3GB中文RAG首选
bge-large-en-v1.51024英文63.981.3GB英文通用
BGE-M31024多语言⭐66.122.2GB中英混合,跨语言检索
gte-large-zh1024中文63.851.3GB备选,阿里出品
stella-base-zh-v2768中文64.08400MB轻量级,速度快
jina-embeddings-v2768多语言60.38550MB支持8K长文本
E5-large-v21024英文62.251.3GB微软出品

选择建议:

  • 中文项目: bge-large-zh-v1.5 (最强) / stella-base-zh-v2 (快)
  • 多语言: BGE-M3
  • 长文本: jina-embeddings-v2 (支持8K tokens)
  • 资源受限: stella-base-zh-v2 (400MB小模型)

实战代码

方案1: 闭源API(OpenAI)

python
from openai import OpenAI

client = OpenAI(api_key="sk-xxx")

def embed_text(text):
    response = client.embeddings.create(
        model="text-embedding-3-large",
        input=text,
        dimensions=1024  # 可选256/1024/3072
    )
    return response.data[0].embedding

# 使用
vector = embed_text("什么是RAG系统?")
print(len(vector))  # 1024

优点: 零部署,调用即用 缺点: 每百万token $0.13,数据外传

方案2: 开源本地部署

python
from sentence_transformers import SentenceTransformer

# 加载模型(首次会下载,约1.3GB)
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')

def embed_text(text):
    # 编码
    embedding = model.encode(
        text,
        normalize_embeddings=True  # 归一化,方便余弦相似度
    )
    return embedding

# 批量处理(更快)
texts = ["什么是RAG?", "如何优化检索?", "向量数据库选择"]
embeddings = model.encode(texts, batch_size=32)
print(embeddings.shape)  # (3, 1024)

优点: 免费,数据不外传,可微调 缺点: 需要GPU(CPU慢10倍),首次下载模型

方案3: 混合策略

python
class HybridEmbedding:
    def __init__(self):
        # 开源模型处理中文
        self.zh_model = SentenceTransformer('BAAI/bge-large-zh-v1.5')
        # API处理英文
        self.openai_client = OpenAI(api_key="sk-xxx")

    def embed(self, text, language='auto'):
        # 自动检测语言
        if language == 'auto':
            language = 'zh' if contains_chinese(text) else 'en'

        if language == 'zh':
            # 用本地模型(免费)
            return self.zh_model.encode(text)
        else:
            # 用OpenAI(付费但质量好)
            response = self.openai_client.embeddings.create(
                model="text-embedding-3-large",
                input=text
            )
            return response.data[0].embedding

def contains_chinese(text):
    return any('\u4e00' <= char <= '\u9fff' for char in text)

优势: 中文省钱,英文质量保证

性能测试

python
import time
from sentence_transformers import SentenceTransformer

# 测试embedding速度
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')

texts = ["测试文本"] * 1000

# CPU
start = time.time()
embeddings = model.encode(texts, device='cpu')
cpu_time = time.time() - start
print(f"CPU: {cpu_time:.2f}s, {len(texts)/cpu_time:.1f} texts/s")

# GPU
start = time.time()
embeddings = model.encode(texts, device='cuda')
gpu_time = time.time() - start
print(f"GPU: {gpu_time:.2f}s, {len(texts)/gpu_time:.1f} texts/s")

# 输出示例:
# CPU: 45.23s, 22.1 texts/s
# GPU: 3.12s, 320.5 texts/s
# GPU快14倍!

微调Embedding模型

场景: 通用模型在你的领域(如医疗/法律)效果差

展开 Python 代码示例(34 行)
python
from sentence_transformers import SentenceTransformer, InputExample, losses
from torch.utils.data import DataLoader

# 1. 准备训练数据
train_examples = [
    InputExample(
        texts=["患者出现发热症状", "病人体温升高"],
        label=1.0  # 相似
    ),
    InputExample(
        texts=["患者出现发热症状", "今天天气很好"],
        label=0.0  # 不相似
    ),
    # ... 至少1000对
]

# 2. 加载基础模型
model = SentenceTransformer('BAAI/bge-large-zh-v1.5')

# 3. 定义损失函数
train_dataloader = DataLoader(train_examples, shuffle=True, batch_size=16)
train_loss = losses.CosineSimilarityLoss(model)

# 4. 微调
model.fit(
    train_objectives=[(train_dataloader, train_loss)],
    epochs=3,
    warmup_steps=100,
    output_path='./my-domain-embedding'
)

# 5. 使用微调模型
custom_model = SentenceTransformer('./my-domain-embedding')
embedding = custom_model.encode("医学专业术语")

效果: 领域适配性+10~20%

决策树

需要embedding模型?
├─ 中文为主?
│  ├─ 是 → bge-large-zh-v1.5 (开源)
│  └─ 否 → 继续
├─ 多语言/跨语言?
│  ├─ 是 → BGE-M3 (开源) / text-embedding-3-large (付费)
│  └─ 否 → 继续
├─ 预算充足?
│  ├─ 是 → text-embedding-3-large (质量最好)
│  └─ 否 → text-embedding-3-small (性价比)
├─ 数据敏感/不能外传?
│  ├─ 是 → 必须用开源本地部署
│  └─ 否 → API更方便
└─ 需要处理长文本(>512 token)?
   ├─ 是 → jina-embeddings-v2 (8K) / text-embedding-3 (8K)
   └─ 否 → 任意模型

面试话术:

"Embedding模型选择看4点:语言(中文用bge)、成本(预算少开源)、性能(看MTEB排行)、部署(敏感数据本地)。我们项目是中文RAG,选了bge-large-zh-v1.5本地部署,1.3GB模型GPU推理每秒300条,免费且效果好。如果是多语言就用BGE-M3,如果不care成本就text-embedding-3-large。"

📚 参考:MTEB Leaderboard(Embedding 模型评测榜) · OpenAI Embeddings Guide