EmbeddingGemma 2 评测:740M 参数统一多模态向量空间,文本、图像、视频、音频一次搞定

EmbeddingGemma 2 评测:740M 参数统一多模态向量空间,文本、图像、视频、音频一次搞定

你有一个知识库:PDF 文档、产品截图、用户评论音频、演示视频。传统方案里,每种模态各调一个嵌入 API,向量维度不同、语义空间不互通,跨模态检索要么拼凑要么放弃。

EmbeddingGemma 2 是 Google DeepMind 2026 年 9 月 14 日在 Hugging Face 发布的开源多模态嵌入模型,把文本(含代码)、图像、视频、音频四种模态统一映射到同一个 768 维向量空间,Apache 2.0 协议,消费级笔记本即可本地运行。发布不到一个月已收获 2800+ 星标、18 万+ 下载,是当前 Hugging Face 上最热门的嵌入模型之一。

工具简介

EmbeddingGemma 2 是 Google DeepMind 基于 Gemma 4 架构训练的开源多模态嵌入模型,核心能力是跨模态语义向量生成,不是生成式模型(不能聊天、不能生图),而是把输入变成向量供检索、分类、聚类使用。

核心功能

1. 四模态统一向量空间

文本、图像、视频、音频全部映射到同一个 768 维空间,可以直接做跨模态相似度检索。比如「用一张产品截图搜相关代码片段」或「用一段客服录音找匹配的知识库文章」,不需要分别训练、不需要拼接,向量天然互通。

2. Matryoshka 表示学习(MRL)

原生支持 128d / 256d / 512d / 768d 四种截断维度,存储成本最高可降 6 倍。质量损失在 256d 以下几乎无损,128d 适合纯文本场景。实际部署时根据向量数据库容量和检索精度需求选择维度即可,不用换模型。

3. 任务导向提示词(Task-steered Prefixes)

不同任务用不同的 instruction prefix 来引导向量生成:搜索用 task: search result | query: ...,分类用 task: classification | query: ...,代码检索用 task: code retrieval | query: ...。同一个模型,换个 prefix 就变成不同任务的优化向量,比单独训练任务专用模型灵活得多。

4. 选择性编码器加载

视觉和音频编码器是独立模块。如果只做文本嵌入,可以完全跳过视觉(170M)和音频(300M)编码器,实际只加载 270M 参数,内存占用大幅下降。做多模态 RAG 时按需加载,不浪费。

5. 代码嵌入大幅提升

相比第一代 EmbeddingGemma,代码检索任务(MTEB Code NDCG@10)从 68.76 提升到 78.68,提升约 14%。对做代码搜索、API 文档检索的团队来说这是实质性改善。

基准测试结果

模态基准EmbeddingGemma 2备注
文本(多语言)MTEB v2 Mean(Task)61.36与一代持平,多语言覆盖更广
代码MTEB Code NDCG@1078.68一代 68.76,提升 14%
图像MIEB lite Mean64.64一代未测
视频MMEB v2 Video Hit@150.67一代未测
音频MSEB Retrieval MRR@1069.54一代未测
全模态综合MMEB v2 Overall59.01—

MRL 截断后质量衰减:256d 时 MTEB 从 61.36 降至 60.41(仅 -0.95),512d 几乎无损,128d 文本尚可但多模态明显退化。

适用人群

  • 本地 RAG / 私有知识库团队:不想把数据发到云端,740M 参数笔记本即可跑,Apache 2.0 无商用限制
  • 多模态搜索产品:文本+图像+音频混合检索,一个模型搞定,省去维护多套嵌入管道的成本
  • 代码搜索 / API 文档检索:代码任务大幅提升 14%,配合任务 prefix 效果更佳
  • 向量数据库容量有限:MRL 截断到 256d 可节省 3 倍存储,适合大规模语料
  • 嵌入式 / 边缘设备:270M 纯文本版本可跑在手机上,适合端侧语义搜索
  • 多语言内容平台:100+ 语言支持,对中文、日文、韩文等非英语内容有原生覆盖

与同类工具对比

维度EmbeddingGemma 2OpenAI text-embedding-3-smallBGE-M3MRL-embeddings (Gist)
多模态✅ 文本+图像+视频+音频❌ 纯文本✅ 文本+图像✅ 文本+图像
参数规模740M(可选 270M)不公开568M不公开
本地运行✅ CPU 可跑❌ 需 API✅✅
向量维度768(可截断 128/256/512)1536(可截断)1024(可截断)1024(可截断)
上下文8K8K8K32K
协议Apache 2.0商用 APIMIT商用
多语言100+100+100+英语为主
任务 prefix✅ 内置 7 种❌❌❌
代码专项✅ 优化❌一般❌

结论:EmbeddingGemma 2 是目前唯一同时支持四模态 + 本地运行 + Apache 2.0 + 任务 prefix 的嵌入模型。如果只需要纯文本嵌入且已有 OpenAI API 额度,text-embedding-3-small 开箱即用更省事;但涉及多模态、本地部署、代码检索三个方向中任意两个,EmbeddingGemma 2 几乎没有直接竞品。

如何使用

安装

pip install -U sentence-transformers transformers

生成文本嵌入(带任务 prefix)

from sentence_transformers import SentenceTransformer
import torch

# 自动选择精度:GPU 用 bfloat16,CPU 用 float32
dtype = torch.bfloat16 if torch.cuda.is_bf16_supported() else torch.float32
model = SentenceTransformer("google/embeddinggemma-2", model_kwargs={"torch_dtype": dtype})

# 搜索场景:query 和 document 用不同 prefix
query_emb = model.encode(
    "task: search result | query: 如何使用 MRL 截断向量",
    prompt_name="SearchQuery",
    truncate_dim=256,   # 截断到 256 维,节省 3 倍存储
    normalize_embeddings=True,  # 必须重新归一化!
)

doc_emb = model.encode(
    "title: MRL 使用指南 | text: Matryoshka 表示学习支持将 768d 向量截断为 128/256/512d,截断后需 L2 归一化...",
    prompt_name="Document",
    truncate_dim=256,
    normalize_embeddings=True,
)

similarity = model.similarity(query_emb, doc_emb)
print(f"相似度: {similarity:.4f}")

只做文本嵌入(跳过视觉/音频编码器,省内存)

model = SentenceTransformer(
    "google/embeddinggemma-2",
    config_kwargs={"vision_config": None, "audio_config": None},  # 只加载 270M
    model_kwargs={"torch_dtype": dtype},
)

跨模态检索(图像 + 文本)

from PIL import Image
import numpy as np

# 图像嵌入(不需要 prefix)
img = Image.open("product_photo.png")
img_emb = model.encode(img, truncate_dim=768, normalize_embeddings=True)

# 文本嵌入(搜索 prefix)
text_emb = model.encode(
    "task: search result | query: 红色跑鞋产品图",
    prompt_name="SearchQuery",
    truncate_dim=768,
    normalize_embeddings=True,
)

# 直接计算余弦相似度
cos_sim = float(np.dot(img_emb, text_emb))
print(f"跨模态相似度: {cos_sim:.4f}")

接入向量数据库

以 Qdrant 为例,注意查询和文档必须使用相同维度:

from qdrant_client import QdrantClient

client = QdrantClient("localhost", port=6333)
client.create_collection("kb", vector_config="256", distance="Cosine")

# 批量写入
embeddings = model.encode(docs, truncate_dim=256, normalize_embeddings=True)
client.upsert("kb", points=[
    {"id": i, "vector": embeddings[i].tolist(), "payload": {"text": docs[i]}}
    for i in range(len(docs))
])

# 检索
query_vec = model.encode(q, prompt_name="SearchQuery", truncate_dim=256, normalize_embeddings=True)
results = client.search("kb", query_vector=query_vec.tolist(), limit=10)

注意事项

  1. 截断后必须 L2 归一化:不归一化的截断向量会产生「看起来正常但排序错误」的静默退化
  2. 不要用 float16:模型激活值超出 float16 动态范围,会静默返回 NaN,用 bfloat16 或 float32
  3. query 和 document 维度必须一致:768d 查询不能匹配 128d 语料库
  4. 带标题的文档:格式为 title: {标题} | text: {内容},无标题用 title: none

总结

推荐指数:★★★★☆(4.5/5)

EmbeddingGemma 2 是目前本地部署场景下多模态嵌入的事实标准:Apache 2.0 无商用门槛,740M 参数消费级硬件可跑,四模态统一向量空间省去维护多套管道的成本,MRL 截断让向量数据库容量压力小 3-6 倍,任务 prefix 机制让同一个模型覆盖搜索、分类、聚类、代码检索等多种场景。

主要不足:上下文 8K 偏短(BGE-M3 有 8K 但 Gist 系列有 32K);视频和音频基准分数(50-69)相比文本(61-78)还有明显差距,视频检索场景建议先做小流量验证再全量上线;任务 prefix 需要手动拼接,不如 API 服务那么「无感」。

如果你正在做本地 RAG、多模态搜索、代码检索中任意两个方向,建议优先考虑 EmbeddingGemma 2。如果只需要纯文本 + 有云端 API 预算,OpenAI text-embedding-3-small 依然更省事。

适合谁:本地部署多模态 RAG、代码搜索引擎、跨模态推荐系统的团队和个人开发者。

不适合谁:需要超长上下文(>8K)的文档嵌入、纯音频精确定位场景、没有本地算力且不想折腾部署的团队。