库名称: sentence-transformers
流水线标签: 句子相似度
标签:
- sentence-transformers
- 句子相似度
- 特征提取
许可证: mit
数据集:
- airesearch/WangchanX-Legal-ThaiCCL-RAG
- VISAI-AI/nitibench
语言:
- 泰语
基础模型:
- BAAI/bge-m3
人工微调的BGE-M3 CCL模型
[📄技术报告]
这是基于BAAI/bge-m3
模型在airesearch/WangchanX-Legal-ThaiCCL-RAG
查询数据上微调的版本。
微调细节
除了原始需要人工重排和去除无关文档的airesearch/WangchanX-Legal-ThaiCCL-RAG
数据集外,本模型在完全自动化环境中完成微调。具体流程如下:
- 使用
BAAI/bge-m3
基于0.8分数阈值检索N条相关法律条款
- 通过
BAAI/bge-reranker-v2-m3
对文档重排,过滤重排分数低于0.8的文档,得到最终正样本
- 基于步骤(2)的正样本对BGE-M3模型进行微调
模型性能
数据集 |
Top-K |
HR@k |
多HR@k |
召回率@k |
MRR@k |
多MRR@k |
NitiBench-CCL |
1 |
0.735 |
– |
0.735 |
0.735 |
– |
NitiBench-CCL |
5 |
0.906 |
– |
0.906 |
0.805 |
– |
NitiBench-CCL |
10 |
0.938 |
– |
0.938 |
0.809 |
– |
NitiBench-Tax |
1 |
0.480 |
0.140 |
0.255 |
0.480 |
0.255 |
NitiBench-Tax |
5 |
0.740 |
0.220 |
0.411 |
0.565 |
0.320 |
NitiBench-Tax |
10 |
0.800 |
0.280 |
0.499 |
0.574 |
0.333 |
使用方法
安装:
git clone https://github.com/FlagOpen/FlagEmbedding.git
cd FlagEmbedding
pip install -e .
或:
pip install -U FlagEmbedding
生成文本嵌入
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('VISAI-AI/nitibench-ccl-human-finetuned-bge-m3',
use_fp16=True)
sentences_1 = ["什么是BGE M3?", "BM25的定义"]
sentences_2 = ["BGE M3是支持稠密检索、词法匹配和多向量交互的嵌入模型",
"BM25是基于查询词在文档中出现情况的检索排序函数"]
embeddings_1 = model.encode(sentences_1,
batch_size=12,
max_length=8192
)['dense_vecs']
embeddings_2 = model.encode(sentences_2)['dense_vecs']
similarity = embeddings_1 @ embeddings_2.T
print(similarity)
也可使用sentence-transformers或huggingface transformers生成稠密嵌入,详见baai_general_embedding。
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('VISAI-AI/nitibench-ccl-human-finetuned-bge-m3', use_fp16=True)
sentences_1 = ["金融机构投资证券的比例是否可达其总资本的百分之十?",
"当泰国央行因金融机构资本不足法定35%而命令停业时,需向何人或机构申请撤销执照"]
sentences_2 = ["《金融机构业务法》第33条:在符合第34和35条前提下,金融机构可按泰国央行规定投资证券",
"《金融机构业务法》第97条:当金融机构资本不足第30条规定35%时,泰国央行应令其停业,除非严重影响整体经济。停业后应提请部长撤销执照"]
output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=False)
output_2 = model.encode(sentences_2, return_dense=True, return_sparse=True, return_colbert_vecs=False)
print(model.convert_id_to_token(output_1['lexical_weights']))
print(model.compute_lexical_matching_score(output_1['lexical_weights'][0], output_2['lexical_weights'][0]))
from FlagEmbedding import BGEM3FlagModel
model = BGEM3FlagModel('VISAI-AI/nitibench-ccl-human-finetuned-bge-m3', use_fp16=True)
output_1 = model.encode(sentences_1, return_dense=True, return_sparse=True, return_colbert_vecs=True)
output_2 = model.encode(sentences_2, return_dense=True, return_sparse=True, return_colbert_vecs=True)
print(model.colbert_score(output_1['colbert_vecs'][0], output_2['colbert_vecs'][0]))
计算文本对分数
sentence_pairs = [[i,j] for i in sentences_1 for j in sentences_2]
print(model.compute_score(sentence_pairs,
max_passage_length=128,
weights_for_different_modes=[0.4, 0.2, 0.4]))
致谢
衷心感谢WangchanX项目赞助商PTT、SCB和SCBX的资金支持,以及VISTEC的关键合作。感谢Pirat Pothavorn进行模型评估,Supavish Punchun完成模型微调,以及所有开源项目作者。
引用
@misc{akarajaradwong2025nitibenchcomprehensivestudiesllm,
title={NitiBench: 泰国法律问答LLM框架能力综合研究},
author={Pawitsapak Akarajaradwong等},
year={2025},
eprint={2502.10868},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2502.10868},
}