果洛藏族自治州网站建设_网站建设公司_HTTPS_seo优化
2026/1/17 2:45:35 网站建设 项目流程

Qwen3-Embedding-0.6B实战:蚂蚁金融数据集语义相似性判断

1. 任务背景与技术选型

语义相似性判断是自然语言理解(NLU)中的核心任务之一,其目标是评估两个文本片段在语义层面的等价程度。该能力广泛应用于智能客服、搜索引擎、问答系统和金融风控等领域。例如,在蚂蚁金服的实际业务中,用户可能以不同表达方式询问借呗还款方式或花呗账单问题,系统需准确识别这些提问是否指向同一意图,从而提供一致的服务响应。

传统方法依赖于词重叠统计或浅层模型,难以捕捉深层语义关联。近年来,基于预训练语言模型的文本嵌入技术成为主流解决方案。本文采用通义千问最新发布的Qwen3-Embedding-0.6B模型,结合LoRA微调策略,在蚂蚁金融语义相似度数据集上进行实践验证,探索其在中文金融场景下的语义匹配性能。

相较于通用语言模型,Qwen3-Embedding系列专为嵌入与排序任务设计,具备以下优势:

  • 多语言支持超过100种语言,涵盖多种编程语言
  • 长文本理解能力强,适用于复杂语义建模
  • 提供从0.6B到8B的全尺寸模型,兼顾效率与效果
  • 支持指令定制化,可适配特定领域语义需求

本实验聚焦于轻量级版本 Qwen3-Embedding-0.6B,旨在验证小参数模型在垂直领域微调后的实用性。

2. 模型准备与环境配置

2.1 模型获取与加载

Qwen3-Embedding-0.6B 可通过 Hugging Face 或 ModelScope 平台下载:

# 使用ModelScope CLI modelscope download --model Qwen/Qwen3-Embedding-0.6B

本地部署后可通过transformers库直接加载:

from transformers import AutoTokenizer, AutoModel model_name = "Qwen/Qwen3-Embedding-0.6B" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name)

2.2 推理服务启动(SGlang)

若需构建API服务,可使用 SGlang 快速部署嵌入模型:

sglang serve --model-path /path/to/Qwen3-Embedding-0.6B --host 0.0.0.0 --port 30000 --is-embedding

服务启动成功后,可通过 OpenAI 兼容接口调用:

import openai client = openai.Client( base_url="http://localhost:30000/v1", api_key="EMPTY" ) response = client.embeddings.create( model="Qwen3-Embedding-0.6B", input="如何查询我的花呗账单?" ) print(response.data[0].embedding[:5]) # 输出前5维向量

此方式适合大规模批量生成句向量,用于检索或聚类任务。

3. 数据处理与分析

3.1 数据集介绍

实验采用蚂蚁金融语义相似度数据集(AFQMC),由 ModelScope 提供,包含三部分:

分割样本数
训练集34,334
验证集4,316
测试集3,861

每条样本格式如下:

sentence1,sentence2,label,id 蚂蚁借呗等额还款可以换成先息后本吗,借呗有先息到期还本吗,0,0 我的花呗账单是***,还款怎么是***元,月结通知让我还***元但计算不符,1,4

其中label=1表示两句话语义相似,label=0表示不相关。

3.2 Token长度分布分析

为合理设置输入最大长度,需统计训练集中样本的Token数量分布:

from transformers import AutoTokenizer import pandas as pd import matplotlib.pyplot as plt def get_token_distribution(data_path, tokenizer, interval=20): df = pd.read_csv(data_path) token_lengths = [] for _, row in df.iterrows(): encoded = tokenizer( row["sentence1"], row["sentence2"], truncation=True, max_length=512 ) token_lengths.append(len(encoded["input_ids"])) # 统计区间分布 max_len = max(token_lengths) bins = list(range(0, max_len + interval, interval)) labels = [f"{i}-{i+interval}" for i in bins[:-1]] hist = pd.cut(token_lengths, bins=bins, labels=labels, right=False).value_counts().sort_index() return hist # 执行分析 tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-Embedding-0.6B") hist = get_token_distribution("dataset/train.csv", tokenizer) # 可视化 hist.plot(kind='bar', figsize=(10, 6), title="训练集Token长度分布") plt.ylabel("频次") plt.xticks(rotation=45) plt.tight_layout() plt.show()

结果显示,绝大多数样本的Token长度集中在20–60区间内。因此,后续训练中将max_length设置为64,既能覆盖大部分样本,又不会造成过多填充开销。

4. LoRA微调方案设计

4.1 模型结构改造

由于 Qwen3-Embedding 原生未提供分类头,需在其基础上添加序列分类头,并通过参数高效微调技术 LoRA 进行适配。

使用 Hugging Face PEFT 框架实现 LoRA 注入:

from transformers import AutoModelForSequenceClassification from peft import LoraConfig, get_peft_model, TaskType model_name = "Qwen/Qwen3-Embedding-0.6B" num_labels = 2 # 加载基础模型并添加分类头 base_model = AutoModelForSequenceClassification.from_pretrained( model_name, num_labels=num_labels ) # 配置LoRA:仅对自注意力模块的QKV投影层注入适配器 peft_config = LoraConfig( task_type=TaskType.SEQ_CLS, target_modules=["q_proj", "k_proj", "v_proj"], inference_mode=False, r=8, # 低秩矩阵维度 lora_alpha=32, # 缩放系数 lora_dropout=0.1 # Dropout防止过拟合 ) # 应用LoRA model = get_peft_model(base_model, peft_config) model.print_trainable_parameters()

输出结果表明,可训练参数量仅为1,605,632,占总参数的0.27%,极大降低了显存消耗与训练成本。

4.2 自定义数据集类

构建 PyTorch Dataset 类以支持双句输入:

from torch.utils.data import Dataset import torch import pandas as pd class AFQMCDataset(Dataset): def __init__(self, tokenizer, data_file, max_length=64): self.tokenizer = tokenizer self.max_length = max_length self.data = pd.read_csv(data_file) def __len__(self): return len(self.data) def __getitem__(self, idx): row = self.data.iloc[idx] encoding = self.tokenizer( row['sentence1'], row['sentence2'], truncation=True, padding='max_length', max_length=self.max_length, return_tensors='pt' ) return { 'input_ids': encoding['input_ids'].flatten(), 'attention_mask': encoding['attention_mask'].flatten(), 'labels': torch.tensor(row['label'], dtype=torch.long) }

该类自动完成文本编码、截断与填充操作,确保输入张量标准化。

5. 模型训练与优化

5.1 训练流程实现

完整训练脚本包括数据加载、优化器配置、训练循环与验证逻辑:

import torch from torch.utils.data import DataLoader from transformers import AdamW, get_linear_schedule_with_warmup from sklearn.metrics import accuracy_score, f1_score from tqdm import tqdm def train_epoch(model, dataloader, optimizer, scheduler, device): model.train() total_loss = 0.0 for batch in tqdm(dataloader, desc="Training"): optimizer.zero_grad() input_ids = batch['input_ids'].to(device) attention_mask = batch['attention_mask'].to(device) labels = batch['labels'].to(device) outputs = model( input_ids=input_ids, attention_mask=attention_mask, labels=labels ) loss = outputs.loss loss.backward() optimizer.step() scheduler.step() total_loss += loss.item() return total_loss / len(dataloader) def eval_model(model, dataloader, device): model.eval() preds, true_labels = [], [] total_loss = 0.0 with torch.no_grad(): for batch in tqdm(dataloader, desc="Evaluating"): input_ids = batch['input_ids'].to(device) attention_mask = batch['attention_mask'].to(device) labels = batch['labels'].to(device) outputs = model( input_ids=input_ids, attention_mask=attention_mask, labels=labels ) loss = outputs.loss logits = outputs.logits total_loss += loss.item() preds.extend(torch.argmax(logits, dim=-1).cpu().numpy()) true_labels.extend(labels.cpu().numpy()) acc = accuracy_score(true_labels, preds) f1 = f1_score(true_labels, preds, average='macro') return total_loss / len(dataloader), acc, f1

5.2 训练参数设置

device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device) train_dataset = AFQMCDataset(tokenizer, "dataset/train.csv", max_length=64) val_dataset = AFQMCDataset(tokenizer, "dataset/dev.csv", max_length=64) train_loader = DataLoader(train_dataset, batch_size=128, shuffle=True) val_loader = DataLoader(val_dataset, batch_size=128, shuffle=False) optimizer = AdamW(model.parameters(), lr=1e-4) scheduler = get_linear_schedule_with_warmup( optimizer, num_warmup_steps=0, num_training_steps=len(train_loader) * 15 ) best_f1 = 0.0 for epoch in range(15): train_loss = train_epoch(model, train_loader, optimizer, scheduler, device) val_loss, val_acc, val_f1 = eval_model(model, val_loader, device) print(f"Epoch {epoch+1}: Train Loss={train_loss:.4f}, " f"Val Loss={val_loss:.4f}, Acc={val_acc:.4f}, F1={val_f1:.4f}") if val_f1 > best_f1: best_f1 = val_f1 model.save_pretrained("output/best")

5.3 训练资源消耗

在 A100 GPU 上,batch_size=128时显存占用约为30.6GB。若资源受限,建议采取以下措施:

  • 降低batch_size至 64 或 32
  • 启用梯度累积(gradient_accumulation_steps=2~4
  • 使用混合精度训练(fp16=True

最终在验证集上达到最佳性能:准确率 83.17%,F1 得分 83.16%

对比说明:相比此前使用的chinese-roberta-wwm-ext模型(准确率 85.15%,F1 85.15%),当前结果略低。这可能源于 Qwen3-Embedding 更侧重通用嵌入而非分类任务,未来可通过更精细的提示工程或全参数微调进一步提升。

6. 模型推理与测试

6.1 测试脚本实现

加载最优模型并进行预测:

from transformers import AutoTokenizer, AutoModelForSequenceClassification import torch import pandas as pd def predict_similarity(model_path, test_file): tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-Embedding-0.6B") model = AutoModelForSequenceClassification.from_pretrained(model_path) model.to("cuda" if torch.cuda.is_available() else "cpu") model.eval() label_map = {0: "语义不相关", 1: "语义相似"} df = pd.read_csv(test_file) results = [] for _, row in df.iterrows(): inputs = tokenizer( row["sentence1"], row["sentence2"], return_tensors="pt", truncation=True, max_length=64 ).to(model.device) with torch.no_grad(): outputs = model(**inputs) pred = torch.argmax(outputs.logits, dim=-1).item() results.append({ "sentence1": row["sentence1"], "sentence2": row["sentence2"], "prediction": label_map[pred], "label_id": pred }) return pd.DataFrame(results) # 执行预测 results_df = predict_similarity("output/best", "dataset/test.csv") print(results_df.head())

6.2 示例输出

句子1: 我的花呗账单是***,还款怎么是***元 句子2: 月结通知让我还***元但计算不符 >>> 语义相似 句子1: 蚂蚁借呗能提前还款吗 句子2: 借呗支持随时结清吗 >>> 语义相似 句子1: 花呗逾期会影响征信吗 句子2: 借呗没还会影响信用记录吗 >>> 语义相似

模型能够有效识别同义表达,具备较强的语义泛化能力。

7. 总结

本文系统实现了基于 Qwen3-Embedding-0.6B 的语义相似性判断全流程,涵盖数据处理、LoRA微调、模型训练与推理部署。主要成果如下:

  1. 成功构建了适用于金融领域的语义匹配模型,在蚂蚁AFQMC数据集上验证了其有效性;
  2. 采用LoRA高效微调策略,仅更新0.27%参数即实现良好性能,显著降低训练成本;
  3. 提供了完整的端到端实现代码,便于复现与二次开发;
  4. 揭示了专用嵌入模型在分类任务中的潜力与局限,为后续优化指明方向。

尽管当前性能略低于专用中文BERT模型,但 Qwen3-Embedding 系列具备更强的多语言、长文本与指令理解能力,未来可通过以下方式进一步提升表现:

  • 引入对比学习损失函数(如InfoNCE)
  • 使用更复杂的融合结构(如Siamese网络)
  • 结合重排序模型进行两阶段匹配

总体而言,Qwen3-Embedding-0.6B 是一个高性价比的语义嵌入基座模型,特别适合资源有限但需快速落地语义理解能力的场景。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询