关键:选“适合任务”的嵌入,而不是分数最高的那一个。
🎯 文章目标
- 建立质量/成本/速度的选型框架
- 给出多语种/跨域/短文本/长段落的差异化建议
- 提供最小评测脚本
📚 背景/前置
- 常见选择: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 榜单与评测方法
- 向量维度压缩与量化
💭 总结
- 以任务为中心做嵌入选型,并与检索/重排/生成联动评估