ST模型调优实操:30分钟提升检索成功率至95%

以下是改写后的文章内容:
如何利用 Sentence Transformers 实现多模态嵌入模型和重排序模型的训练与调优
直接切入主题,今天我们来聊聊多模态嵌入模型和重排序模型的训练。对于中国的跨境人来说,这项技术可以帮助我们在复杂的数据环境中找到最优解,特别是在处理图片、表格、文本等多模态信息的场景中,提升跨境生态体系中的工作效率和竞争力。新媒网跨境了解到,这项应用尤其适合视觉文档检索等任务,能快速匹配最合适的目标内容。
为什么要进行模型调优?
一般来说,像 Qwen/Qwen3-VL-Embedding-2B 这样的多模态嵌入模型被设计为通用型模型,覆盖的任务非常广泛,比如图文匹配、视觉问答、文档理解等。然而,这种“通用性”带来的一个弊端,就是在特定垂直领域的表现可能不够理想。如果我们把任务聚焦到“视觉文档检索”,比如用“公司第三季度的营收是多少?”这样的文本查询去筛选出几千张截图中的相关文档,这对模型的能力要求就很高了。如何理解文档的布局、表格、图表和文本内容?这完全不同于匹配鞋子图片和产品描述这样的任务。
通过针对业务数据进行模型调优,可以让模型学习到特定领域的规律。以实际数据为例,经过调优后,模型的 NDCG@10 性能从 0.888 提升到了 0.947,超过了同类规模的其他模型,包括一些更大的模型。这充分体现了针对性的调优能够强有力地提升多模态模型的实战效果。
多模态训练的关键内容
多模态的模型训练和传统的文本模型训练类似,都包括以下几个核心组件:
- 模型:待训练或调优的多模态模型。
- 数据集:模型训练和评估所需的数据。
- 损失函数:评估模型效果并指导优化的函数。
- 训练参数:影响训练效率及结果追踪的设定。
- 评估工具:用于训练期间或之后评估模型表现。
- 训练器:将以上所有内容整合起来完成训练任务。
新媒网跨境认为,这些组件的拆解能够帮助我们更科学地理解流程,并为业务需求找到最合适的解决方案。至于多模态模型的训练流程,则可以直接使用 Sentence Transformer 中的训练工具,只需要在数据中结合图片等模态内容即可,无须复杂的技术处理。
模型结构
目前,多模态模型调优主要有两种路径:
1. 基于现有模型的调优
我们可以选择已有的多模态嵌入模型进行调优,这些模型已经包含“modules.json”文件,可以通过 processor_kwargs 和 model_kwargs 配置处理参数,适应具体应用场景:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer(
"Qwen/Qwen3-VL-Embedding-2B",
model_kwargs={"attn_implementation": "flash_attention_2", "torch_dtype": "bfloat16"},
processor_kwargs={"min_pixels": 28 * 28, "max_pixels": 600 * 600},
)
2. 从零开始构建模型
如果要从未调优过的视觉-语言模型(VLM)入手,这些模型支持多模态嵌入,但需进一步训练以适配特定任务:
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("Qwen/Qwen3-VL-2B")
通过上述方法获得的模型可以支持多种模态,并且自动添加必要的池化机制。例如:
print(model.modalities) # ['text', 'image', 'video', 'message']
print(model.supports("image")) # True
新媒网跨境获悉,多模态模型还支持通过 Router 组件搭建更灵活的结构,将不同模态的编码器组合起来,为模型的扩展带来更多可能。
数据集格式
我们可以使用处理过的数据集进行实验,例如 llamaindex-vdr-en-train-preprocessed 数据集。这种数据集允许输入包含文本、图片、音频等多种模态信息,非常适合检索任务:
- 文本:字符串类型。
- 图片:可以是文件路径、URL链接或数组。
- 音频和视频:支持路径或字典键形式。
以下是示例数据加载方法:
from datasets import load_dataset
train_dataset = load_dataset("tomaarsen/llamaindex-vdr-en-train-preprocessed", "train", split="train")
eval_dataset = load_dataset("tomaarsen/llamaindex-vdr-en-train-preprocessed", "eval", split="train")
损失函数
在此调优过程中,我们选择了 CachedMultipleNegativesRankingLoss 损失函数,专门适配检索任务。它允许对查询和正样本进行更多负样本扩展:
from sentence_transformers.sentence_transformer.losses import CachedMultipleNegativesRankingLoss
loss = CachedMultipleNegativesRankingLoss(model, mini_batch_size=1)
此外,为了让嵌入能够适应不同维度,还引入了 MatryoshkaLoss,特别适合多模态模型的需求:
from sentence_transformers.sentence_transformer.losses import MatryoshkaLoss
loss = MatryoshkaLoss(model, loss, matryoshka_dims=[2048, 1536, 1024, 512, 256, 128, 64])
训练过程和性能评估
训练过程中,可以使用如下参数配置:
from sentence_transformers.sentence_transformer.training_args import SentenceTransformerTrainingArguments
args = SentenceTransformerTrainingArguments(
output_dir="models/Qwen3-VL-Embedding-2B-vdr",
num_train_epochs=1,
per_device_train_batch_size=64,
learning_rate=2e-5,
warmup_ratio=0.1,
save_steps=0.1,
logging_steps=0.05,
)
用于评估的工具如 InformationRetrievalEvaluator,能够有效追踪模型在检索任务中的表现:
from sentence_transformers.sentence_transformer.evaluation import InformationRetrievalEvaluator
eval_queries = {qid: sample["query"] for qid, sample in enumerate(eval_dataset)}
eval_corpus = {did: sample["image"] for did, sample in enumerate(eval_dataset)}
eval_relevant_docs = {idx: [idx] for idx in range(len(eval_dataset))}
eval_evaluator = InformationRetrievalEvaluator(
queries=eval_queries,
corpus=eval_corpus,
relevant_docs=eval_relevant_docs,
batch_size=1,
show_progress_bar=True,
name="vdr-eval-hard",
)
最后,通过 SentenceTransformerTrainer 汇总各类组件并启动训练:
from sentence_transformers.sentence_transformer.trainer import SentenceTransformerTrainer
trainer = SentenceTransformerTrainer(
model=model,
args=args,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
loss=loss,
evaluator=eval_evaluator,
)
trainer.train()
实验结果
新媒网跨境认为,通过训练和调优,模型的检索性能显著提升。以 NDCG@10 为例,调优后的模型达到了 0.947,实现了从 0.888 的飞跃。
新媒网(公号: 新媒网跨境发布),是一个专业的跨境电商、游戏、支付、贸易和广告社区平台,为百万跨境人传递最新的海外淘金精准资讯情报。
本文来源:新媒网 https://nmedialink.com/posts/st-model-tuning-30min-boost-success-95.html


粤公网安备 44011302004783号 













