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 架构训练的开源多模态嵌入模型,核心能力是跨模态语义向量生成,不是生成式模型(不能聊天、不能生图),而是把输入变成向量供检索、分类、聚类使用。
- Hugging Face: https://huggingface.co/google/embeddinggemma-2
- 文档: https://ai.google.dev/gemma/docs/embeddinggemma
- 发布方: Google DeepMind
- 参数: 740M(文本 270M + 视觉 170M + 音频 300M)
- 输出维度: 768d(支持 MRL 截断至 128/256/512d)
- 上下文: 8,192 tokens
- 支持语言: 100+
- 协议: Apache 2.0
- 运行环境: sentence-transformers / transformers,CPU 可跑,GPU 推荐 bfloat16
核心功能
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@10 | 78.68 | 一代 68.76,提升 14% |
| 图像 | MIEB lite Mean | 64.64 | 一代未测 |
| 视频 | MMEB v2 Video Hit@1 | 50.67 | 一代未测 |
| 音频 | MSEB Retrieval MRR@10 | 69.54 | 一代未测 |
| 全模态综合 | MMEB v2 Overall | 59.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 2 | OpenAI text-embedding-3-small | BGE-M3 | MRL-embeddings (Gist) |
|---|---|---|---|---|
| 多模态 | ✅ 文本+图像+视频+音频 | ❌ 纯文本 | ✅ 文本+图像 | ✅ 文本+图像 |
| 参数规模 | 740M(可选 270M) | 不公开 | 568M | 不公开 |
| 本地运行 | ✅ CPU 可跑 | ❌ 需 API | ✅ | ✅ |
| 向量维度 | 768(可截断 128/256/512) | 1536(可截断) | 1024(可截断) | 1024(可截断) |
| 上下文 | 8K | 8K | 8K | 32K |
| 协议 | Apache 2.0 | 商用 API | MIT | 商用 |
| 多语言 | 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)
注意事项
- 截断后必须 L2 归一化:不归一化的截断向量会产生「看起来正常但排序错误」的静默退化
- 不要用 float16:模型激活值超出 float16 动态范围,会静默返回 NaN,用 bfloat16 或 float32
- query 和 document 维度必须一致:768d 查询不能匹配 128d 语料库
- 带标题的文档:格式为
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)的文档嵌入、纯音频精确定位场景、没有本地算力且不想折腾部署的团队。