模型介绍
M3E 是 Moka Massive Mixed Embedding 的缩写,M3E模型是文本嵌入模型(Embedding),可以将自然语言转换成稠密的向量,主要用于计算文本向量。
- Moka,此模型由 MokaAI 训练,开源和评测,训练脚本使用 uniem ,评测 BenchMark 使用 MTEB-zh
- Massive,此模型通过千万级 (2200w+) 的中文句对数据集进行训练
- Mixed,此模型支持中英双语的同质文本相似度计算,异质文本检索等功能,未来还会支持代码检索
模型对比
M3E提供了两个不同参数量的模型m3e-small 和 m3e-base,M3E和其他模型对比如下表格:
参数数量 | 维度 | 中文 | 英文 | s2s | s2p | s2c | 开源 | 兼容性 | s2s Acc | s2p ndcg | |
---|---|---|---|---|---|---|---|---|---|---|---|
m3e-small | 24M | 512 | 是 | 否 | 是 | 否 | 否 | 是 | 优 | 0.5834 | 0.7262 |
m3e-base | 110M | 768 | 是 | 是 | 是 | 是 | 否 | 是 | 优 | 0.6157 | 0.8004 |
text2vec | 110M | 768 | 是 | 否 | 是 | 否 | 否 | 是 | 优 | 0.5755 | 0.6346 |
openai-ada-002 | 未知 | 1536 | 是 | 是 | 是 | 是 | 是 | 否 | 优 | 0.5956 | 0.7786 |
说明:
- s2s, 即 sentence to sentence ,代表了同质文本之间的嵌入能力,适用任务:文本相似度,重复问题检测,文本分类等
- s2p, 即 sentence to passage ,代表了异质文本之间的嵌入能力,适用任务:文本检索,GPT 记忆模块等
- s2c, 即 sentence to code ,代表了自然语言和程序语言之间的嵌入能力,适用任务:代码检索
- 兼容性,代表了模型在开源社区中各种项目被支持的程度,由于 m3e 和 text2vec 都可以直接通过 sentence-transformers 直接使用,所以和 openai 在社区的支持度上相当
Tips:
- 使用场景主要是中文,少量英文的情况,不想花钱,不想泄露私有数据,建议使用 m3e 系列的模型
- 多语言使用场景,并且不介意数据隐私的话,建议使用 openai text-embedding-ada-002
- 代码检索场景,推荐使用 openai text-embedding-ada-002
- 文本检索场景,请使用具备文本检索能力的模型,只在 S2S 上训练的文本嵌入模型,没有办法完成文本检索任务
模型使用
需要先安装 sentence-transformers
pip install -U sentence-transformers
安装完成后,可以使用以下代码来使用 M3E Models
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('moka-ai/m3e-base')
# 准备一些测试文本,用于生成文本向量
sentences = [
'* Moka 此文本嵌入模型由 MokaAI 训练并开源,训练脚本使用 uniem',
'* Massive 此文本嵌入模型通过**千万级**的中文句对数据集进行训练',
'* 欢迎访问 www.tizi365.com'
]
# 调用模型生成文本向量
embeddings = model.encode(sentences)
# 打印向量计算结果
for sentence, embedding in zip(sentences, embeddings):
print("文本内容:", sentence)
print("文本向量:", embedding)
print("")
提示:注意首次运行代码会自动从huggingface下载模型参数,m3e-small 大概100M,m3e-base大概7,800M。参数越大模型越大,模型默认缓存目录~/.cache/huggingface/,可以通过TRANSFORMERS_CACHE 环境变量修改缓存目录。
M3E 系列的所有模型在设计的时候就考虑到完全兼容sentence-transformers,所以你可以通过替换名称字符串的方式在所有支持 sentence-transformers 的项目中无缝使用 M3E Models。