KaLM-Embedding
哈工深团队打造的中文语义嵌入王者,MTEB 中文榜单多任务第一
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
哈工深团队打造的中文语义嵌入王者,MTEB 中文榜单多任务第一
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
想象这样一个场景:你是一家法律科技公司的算法工程师,老板要求你开发一个类案检索系统——律师输入一段案情描述,系统自动从百万份判决文书中找出最相似的案例。
这不是科幻。哈尔滨工业大学(深圳)团队信息检索实验室(HITsz-TMG)正是带着这样的真实需求,开发了 KaLM-Embedding 系列文本嵌入模型。这个来自中国本土的模型,在 MTEB 中文榜单上展现了令人印象深刻的能力——它不是简单搬运英文模型,而是从数据、训练方法到评估体系,都为中文语义理解做了深度优化。
KaLM-Embedding 基于 sentence-transformers 框架构建,核心技术栈如下:
| 层级 | 技术 |
|---|---|
| 基座模型 | BERT / DeBERTa-v3 / LLMs (0.5B V2) |
| 训练框架 | PyTorch 2.0.1 + DeepSpeed |
| 优化方法 | Matryoshka Representation Learning、Ranking Consistency Filtering |
| 评估工具 | MTEB (Massive Text Embedding Benchmark) |
| 嵌入组件 | FlagEmbedding、faiss-gpu |
项目代码结构清晰,分为三个核心模块:
KaLM-Embedding/
├── train/ # 训练模块
│ ├── data.py # 数据加载与预处理
│ ├── losses.py # 损失函数(Contrastive、Triplet 等)
│ ├── trainer.py # DeepSpeed 分布式训练器
│ ├── hn_mine.py # 难负例挖掘
│ └── run.py # 训练入口
├── evaluate/ # 评估模块
│ ├── run_mteb.py # 多 GPU MTEB 评估(队列式任务分配)
│ └── tasks/ # 评测任务集
└── scipts/ # Shell 脚本
├── train.sh # 训练脚本
├── hn_mine.sh # 难负例挖掘脚本
└── eval_mteb.sh # 评测脚本

在 MTEB(Massive Text Embedding Benchmark)中文评测集上,KaLM-Embedding 系列的表现如下:

MTEB 是目前最权威的文本嵌入模型评测基准,覆盖 58 个任务、113 个数据集,评测任务类型包括:检索(Retrieval)、重排序(Reranking)、分类(Classification)、聚类(Clustering)、STS(语义相似度)、Pair Classification、蒸馏检索(Bitext Mining) 等。

KaLM-Embedding 的训练创新是本项目的核心价值,主要体现在以下三个方面:
传统的难负例挖掘往往只考虑相似度得分,而 KaLM-Embedding 引入了一个巧妙的过滤机制:在不同温度参数下多次采样,如果某个样本在不同采样下的排名波动过大,则认为它是"噪声负例"并过滤掉。这一策略有效提升了训练数据质量。
不同任务的样本混合在同一个 batch 中训练容易造成任务间干扰。KaLM-Embedding 在 batch 构造时进行同质性筛选,将语义空间接近的任务样本打包,使训练更稳定。
借鉴俄罗斯套娃思想,KaLM-Embedding 同时学习不同维度的嵌入表征——从 768 维到 64 维,支持灵活的速度-精度权衡(Speed-Accuracy Trade-off)。这在实际部署中非常实用。
conda env create -f environment.yaml
conda activate kalm
bash ./scipts/hn_mine.sh
通过调整 filter_topk 参数控制排名一致性过滤的阈值。
bash ./scipts/train.sh
bash ./scipts/eval_mteb.sh
评估代码支持多 GPU 并行,使用队列机制将不同任务分配到不同 GPU,显著提升评测效率。
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("HIT-TMG/KaLM-embedding-multilingual-mini-instruct-v2")
embeddings = model.encode(["文本1", "文本2"])
KaLM-Embedding 的发展轨迹反映了一个趋势:中文语义嵌入正在从"英文模型汉化版"走向"原生中文优化"。从 V1 到 V2,团队不仅在模型规模上从 BERT 类模型演进到 0.5B LLM 基础,更在训练方法上引入了多项创新。
对于 RAG(检索增强生成)系统、语义搜索、类案检索等应用场景,KaLM-Embedding 提供了一个高质量的开源中文嵌入选择。