新闻 | News
[2024-04-06] 开源 puff 系列模型,专为检索与语义匹配任务优化,侧重泛化能力与私有通用测试集表现,支持可变向量维度,兼容中英双语。
[2024-02-27] 开源 stella-mrl-large-zh-v3.5-1792d 模型,支持向量维度动态调整。
[2024-02-17] 开源 stella v3 系列、对话专用编码模型及配套训练数据。
[2023-10-19] 开源 stella-base-en-v2,使用简便,无需任何前缀文本。
[2023-10-12] 开源 stella-base-zh-v2 与 stella-large-zh-v2,性能提升且使用简单,无需任何前缀文本。
[2023-09-11] 开源 stella-base-zh 和 stella-large-zh
欢迎访问本人主页获取最新模型,并留下宝贵建议!
本次开源包含两个通用向量编码模型和一个对话专用向量编码模型,同时开放全量160万对话重写数据集及20万难负例检索数据集。
开源模型:
| 模型名称 | 模型大小 | 最大令牌数 | 向量维度 | 语言 | 场景 | C-MTEB 评分 |
|---|---|---|---|---|---|---|
| infgrad/stella-base-zh-v3-1792d | 0.4GB | 512 | 1792 | zh-CN | 通用文本 | 67.96 |
| infgrad/stella-large-zh-v3-1792d | 1.3GB | 512 | 1792 | zh-CN | 通用文本 | 68.48 |
| infgrad/stella-dialogue-large-zh-v3-1792d | 1.3GB | 512 | 1792 | zh-CN | 对话文本 | 不适用 |
开源数据:
以上数据均采用LLM技术构建,诚邀社区共同贡献数据资源。
通过SentenceTransformer直接加载:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("infgrad/stella-base-zh-v3-1792d")
# model = SentenceTransformer("infgrad/stella-large-zh-v3-1792d")
vectors = model.encode(["text1", "text2"])使用场景: 在一段对话中,需要根据用户语句检索相关文本时,若对话存在大量指代和省略现象导致通用编码模型效果不佳,可采用本项目专用的对话编码模型进行语义编码
使用要点:
"{角色}: {文本内容}",并通过[SEP]符号进行拼接若对使用方法存在疑问,请参阅后续章节了解该模型的训练机制。
使用示例:
from sentence_transformers import SentenceTransformer
dial_model = SentenceTransformer("infgrad/stella-dialogue-large-zh-v3-1792d")
general_model = SentenceTransformer("infgrad/stella-large-zh-v3-1792d")
# dialogue = ["张三: 吃饭吗", "李四: 等会去"]
dialogue = ["A: 最近去打篮球了吗", "B: 没有"]
corpus = ["B没打篮球是因为受伤了。", "B没有打乒乓球"]
last_utterance_vector = dial_model.encode(["[SEP]".join(dialogue)], normalize_embeddings=True)
corpus_vectors = general_model.encode(corpus, normalize_embeddings=True)
# 计算相似度
sims = (last_utterance_vector * corpus_vectors).sum(axis=1)
print(sims)难负例挖掘也是一个经典的训练技巧,几乎总能有效提升模型性能
Dropout早已成为深度学习中的标准配置,我们可以稍作调整使其更适用于句向量训练。 在训练过程中,我们尝试让每个词嵌入都能表征整个句子的语义,而在推理阶段通过均值池化实现类似模型集成的效果。 具体实现是在均值池化操作中加入一维dropout,PyTorch代码如下:
vector_dropout = nn.Dropout1d(0.3) # 算力有限,试了0.3和0.5 两个参数,其中0.3更优
last_hidden_state = bert_model(...)[0]
last_hidden = last_hidden_state.masked_fill(~attention_mask[..., None].bool(), 0.0)
last_hidden = vector_dropout(last_hidden)
vectors = last_hidden.sum(dim=1) / attention_mask.sum(dim=1)[..., None]参见本人历史文章:https://www.zhihu.com/pin/1674913544847077376
单条数据示例:
{
"dialogue": [
"A: 最近去打篮球了吗",
"B: 没有"
],
"last_utterance_rewrite": "B: 我最近没有去打篮球"
}loss = cosine_loss( dial_model.encode(dialogue), existing_model.encode(last_utterance_rewrite) )dial_model 是指待训练的模型,本人以 stella-large-zh-v3-1792d 作为基础模型(base-model)进行继续训练。
existing_model 指现已训练完成的通用编码模型,本人使用的是 stella-large-zh-v3-1792d。
目前已开源 dialogue-embedding 的全量训练数据,理论上可复现本模型效果。
Loss 下降情况如下:
目前暂无专门的测试集,经本人简单测试确有效果,部分测试结果详见文件 dial_retrieval_test.xlsx。
Q: 为什么向量维度是1792?
A: 最初计划发布768、1024、768+768、1024+1024、1024+768等多种维度,但因时间有限,目前仅完成1792维度的模型。理论上维度越高效果越好。
Q: 如何复现 CMTEB 评测效果?
A: 通过 SentenceTransformer 加载模型后直接使用官方评测脚本即可。请注意,分类任务中的向量需先进行归一化(normalize)处理。
Q: 复现的 CMTEB 结果与本文报告不一致?
A: 聚类结果不一致属正常现象,因官方评测代码未设定随机种子。若其他项目存在差异,建议检查代码或联系本人。
Q: 如何选择向量模型?
A: 没有一劳永逸的解决方案,建议在自己的测试集上验证效果。本人推荐 bge、e5 和 stella 系列模型。
Q: 文本长度为何限定512?能否扩展?
A: 可以扩展但不推荐。更长的文本普遍效果不佳,这是当前训练方法与数据特性所致,几乎无法根本解决。建议对长文本采用分块处理。
Q: 训练资源与算力需求?
A: 需处理亿级别数据量,单张 A100 显卡需持续训练一个月以上。
改写说明:
如果您有其他风格或特定平台发布的需求,我可以进一步为您调整表达。