标签:
- 句子转换器
- 句子相似度
- 特征提取
- 训练生成
基础模型:
- intfloat/multilingual-e5-small
- dragonkue/multilingual-e5-small-ko
管道标签: 句子相似度
库名称: sentence-transformers
许可证: apache-2.0
语言:
- 韩语
- 英语
基于intfloat/multilingual-e5-small的SentenceTransformer模型
这是一个从intfloat/multilingual-e5-small微调而来的sentence-transformers模型,训练数据包含韩语查询-段落对,以提升韩语检索任务的性能。该模型将句子和段落映射到384维密集向量空间,可用于语义文本相似度、语义搜索、复述挖掘、文本分类、聚类等任务。
本模型是一个轻量级韩语检索器,设计初衷是便于使用并在实际检索任务中表现优异。特别适合运行演示或轻量级应用,在速度和准确性之间取得了良好平衡。
如需更高检索性能,建议结合重排序器使用。推荐的重排序器模型:
- dragonkue/bge-reranker-v2-m3-ko
- BAAI/bge-reranker-v2-m3
模型详情
模型描述
模型来源
完整模型架构
SentenceTransformer(
(0): Transformer({'max_seq_length': 512, 'do_lower_case': False}) with Transformer model: BertModel
(1): Pooling({'word_embedding_dimension': 384, 'pooling_mode_cls_token': False, 'pooling_mode_mean_tokens': True, 'pooling_mode_max_tokens': False, 'pooling_mode_mean_sqrt_len_tokens': False, 'pooling_mode_weightedmean_tokens': False, 'pooling_mode_lasttoken': False, 'include_prompt': True})
(2): Normalize()
)
使用方法
直接使用(Sentence Transformers)
首先安装Sentence Transformers库:
pip install -U sentence-transformers
然后加载模型并进行推理:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("dragonkue/multilingual-e5-small-ko")
sentences = [
'query: 北韩家族法第几次修订中明确了离婚判决确定后3个月内登记才有效的条款?',
'passage: 1990年制定的北韩家族法至今已修订4次。1993年第一次修订主要是为了提高规定的准确性而修改了部分条款,实质性内容补充主要是设置了继承承认与放弃期间的第52条。2004年第二次修订新增第20条第3项,明确规定经裁判确定的离婚判决需在3个月内登记才能产生离婚效力。2007年第三次修订新增规定父母子女关系自身份登记机关登记时起产生法律效力(第25条第2项)。此外,关于未成年人、无劳动能力者的抚养相关条款(第37条第2项),从原先"无抚养能力的家庭成员时由分居的父母或子女、祖父母或孙子女、兄弟姐妹抚养"修改为"无抚养能力的家庭成员时由分居的父母或子女抚养,若无则由祖父母或孙子女、兄弟姐妹抚养"。',
'passage: 环境标志制度通过认证标准变更减轻企业负担\n环境标志制度介绍\n□ 概要\n○ 允许在相比同用途其他产品改善了"产品环境性*"的产品上标注标志和说明的认证制度\n※ 产品环境性:指材料与产品在制造·消费废弃全过程中排放污染物或温室气体等的程度及消耗资源与能源的程度等对环境产生影响的程度(「环境技术及环境产业支援法」第2条第5号)\n□ 法律依据\n○ 「环境技术及环境产业支援法」第17条(环境标志的认证)\n□ 相关国际标准\n○ ISO 14024(第1类环境标签)\n□ 适用对象\n○ 办公设备、家电产品、生活用品、建筑材料等156个产品群\n□ 认证现状\n○ 2,737家企业的16,647个产品(截至2015年12月底)'
]
embeddings = model.encode(sentences)
print(embeddings.shape)
similarities = model.similarity(embeddings, embeddings)
print(similarities.shape)
直接使用(Transformers)
import torch.nn.functional as F
from torch import Tensor
from transformers import AutoTokenizer, AutoModel
def average_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor:
last_hidden = last_hidden_states.masked_fill(~attention_mask[..., None].bool(), 0.0)
return last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]
input_texts = ["query: 北韩家族法第几次修订中明确了离婚判决确定后3个月内登记才有效的条款?",
"passage: 1990年制定的北韩家族法至今已修订4次...",
"passage: 环境标志制度通过认证标准变更减轻企业负担..."]
tokenizer = AutoTokenizer.from_pretrained('dragonkue/multilingual-e5-small-ko')
model = AutoModel.from_pretrained('dragonkue/multilingual-e5-small-ko')
batch_dict = tokenizer(input_texts, max_length=512, padding=True, truncation=True, return_tensors='pt')
outputs = model(**batch_dict)
embeddings = average_pool(outputs.last_hidden_state, batch_dict['attention_mask'])
embeddings = F.normalize(embeddings, p=2, dim=1)
scores = (embeddings[:1] @ embeddings[1:].T)
print(scores.tolist())
评估
- 本评估参考KURE GitHub仓库(https://github.com/nlpai-lab/KURE)
- 我们对MTEB中注册的所有韩语检索基准进行了评估
韩语检索基准
指标
信息检索性能对比
模型 |
大小(M) |
平均 |
XPQARetrieval |
PublicHealthQA |
MIRACLRetrieval |
Ko-StrategyQA |
BelebeleRetrieval |
AutoRAGRetrieval |
MrTidyRetrieval |
BAAI/bge-m3 |
560 |
0.724 |
0.361 |
0.804 |
0.701 |
0.794 |
0.932 |
0.830 |
0.647 |
本模型 |
118 |
0.689 |
0.349 |
0.797 |
0.611 |
0.762 |
0.930 |
0.862 |
0.511 |
模型大小与性能对比图
训练详情
训练数据集
本模型在dragonkue/snowflake-arctic-embed-l-v2.0-ko使用的相同数据集上进行了微调,该数据集包含韩语查询-段落对。训练目标是提高韩语检索任务的性能。
训练方法
采用基于聚类段落构建批内负样本的方法,并引入可配置边距的GISTEmbedLoss。边距调整可使性能提升高达+1.5 NDCG@10。
训练超参数
- 批量大小: 20000
- 学习率: 0.00025
- 训练轮数: 3
- 预热比例: 0.05
- 使用FP16混合精度训练
常见问题
1. 是否需要在输入文本前添加"query: "和"passage: "前缀?
是的,这是模型的训练方式,否则会导致性能下降。
2. 为什么余弦相似度分数分布在0.7到1.0之间?
这是预期行为,因为我们使用了低温度(0.01)的InfoNCE对比损失。对于文本检索或语义相似度任务,重要的是分数的相对顺序而非绝对值。
引用
BibTeX引用格式
Sentence Transformers
@inproceedings{reimers-2019-sentence-bert,
title = "Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks",
author = "Reimers, Nils and Gurevych, Iryna",
booktitle = "Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing",
month = "11",
year = "2019",
publisher = "Association for Computational Linguistics",
url = "https://arxiv.org/abs/1908.10084",
}
局限性
长文本将被截断至最多512个标记。