通义实验室正式发布Qwen3-Embedding系列模型, Qwen模型家族的新成员。该系列模型专为文本表征、检索与排序任务设计,基于Qwen3基础模型进行训练,充分继承了Qwen3在多语言文本理解能力方面的优势。
什么是 Qwen3 Embedding呢?
Qwen3 Embedding 是基于 Qwen3 基础模型训练的文本嵌入模型系列,能够将离散的、高维的符号(如文字、图片、声音等)转化为低维、连续的数字向量(Vector)的转化技术。通过捕捉不同数据点在嵌入空间中的距离远近,它能挖掘出它们之间隐藏的语义关系。
这样,模型就可以在不真正“理解”语言的前提下,通过数学运算模拟出对语言的理解能力 —— 让模型“算得更少,懂得更多”。
📌 举个例子 假设我们有三句话: “苹果手机真好用” “我有一部 iPhone” “今天天气不错” Qwen3 Embedding 会将这些句子转化为数字向量。其中,“苹果手机真好用”和“我有一部 iPhone”在语义上很接近,所以它们的向量也十分相似;而“今天天气不错”和它们表达的内容差别较大,因此在向量空间中距离更远。 通过这种方式,AI 就能自动判断内容的相关性,为搜索、推荐、聚类等任务提供有力支持。 |
技术亮点速览
在多项基准测试中,Qwen3-Embedding系列在文本表征和排序任务中展现了卓越的性能。
注:
- 我们使用MTEB(eng, v2), MTEB(cmn, v1), MTEB (Multilingual) 以及MTEB (Code)中的检索数据集进行测试, 分别记作MTEB-R, CMTEB-R, MMTEB-R, MTEB-Code.
- 排序结果基于Qwen3-Embedding-0.6B的top-100向量召回结果进行排序.
主要展现:
卓越的泛化性: Qwen3-Embedding系列在多个下游任务评估中达到行业领先水平。其中,8B参数规模的Embedding模型在MTEB多语言Leaderboard榜单中位列第一(截至2025年6月6日,得分70.58),性能超越众多商业API服务。此外,该系列的排序模型在各类文本检索场景中表现出色,显著提升了搜索结果的相关性。
灵活的模型架构: Qwen3-Embedding系列提供从0.6B到8B参数规模的3种模型配置,以满足不同场景下的性能与效率需求。开发者可以灵活组合表征与排序模块,实现功能扩展。
此外,模型支持以下定制化特性:
1) 表征维度自定义:允许用户根据实际需求调整表征维度,有效降低应用成本;
2) 指令适配优化:支持用户自定义指令模板,以提升特定任务、语言或场景下的性能表现。
全面的多语言支持: Qwen3-Embedding系列支持超过100种语言,涵盖主流自然语言及多种编程语言。该系列模型具备强大的多语言、跨语言及代码检索能力,能够有效应对多语言场景下的数据处理需求。
目前,该系列模型已在Hugging Face、ModelScope和GitHub平台开源,同时也可以直接使用阿里云百炼平台提供的最新的文本向量模型服务进行体验和使用。
阿里云百炼:
技术报告:
模型架构
基于Qwen3基础模型,我们的Embedding模型和Reranker模型分别采用了双塔结构和单塔结构的设计。通过LoRA微调,我们最大限度地保留并继承了基础模型的文本理解能力。
具体实现如下:
1) Embedding模型接收单段文本作为输入,取模型最后一层「EOS」标记对应的隐藏状态向量,作为输入文本的语义表示;
2) Reranker模型则接收文本对(例如用户查询与候选文档)作为输入,利用单塔结构计算并输出两个文本的相关性得分。
模型训练
Qwen3-Embedding系列模型的训练继承了GTE-Qwen系列的多阶段训练范式,但针对具体应用场景进行了深度优化。
在Embedding模型的训练过程中,我们采用三阶段训练架构:第一阶段通过超大规模弱监督数据进行对比学习预训练;第二阶段基于高质量标注数据进行监督训练;最终通过模型融合策略融合多个候选模型,以提升整体性能。这种分阶段训练机制有效平衡了模型的泛化能力与任务适配性。
在Reranker模型的训练中,基于实验验证结果,我们直接采用高质量标注数据进行监督训练,以提升训练效率。特别需要说明的是,在Embedding模型的第一阶段弱监督训练中,我们构建了多任务适配的Prompt体系,利用Qwen3基础模型的文本生成能力,我们针对不同任务类型和语言特性,动态生成了一系列弱监督文本对,突破了传统方法依赖社区论坛或开源数据筛选获取弱监督文本对的局限性,实现了大规模弱监督数据的高效生成。
Qwen3 Embedding方式
在使用 Qwen3 Embedding-8B 之前,请确保你的 Transformers 库版本 ≥4.51.0 ,否则可能会遇到以下错误:
KeyError: 'qwen3'
正确调用方式如下:
# Requires transformers>=4.51.0 import torch import torch.nn.functional as F from torch import Tensor from modelscope import AutoTokenizer, AutoModel def last_token_pool(last_hidden_states: Tensor, attention_mask: Tensor) -> Tensor: left_padding = (attention_mask[:, -1].sum() == attention_mask.shape[0]) if left_padding: return last_hidden_states[:, -1] else: sequence_lengths = attention_mask.sum(dim=1) - 1 batch_size = last_hidden_states.shape[0] return last_hidden_states[torch.arange(batch_size, device=last_hidden_states.device), sequence_lengths] def get_detailed_instruct(task_description: str, query: str) -> str: return f'Instruct: {task_description}\nQuery:{query}' def tokenize(tokenizer, input_texts, eod_id, max_length): batch_dict = tokenizer(input_texts, padding=False, truncation=True, max_length=max_length-2) for seq, att in zip(batch_dict["input_ids"], batch_dict["attention_mask"]): seq.append(eod_id) att.append(1) batch_dict = tokenizer.pad(batch_dict, padding=True, return_tensors="pt") return batch_dict # Each query must come with a one-sentence instruction that describes the task task = 'Given a web search query, retrieve relevant passages that answer the query' queries = [ get_detailed_instruct(task, 'What is the capital of China?'), get_detailed_instruct(task, 'Explain gravity') ] # No need to add instruction for retrieval documents documents = [ "The capital of China is Beijing.", "Gravity is a force that attracts two bodies towards each other. It gives weight to physical objects and is responsible for the movement of planets around the sun." ] input_texts = queries + documents tokenizer = AutoTokenizer.from_pretrained('Qwen/Qwen3-Embedding-8B', padding_side='left') model = AutoModel.from_pretrained('Qwen/Qwen3-Embedding-8B') # We recommend enabling flash_attention_2 for better acceleration and memory saving. # model = AutoModel.from_pretrained('Qwen/Qwen3-Embedding-8B', attn_implementation="flash_attention_2", torch_dtype=torch.float16).cuda() eod_id = tokenizer.convert_tokens_to_ids("<|endoftext|>") max_length = 8192 # Tokenize the input texts batch_dict = tokenize(tokenizer, input_texts, eod_id, max_length) batch_dict.to(model.device) outputs = model(**batch_dict) embeddings = last_token_pool(outputs.last_hidden_state, batch_dict['attention_mask']) # normalize embeddings embeddings = F.normalize(embeddings, p=2, dim=1) scores = (embeddings[:2] @ embeddings[2:].T) print(scores.tolist())
未来发展
Qwen3-Embedding系列模型是一个新的起点,依托于Qwen基础模型的持续优化, 我们将继续提升文本表征与排序模型的训练效率,以增强模型在实际场景中的部署性能。
此外,我们还计划拓展多模态表征体系,构建跨模态语义理解能力。我们期待更多开发者基于Qwen3-Embedding系列探索更广泛的应用场景,推动模型在不同业务场景中的深入应用。
如果需要进一步了解阿里云百炼的,可直接点击下面链接:
👉阿里云百炼详情了解可点击此官网链接:阿里云百炼官网介绍
👉阿里云百炼控制台页面可点击此链接直接进入:阿里云百炼控制台
⛳如果还想要了解更多通义大模型的模型详细信息以及直接进入体验,可以点击🔗https://www.aliyun.com/product/tongyi直接进入查看和体验哦~~
也可以关注一下通义大模型的公众号,后续有新的产品动态都会在内发布。