为什么这个话题重要?
理解不同 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 在向量提取机制上的本质区别。我们将从以下几个维度展开讨论:
核心议题:
- 架构差异:Encoder-only vs Decoder-only 架构如何影响向量提取策略
- 注意力机制:双向注意力与因果注意力的根本区别
- Pooling 策略:为什么 Qwen3-VL 选择 Last Token 而非传统的 CLS Token
- 代码实现:通过官方源码解析具体的向量提取过程
- 应用场景:不同策略在实际任务中的适用性分析
架构对比流程图
图表 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 |
| 默认Pooling | CLS 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) # 融合所有模态信息内部处理流程对比
性能特点对比
| 特性 | 常规 Embedding | Qwen3-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 LM | Causal 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大模型商业化落地方案
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。