Google 发布 EmbeddingGemma 2:基于 Gemma 4 的开源多模态嵌入模型
EmbeddingGemma 2: The Developer Guide
Google 发布基于 Gemma 4 的开源嵌入模型 EmbeddingGemma 2,采用 Apache 2.0 许可,将文本、代码、图像、视频和音频映射到统一的 768 维向量空间,参数量从 270M(文本/代码)到 740M(全模态)按需加载。
原文给出了各模态参数配置、维度压缩的具体存储数字和选型建议,开发者可据此规划本地多模态检索方案。
2026年10月6日
现代搜索和检索增强生成(RAG)应用日益需要跨多种内容类型工作,从技术文档和源代码到图像、视频片段和音频录音。挑战在于找到既能提供强大检索准确性,又能在所有这些格式上保持低延迟,且无需庞大计算基础设施来运行和索引的模型。
EmbeddingGemma 2 旨在提供一个以 Apache 2.0 许可证发布的单一、紧凑的开放模型,为其规模提供卓越的多模态性能。基于 Gemma 4,这个低于 1B 的模型将文本、代码、图像、视频和音频映射到一个统一的 768 维空间。其模块化架构让你只加载所需内容,从用于文本和代码的 270M 参数扩展到用于所有模态的 740M 参数。
关键能力包括:
- 原生多模态检索: 直接在共享的 768 维向量空间中解锁跨文本、代码、图像、视频和音频的搜索。
- 卓越的代码理解: 在代码搜索和技术检索方面显著优于 EmbeddingGemma 1,使其成为本地代码库索引和智能体代码搜索的理想选择。
- 模块化内存占用: 在运行时选择性地仅加载你需要的编码器:270M(文本/代码)、440M(文本 + 视觉)、570M(文本 + 音频)或 740M(完整多模态),全部投影到同一个兼容的向量空间。
- 灵活的向量存储: Matryoshka 表示学习(MRL)支持从 768 维动态截断到 128 维,在保留大部分原始质量的同时削减向量数据库存储需求。例如,在 256 维时,文本和代码上原始嵌入的大部分完整质量得以保留,图像、视频和语音检索上约保留 95%
其底层工作原理
EmbeddingGemma 2 用投影到共享 768 维空间的模块化编码器取代了链式模型:
尽管每种模态由专门的编码器处理,但所有输入都通过共享主干处理,其生成的嵌入占据相同的维度空间:
- 文本和代码(270M 基础): 一个经过适配的 Gemma 4 解码器,具有 8,192 个 token 的上下文窗口。
- 视觉(+170M): 一个视觉编码器,处理图像、视觉文档(PDF、幻灯片、图表)和视频帧。
- 音频(+300M): 一个专用的语音和声音编码器,直接摄取原始音频。
- 模块化加载: 你只需加载所需内容。以 270M 参数运行纯文本,添加视觉为 440M 参数,或加载完整多模态模型为 740M 参数。
- 与 Gemma 4 共享分词器和音频编码器: 当在设备端 RAG 流水线中与 Gemma 4 配对时,两个模型共享相同的文本分词器和音频编码器架构,从而减少总内存占用。
实际效果展示
抱歉,你的浏览器不支持播放此视频
我们用 270M 纯文本设置嵌入了 Hugging Face transformers 代码库。然后,这些嵌入被用于通过使用智能体(Gemma 4 26B A4B 搭配 Pi 智能体框架)将查询与代码库的相似度进行匹配,从而高效地搜索这个大型代码库。
开发者指南:使用 EmbeddingGemma 2
你可以使用 sentence-transformers 库(v6.1.0 或更高版本)在文本、代码、图像、视频和音频上运行 EmbeddingGemma 2:
pip install -U sentence-transformers[image,audio,video] transformersShell
已复制
步骤 1:加载模型
完整模型可嵌入文本、代码、图像、视频和音频:
from sentence_transformers import SentenceTransformer
# Full model: all modalities (740M parameters)
MODEL_ID = "google/embeddinggemma-2"
model = SentenceTransformer(MODEL_ID)Python
已复制
为尽量减少内存占用,你可以在加载时将 `vision_config` 或 `audio_config` 设为 None(在 config_kwargs 中),从而省略未使用的模态编码器。被禁用的编码器永远不会加载到内存中,因此节省的内存既适用于权重,也适用于峰值分配:
# Text only (270M parameters)
text_only_model = SentenceTransformer(
MODEL_ID,
config_kwargs={"vision_config": None, "audio_config": None},
)
# Text, images, and video (440M parameters)
text_image_model = SentenceTransformer(
MODEL_ID,
config_kwargs={"audio_config": None},
)
# Text and audio (570M parameters)
text_audio_model = SentenceTransformer(
MODEL_ID,
config_kwargs={"vision_config": None},
)Python
已复制
步骤 2:使用任务提示嵌入文本和代码
EmbeddingGemma 2 在训练时使用了简短的任务指令,以引导表示面向特定任务。在 encode() 中设置 prompt_name,即可自动添加:
对于检索,请使用不同的提示分别编码查询和文档:
query = "What causes the northern lights?"
document = "The northern lights are caused by charged particles from the sun.." # truncated
# Embed using `prompt_name`
query_emb = model.encode(query, prompt_name="SearchQuery")
doc_emb = model.encode(document, prompt_name="Document")
print(model.similarity(query_emb, doc_emb))Python
已复制
步骤 3:嵌入图像、视频、音频和交错输入
将媒体作为以模态为键的字典传入,无需提示。要同时嵌入文本和媒体,请用 <|image|>、<|video|> 或 <|audio|> 标记每一项的位置:
# Cross-modal search: one text query against a photo and a sound recording
image_emb = model.encode({"image": "sunset_beach.jpg"})
audio_emb = model.encode({"audio": "ocean_waves.wav"})
query_emb = model.encode("ocean waves at sunset", prompt_name="SearchQuery")
print(model.similarity(query_emb, image_emb))
print(model.similarity(query_emb, audio_emb))
# Interleaved: one embedding for a product listing with text, photo, and video
listing_emb = model.encode({
"text": "Waterproof trail shoe. <|image|> Grip test on wet rock: <|video|>",
"image": "trail_shoe.jpg",
"video": "grip_test.mp4",
})
query_emb = model.encode("waterproof trail shoes", prompt_name="SearchQuery")
print(model.similarity(query_emb, listing_emb))Python
已复制
尽管来自不同的模态,EmbeddingGemma 2 生成的嵌入仍占据相同的维度空间,可以按其语义相似度进行比较。
步骤 4:使用 Matryoshka (MRL) 截断维度
将 truncate_dim(512、256 或 128)与 normalize_embeddings=True 一起传入,即可获得更短的、单位长度的向量。查询和文档必须使用相同的维度:
# Truncate the query
query_emb = model.encode(
query,
prompt_name="SearchQuery",
truncate_dim=256,
normalize_embeddings=True,
)Python
已复制
若要在每次调用中使用同一维度,可在加载时设置:SentenceTransformer(MODEL_ID, truncate_dim=256)。例如,在 bfloat16 精度下,存储一百万个 768 维向量大约需要 1.5 GB 内存,而将它们截断到 128 维则只需 250 MB。6 倍的缩减让你能在相同的内存预算下存储六倍数量的嵌入,从而更容易在内存中或设备端容纳大型索引。
选择你的配置
在 sentence-transformers 中,四种编码器设置都从同一个检查点加载,因此它们共享同一个向量空间:使用 270M 纯文本设置嵌入的查询,可以直接与使用完整模型嵌入的文档进行匹配。
一般原则是,只加载你的数据所需的编码器,并且仅在存储或搜索速度需要时才截断维度。
加载哪些编码器
如果你从纯文本索引开始,之后又添加图像或音频嵌入,只需重新加载模型并启用额外的编码器即可。你已经计算过的嵌入无需重新计算。
使用哪个维度
- 768d 或 512d:多模态和视觉文档检索,或任何召回率比存储更重要的情况。
- 256d(存储减少 3 倍):存储受限的索引。在文本和代码上保留了原始嵌入的大部分完整质量,在图像、视频和语音检索上保留约 95%,而存储仅需三分之一。
- 128d(存储减少 6 倍):大型纯文本索引和第一阶段初筛(重排序前的初筛)。文本和代码保留约 90% 的质量,但图像、视频和语音检索质量降至约 75%。在将 128d 用于多模态查询之前,请在你的目标数据上进行验证。
一次输入能容纳多少内容
所有模态共享 8,192 个 token 的上下文窗口,且速率固定:
最大值假设为单一模态且不含文本。将媒体以文件路径(视频为 MP4)、URL(图像和音频)或内存中的 PIL 图像、数组和张量形式传入。视频默认按每秒 1 帧采样,音频应为 16 kHz 单声道。
基准测试与评估
EmbeddingGemma 2 在 MTEB (Code) 上比 EmbeddingGemma 1 高出 14%,新增图像、视频和音频检索,同时保持 EmbeddingGemma 1 的多语言文本准确率
立即开始
准备好探索多模态嵌入了吗?查看以下资源以了解更多:
- 下载权重: 直接在 Hugging Face 上访问模型的权重(以 Apache 2.0 许可证发布)。
- 集成与学习: 在Gemma 文档中了解更多关于 EmbeddingGemma 2 的信息。
- 使用你喜爱的开发工具: 使用 vLLM、Hugging Face Transformers、sentence-transformers、SGLang、MLX、Ollama、LMStudio 和 LiteRT 高效运行该模型。
- 适配与微调: 如需快速实验,你可以使用 Unsloth 探索高效微调。
- 探索搜索:在 Google AI Edge Gallery 中试用 Instant Media Search 和 Video Moments Finder 端侧演示。
上一页
下一页
来源:Google Developers Blog · developers.googleblog.com