Skip to content

关键:选“适合任务”的嵌入,而不是分数最高的那一个。

🎯 文章目标

  • 建立质量/成本/速度的选型框架
  • 给出多语种/跨域/短文本/长段落的差异化建议
  • 提供最小评测脚本

📚 背景/前置

  • 常见选择:bge、e5、text-embedding-3、nomic-embed
  • 影响因素:语种、领域专有词、文本长度、推理平台

🔧 核心内容

1) 选型维度

  • 质量:召回率、NDCG、跨语种检索能力
  • 成本:向量维度/内存/存储、推理单价
  • 速度:吞吐与延迟,批处理能力

2) 最小对比脚本(Python)

python
# pip install sentence-transformers chromadb
import time, chromadb
from sentence_transformers import SentenceTransformer

pairs = [
  ('退货流程是什么?','退货需要在7天内申请并提供订单号'),
  ('如何重置密码?','前往设置页面,点击“重置密码”'),
]

models = ['bge-small-zh-v1.5', 'intfloat/multilingual-e5-base']

for m in models:
    st = SentenceTransformer(m)
    ch = chromadb.Client().get_or_create_collection('tmp', metadata={"hnsw:space":"cosine"})
    docs = [x[1] for x in pairs]
    ch.add(ids=[str(i) for i in range(len(docs))], documents=docs)
    qs = [x[0] for x in pairs]
    t0 = time.time();
    for q in qs: ch.query(query_texts=[q], n_results=1)
    print(m, 'avg_ms', (time.time()-t0)/len(qs)*1000)

3) 选择建议

  • 中文/短文本优先 bge/e5 中文系;多语种场景选 multilingual-e5
  • 长段落:先切分再嵌入;考虑降低向量维度以控内存
  • 与召回/重排/生成联动看整体效果,而不是单看嵌入分数

📊 对比/取舍(速查)

  • 质量 vs 成本 vs 速度:按业务指标权衡,而非单指标最优
  • 自托管 vs 托管:可控性/成本 vs 维护复杂度

🧪 踩坑与经验

  • 只看公开榜单:不一定适配你的语料与任务
  • 忽略向量维度:内存与检索速度可能成为瓶颈
  • 嵌入漂移:模型更新需回归评测

📎 参考与延伸

  • MTEB 榜单与评测方法
  • 向量维度压缩与量化

💭 总结

  • 以任务为中心做嵌入选型,并与检索/重排/生成联动评估