news 2026/6/10 20:43:55

Qwen3-VL-Embedding 的向量取值有何不同

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Qwen3-VL-Embedding 的向量取值有何不同

为什么这个话题重要?

理解不同 Embedding 模型的向量提取机制,对于以下场景至关重要:

  • 构建高性能的语义搜索系统
  • 设计多模态 RAG(检索增强生成)应用
  • 选择合适的 Embedding 模型以优化特定任务
  • 正确处理模型输出以获得最佳检索效果

通过本文的分析,你将清楚地了解到:Qwen3-VL-Embedding 的向量提取方式是其 Decoder-only 架构的必然选择,而非一个可以随意替换的设计决策。这种理解将帮助你在实际应用中做出更明智的技术选型和实现决策。

常规 Embedding 模型的向量提取有两种主流策略:

  • CLS token (第一个向量): 简单快速,适合大多数场景
  • Mean Pooling (平均池化): 对长文本/多模态内容更稳定

但是,当我最近深入研究 Qwen3-VL-Embedding 的官方实现代码时,发现了一个令人意外的事实:它既不使用 CLS Token,也不使用 Mean Pooling

这个发现促使我重新审视了不同 Embedding 模型在向量提取策略上的根本差异。事实证明,Qwen3-VL-Embedding 采用的是一种完全不同的方法——Last Token Pooling(最后有效 token 池化),这种选择并非偶然,而是由其底层架构特性所决定的。

简介

本文将通过对比分析,深入探讨常规 Embedding 模型(如 BERT、Sentence-BERT)与 Qwen3-VL-Embedding 在向量提取机制上的本质区别。我们将从以下几个维度展开讨论:

核心议题:

  1. 架构差异:Encoder-only vs Decoder-only 架构如何影响向量提取策略
  2. 注意力机制:双向注意力与因果注意力的根本区别
  3. Pooling 策略:为什么 Qwen3-VL 选择 Last Token 而非传统的 CLS Token
  4. 代码实现:通过官方源码解析具体的向量提取过程
  5. 应用场景:不同策略在实际任务中的适用性分析

架构对比流程图

图表 1:常规 Embedding 模型 (BERT-like 架构)

图表 2:Qwen3-VL-Embedding 模型 (Decoder-only 架构)

核心区别对比表

维度常规 Embedding 模型
(BERT/Sentence-BERT)
Qwen3-VL-Embedding
架构类型Encoder-only (双向)Decoder-only (单向)
注意力机制Bi-directional Attention
每个token看到全局
Causal Attention
只看左侧context
特殊token[CLS]在开头无专用CLS token
默认PoolingCLS Token(position 0)Last Token(最后有效位置)
支持模态纯文本 (部分支持图像)文本 + 图像 + 视频
向量维度通常 384/768/1024根据模型配置

详细机制解析

1. 常规 Embedding 模型:CLS Token Pooling

代码示例:

# BERT-style embedding def get_bert_embedding(text, model, tokenizer): # 添加 [CLS] 和 [SEP] inputs = tokenizer(text, return_tensors='pt') # input_ids: [CLS, token1, token2, ..., SEP] outputs = model(**inputs) # 提取 [CLS] token (position 0) cls_embedding = outputs.last_hidden_state[:, 0, :] # 第一个位置 # 归一化 embedding = F.normalize(cls_embedding, p=2, dim=-1) return embedding

为什么用 CLS Token?

  • BERT 预训练时专门优化[CLS]用于句子级任务
  • 双向注意力让[CLS]能"看到"整个句子
  • 简单高效,一个位置就能代表全局语义

2. Qwen3-VL-Embedding:Last Token Pooling

官方代码实现:

@staticmethod def _pooling_last(hidden_state: torch.Tensor, attention_mask: torch.Tensor) -> torch.Tensor: """ 从 hidden_state 中提取每个样本最后一个有效 token 的向量 Args: hidden_state: [batch_size, seq_len, hidden_dim] attention_mask: [batch_size, seq_len] # 1=有效token, 0=padding Returns: [batch_size, hidden_dim] # 每个样本的 embedding """ # 步骤1: 翻转 attention_mask (从右往左看) flipped_tensor = attention_mask.flip(dims=[1]) # 例: [1,1,1,1,0,0] → [0,0,1,1,1,1] # 步骤2: 找到第一个1的位置 (翻转后) last_one_positions = flipped_tensor.argmax(dim=1) # 例: [0,0,1,1,1,1] → argmax=2 (从右数第3个是最后一个1) # 步骤3: 转换回原始索引 col = attention_mask.shape[1] - last_one_positions - 1 # 例: 6 - 2 - 1 = 3 (实际最后一个有效token在位置3) # 步骤4: 提取对应位置的 hidden state row = torch.arange(hidden_state.shape[0], device=hidden_state.device) return hidden_state[row, col] # 关键:最后一个有效token

为什么用 Last Token?

  • 因果语言模型的特性:最后一个token "看到" 了所有历史信息
  • 与 GPT-style 预训练对齐(预测下一个token)
  • 自然处理变长输入(通过 attention_mask 自动定位)

可视化:注意力流向对比

实际使用示例对比

场景1:纯文本检索
常规模型(Sentence-BERT)
from sentence_transformers import SentenceTransformer model = SentenceTransformer('all-MiniLM-L6-v2') # 编码文本 text = "What is machine learning?" embedding = model.encode(text) # 自动使用 CLS token print(embedding.shape) # (384,)
Qwen3-VL-Embedding
from qwen3_vl_embedder import Qwen3VLEmbedder embedder = Qwen3VLEmbedder('Qwen/Qwen3-VL-Embedding') # 编码文本 inputs = [{'text': "What is machine learning?"}] embedding = embedder.process(inputs) # 自动使用 Last Token print(embedding.shape) # (1, hidden_dim)
场景2:多模态检索
常规模型
# 大多数 BERT-style 模型不支持多模态 # 需要使用 CLIP 等专门的多模态模型 from transformers import CLIPModel, CLIPProcessor model = CLIPModel.from_pretrained('openai/clip-vit-base-patch32') processor = CLIPProcessor.from_pretrained('openai/clip-vit-base-patch32') # 分别编码文本和图像 text_inputs = processor(text=["a photo of a cat"], return_tensors="pt") text_embedding = model.get_text_features(**text_inputs) image_inputs = processor(images=image, return_tensors="pt") image_embedding = model.get_image_features(**image_inputs)
Qwen3-VL-Embedding
# 原生支持文本+图像+视频混合输入 embedder = Qwen3VLEmbedder('Qwen/Qwen3-VL-Embedding') # 单次调用处理多模态 inputs = [{ 'text': "Describe this image", 'image': "/path/to/cat.jpg", 'instruction': "Generate a comprehensive embedding" }] embedding = embedder.process(inputs) # 融合所有模态信息

内部处理流程对比

性能特点对比

特性常规 EmbeddingQwen3-VL-Embedding
处理速度快速中等(多模态处理更复杂)
内存占用中高(需处理视觉数据)
适用场景纯文本检索/分类多模态检索/RAG/跨模态搜索
上下文长度通常 512 tokens默认 8192 tokens
灵活性单一模态文本+图像+视频混合

总结:关键差异

1. Pooling 位置不同
# 常规模型 embedding = hidden_state[:, 0, :] # 第一个位置 (CLS) # Qwen3-VL embedding = hidden_state[row, last_valid_col] # 最后有效位置
2. 注意力机制不同

3. 设计理念不同
方面常规模型Qwen3-VL
目标句子级表示学习多模态理解 + 生成
预训练Masked LMCausal LM
架构选择专门为编码设计适配生成式模型

实际应用建议

何时使用常规 Embedding?
  • 纯文本检索/相似度匹配
  • 需要极致速度
  • 简单的语义搜索任务
  • 资源受限环境
何时使用 Qwen3-VL-Embedding?
  • 多模态检索(文本+图片+视频)
  • 需要理解图像内容
  • 跨模态搜索(用文本搜图片)
  • 复杂的 RAG 系统
  • 长文本场景(8K+ tokens)

代码实现:完整对比

# ============ 常规 Embedding 模型 ============ from sentence_transformers import SentenceTransformer import numpy as np class RegularEmbedder: def __init__(self, model_name='all-MiniLM-L6-v2'): self.model = SentenceTransformer(model_name) def encode(self, texts): # 内部使用 CLS token pooling return self.model.encode(texts, normalize_embeddings=True) # ============ Qwen3-VL-Embedding ============ from qwen3_vl_embedder import Qwen3VLEmbedder class MultimodalEmbedder: def __init__(self, model_path): self.embedder = Qwen3VLEmbedder(model_path) def encode(self, inputs): # 内部使用 Last Token pooling return self.embedder.process(inputs, normalize=True) # ============ 使用对比 ============ # 纯文本 text_embedder = RegularEmbedder() text_emb = text_embedder.encode(["Hello world"]) # 多模态 mm_embedder = MultimodalEmbedder('Qwen/Qwen3-VL-Embedding') mm_emb = mm_embedder.encode([{ 'text': "Hello world", 'image': "cat.jpg" # 常规模型做不到 }])

关键记忆点

  • BERT-style:头部取值(CLS token 在开头汇总全局)
  • GPT-style:尾部取值(Last token 累积所有历史)

这是我最经在使用的模型分析,如果你也感兴趣的话可以看一下官方提供的脚本希望我的分享对你有帮助

学习资源推荐

如果你想更深入地学习大模型,以下是一些非常有价值的学习资源,这些资源将帮助你从不同角度学习大模型,提升你的实践能力。

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!​

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示

​因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取

四、AI大模型商业化落地方案

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:59:26

python基于微信小程序的中国古诗词在线智能学习分享系统的设计与实现

文章目录设计与实现概述核心功能模块技术亮点应用价值系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!设计与实现概述 该系统基于Python后端与微信小程序前端,构建了一个集古诗词学习、…

作者头像 李华
网站建设 2026/6/9 23:56:56

python基于微信小程序的智慧社区小区活动物业管理系统的设计与实现

文章目录基于微信小程序的智慧社区系统设计与实现系统背景与目标技术架构核心功能模块创新点与优势应用效果系统设计与实现的思路主要技术与实现手段源码lw获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!基于微信小程序的智慧社区系统设计与实现…

作者头像 李华
网站建设 2026/6/10 10:55:27

支持单列、多列等布局自定义表单系统源码 带完整的搭建部署教程

温馨提示:文末有资源获取方式在数字化浪潮中,一款强大的表单工具是连接企业与用户的关键桥梁。本文将为您深入解析一款功能全面的自定义表单系统源码,它如何帮助企业轻松构建专业的数据收集与业务处理平台,实现服务流程的自动化与…

作者头像 李华
网站建设 2026/6/10 10:59:38

鲸鱼优化算法(WOA)文章复现:《改进鲸鱼优化算法在机械臂时间最优轨迹规划的应用_赵晶》 策略为

鲸鱼优化算法(WOA)文章复现:《改进鲸鱼优化算法在机械臂时间最优轨迹规划的应用_赵晶》 策略为:Tent混沌初始化种群非线性权重改进位置更新非线性概率转换——IWOA。 复现内容包括:改进算法实现、23个基准测试函数、文中相关因子分析、文中相关图分析、与…

作者头像 李华
网站建设 2026/6/10 10:56:55

【计算机毕业设计案例】支持个性化阅读推荐、进度跟踪、能力测评与家校互动基于ssm的阅读能力智能测评与提升系统中小学生阅读能力培养系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华