认识 EmbeddingGemma 2:谷歌把「用一句话搜视频」塞进手机,740M 参数还 Apache 2.0
你手机相册里躺着九千张照片、两百段视频。你想找去年夏天那次——孩子在海边第一次下水,你举着手机喊了一句「慢点,慢点!」。
相册的搜索框只会认「海边」「沙滩」这类标签。你当时喊的那句话,它一个字也听不懂。
过去想干成这事儿,路子只有一条:把照片视频全传到某个云端服务上,交给人家的服务器去理解。代价你自己清楚——几千段私人影像过一遍别人的机房,还要按月付费。
2026 年 10 月 6 日,Google DeepMind 把这条路给堵上了。EmbeddingGemma 2,740M 参数,Apache 2.0 免费商用,能把文本、代码、图片、视频、音频塞进同一个 768 维向量空间,而且小到能在手机上跑。
也就是说:你录一句语音,它能从你的视频里找到那个画面。全程不出你的口袋。
多模态检索这件事,难的不是算法,是「你舍不舍得把数据传出去」。当模型小到能装进手机,这个问题就自动消失了。
什么是 EmbeddingGemma 2
先补三十秒的前置知识,不然后面全是黑话。
Embedding(嵌入),说白了就是把一个东西翻译成一串数字(向量)。翻译的规则是:意思越接近的东西,数字串越像。你把「如何给手机省电」和「延长续航的小技巧」翻成向量,这两个向量的夹角会非常小;而「今天天气不错」翻出来的向量,会离它俩很远。
有了这个,搜索就不再比字符,而是比意思。这就是 RAG(先检索再让大模型回答)的地基,也是所有「智能相册」「本地知识库」的底牌。
EmbeddingGemma 2 就是干这个翻译活的模型,只不过它比大多数同行多了一样本事:它不只翻译文字,图片、视频、音频它一起翻译,而且翻进同一个空间里。
同一个空间的意思是——你用一句话去搜,能直接搜出图片和视频;你用一段录音去搜,也能搜出文字。跨模态检索不需要任何中间转换。
参数是这么拆的:
| 组成部分 | 参数量 | 干什么用 |
|---|---|---|
| Transformer 骨干 | 130M | 文本理解主体 |
| Embedder(嵌入层) | 140M | 输出 768 维投影前的表示 |
| 视觉编码器 | 170M | 图像、视频抽帧 |
| 音频编码器 | 300M | 语音、环境音 |
| 合计 | 740M | 全模态拉满 |
前两项加起来 270M,就是纯文本干活时的最小配置。视觉和音频编码器是模块化挂件,不用就不加载。
架构上是 Gemma 4 的底子:24 层,模型维度 512、隐藏维度 2048,滑动窗口 1024 token,词表 262,144,注意力用 GQA/MQA 混合(局部:全局 = 5:1,每 5 层做一次全局注意力),激活函数是带门控的 GELU FFN,池化用 mean pooling,最后一层 512→768 的投影把维度抬到输出想要的 768 维。
上下文窗口 8,192 token,是初代 EmbeddingGemma 的四倍。换成你能感知的单位:大约 5.5 分钟音频、29 张图片、或者 58 个视频帧,也可以混着来。
它有什么特点
四种模态,一个空间。文本(含代码)、图像、视频、音频,以及它们的任意交错组合,全部映射到同一个 768 维向量。不用为每种模态各养一个模型、各维护一个索引——一个模型一份索引,全搞定。这一点听起来朴素,实际能给工程省掉一大半复杂度。
Matryoshka 套娃降维(MRL),最高省 6 倍存储。原生输出 768 维,但你不用重新训练,就能在推理时把向量截断到 512 / 256 / 128 维再重新归一化。Google 的说法是本地向量库存储最多能砍到六分之一。官方给了参考数:一百万条向量在 768 维下约 1.5GB,砍到 128 维约 250MB。但别贪便宜——模型卡明确写着降到 128 维时,图像、视频、音频的检索质量会掉到满配的约 75%,128 维只建议用在纯文本场景。质量可接受的下限是 256 维。
MTEB Code 从 68.76 冲到 78.68,一次涨了 9.92 分。这是它相对初代提升最猛的一项。代码跟自然语言不是一回事——变量名叫
tmp2还是buffer,字面毫无关系,语义却可能完全相同。这个涨幅意味着本地代码搜索、代码库索引、编程 Agent 的检索环节,从此有了能在自己机器上跑的选项。做开发工具的都懂:Agent 能不能找对文件,八成取决于它检索那段写得行不行,而不是它用的大模型有多贵。
多语言不掉队,覆盖 100+ 语言。MTEB 多语言(v2)得分 61.36,跟初代的 61.15 基本持平——加了三个模态,文本能力没退步,这事本身就挺难的。
按需加载,别为用不上的模态买单。
{"vision_config": None, "audio_config": None}传进config_kwargs,模型就只加载文本那 270M。四种组合如下:开哪些模态 config_kwargs实际参数 纯文本 {"vision_config": None, "audio_config": None}270M 文本 + 图像 {"audio_config": None}440M 文本 + 音频 {"vision_config": None}570M 全模态 {}740M 手机上真能跑。在 Google Pixel 11 Pro 上量化后,官方口径是纯文本权重约 191MB 活跃内存,全模态约 567MB。567MB 是什么概念?差不多是你刷一会儿短视频缓存的量。「端侧多模态检索」从论文标题变成了一个 App 能塞下的东西。
跟 Gemma 4 共用分词器和音频编码器。这个细节很容易被略过,但很值钱:你要做「本地检索 + 本地生成」的完整 RAG,跑 EmbeddingGemma 2 + Gemma 4 这套组合,比跑两个互不相干的模型省内存,因为底层的东西是共享的。
任务前缀这个「小机关」,不加不会报错,但效果会偷偷变差。训练时文本输入前面带了指令前缀。检索类(非对称)是查询加查询前缀、语料加文档前缀;分类聚类相似度(对称)是两边加同一个前缀。图片、视频、音频不加任何前缀。这套前缀从别的 embedding 模型迁移过来时最容易被忘记——它不报错,只是分数悄悄低一截,这种 bug 最难受。
Apache 2.0,权重在 Hugging Face 和 Kaggle 上,可商用可修改可分发。没有「仅限研究」那句要命的话。上一代 EmbeddingGemma 已经被下载了超过 2000 万次,社区基础不是从零开始的。
两个必须提前知道的坑:
第一,别用 float16。模型卡里这行字最容易被跳过:它的激活值范围超出了 float16 的动态范围,用它会得到 NaN 或者静默退化的向量——不报错,结果就是不对。请一律用 bfloat16 或 float32。这是那种能让你 debug 一整晚然后怀疑人生的坑。
第二,生态文档里有个数字是错的。Ollama 的模型页面上写着 256K 上下文,但模型本身每次输入只吃 8,192 token(模型卡口径)。长文档请按几百到两千字切块,别被那个数字骗了。
它能用在哪
1. 「手机里找东西」这件事本身被重做了 —— Google 自己先做了三个 demo
官方在 Google AI Edge Gallery 里放了三个示例应用,直接把能力演示出来了:
- Instant Media Search(即时媒体搜索):用一段文字或者一张图,从媒体库里找语义相近的图片视频;
- Video Moments Finder(视频时刻定位):用文字或音频查询,定位视频里的某个具体瞬间——就是开头那个「找到孩子第一次下水的那一段」;
- Foresight:本地检索挂上 Gemma 4 的推理能力,做完整的端侧多模态 RAG。
这三个 demo 的意义在于证明了「567MB 能不能干正事」这个疑问——答案是能。
2. 本地代码搜索,这可能是最快落地的场景
MTEB Code 78.68 这个分数,配上 Apache 2.0 和 191MB 的纯文本体积,指向一个非常具体的用法:给你的代码库建一份本地语义索引,让 IDE 插件或者编程 Agent 在本地检索。
好处很实在:公司代码不用传出去(这条对金融、政企、军工供应商是硬约束),检索零网络延迟(本地比调 API 快一个数量级),而且不要钱。
但说句实在话:别指望它第一天就能替掉你现在这套。请把你项目里最刁钻的十个问题拿出来,跟你现在用的检索方案跑一遍对比,再看要不要换。
3. 隐私优先的本地知识库 / RAG
这是上一代 2000 万次下载主要流向的地方,也是第二代最有想象力的地方:你的合同、病历、财务纪要、客户录音,全都留在本地建立索引,配 Gemma 4 做回答。
跟云端 RAG 相比,它不是「更好」,它是「更能被法务通过」。很多场景不是云端模型不够强,是数据根本不允许出内网——这时候本地小模型不是次优解,是唯一解。
4. 端侧的分流与路由
通过 MediaPipe Decision Task API,可以用多模态上下文做实时分类和路由。比如 App 里用户上传了一张截图加一句抱怨,模型一次前向就判断该转人工还是自动处理——不用先生成一堆 token 再解析。
说句实话:这篇写得比平时保守,因为 EmbeddingGemma 2 在 2026 年 10 月 6 日才发布,到今天满打满算三天。目前没有查到公开具名的外部企业落地案例和他们自己的效果对比,所有跑分(MTEB、MIEB、MMEB、MSEB、MAEB)和内存数字全部来自 Google 自报,尚无第三方复现。所以请把这篇文章当作「知道有这么个东西、它大概能干什么」,而不是选型结论。真正决定它该不该进你生产环境的,是你自己在自己数据上跑出来的那张表。
初体验
三种上手难度,挑你自己顺手的。
路线 A:Ollama,最快
ollama pull embeddinggemma-2:270mimport ollama
docs = [
"title: none | text: Galaxy S24,摔过之后屏幕出现绿色竖线,已换屏。",
"title: none | text: iPad 10,充电口积灰清理,未换件。",
]
query = "task: search result | query: 手机屏幕出现绿线"
doc_vecs = ollama.embed(model="embeddinggemma-2:270m", input=docs).embeddings
query_vec = ollama.embed(model="embeddinggemma-2:270m", input=query).embeddings[0]
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
norm = (sum(x * x for x in a) ** 0.5) * (sum(y * y for y in b) ** 0.5)
return dot / norm
for doc, vec in zip(docs, doc_vecs):
print(round(cosine(query_vec, vec), 3), doc)第一个应该明显排第一。注意这里前缀要自己手写,Ollama 默认不加。
路线 B:sentence-transformers,功能最全(要 6.1.0 及以上)
python3 -m venv ~/eg2
source ~/eg2/bin/activate
pip install -U "sentence-transformers[image,audio,video]" transformersfrom sentence_transformers import SentenceTransformer
# 全量 740M;纯文本可加 config_kwargs={"vision_config": None, "audio_config": None}
model = SentenceTransformer("google/embeddinggemma-2")
query = "What causes the northern lights?"
document = "The northern lights are caused by charged particles from the sun."
query_emb = model.encode(query, prompt_name="SearchQuery")
doc_emb = model.encode(document, prompt_name="Document")
print(model.similarity(query_emb, doc_emb))prompt_name 会帮你把前缀拼好。常用的几个:SearchQuery / Document(检索),QuestionAnswering、FactChecking、CodeRetrieval(代码检索),以及 Classification、Clustering、SentenceSimilarity(对称任务用同一套)。想看全列表,打印 model.prompts 就行。
prompt_name="Document" 默认用 title: none;你的文档真有标题的话,请自己拼成 title: {标题} | text: {正文},加了标题检索准确率会明显变好。
四条能省你半天的提醒:
- 精度务必设成 bfloat16 或 float32,千万别用 float16,会得到 NaN 或者静默掉质量。这条我在上面说过一次,这里再说一遍,因为它是这篇最重要的一句话。
- 截维先看 256。128 维只适合纯文本;涉及图片视频音频,降到 128 维质量只剩满配的约 75%。先用 768 维跑通,再往下砍到 256 看能不能接受,别一上来就省到骨头。
config_kwargs跳过编码器的写法,不同运行时的行为不完全一致。换 llama.cpp、MLX、Ollama 之前,请先翻对应运行时的文档别想当然地照搬。- 它上架 Gemini Enterprise Agent Platform Model Garden 还是「coming soon」,目前只有 Hugging Face 和 Kaggle 两个权重来源。另外 SGLang、vLLM、llama.cpp、MLX、LM Studio、transformers.js(浏览器 + WebGPU)都已支持,向量库官方示例用的是 Qdrant。
进阶
到这里,你已经知道 EmbeddingGemma 2 是什么、它凭什么叫多模态、怎么把第一条「以文搜图」的链路跑起来了——对新手来说,知道比精通重要得多,剩下的交给好奇心就行。
真想往下挖,建议这个顺序:先用上面那段 demo 把 256 维和 768 维各跑一遍,亲眼看看截断到底掉了多少分;然后把 prompt_name 挨个试一遍,体会一下前缀到底影响了什么;接着换成你自己的文档或者自己的代码仓库,跟你现在的检索方案做同集合对比;有余力再去看 Matryoshka 表示学习的原始论文,弄明白「为什么能在推理时剪」。
顺带一提,如果你想横向比较,本站还有腾讯 WeMM-Embedding(2B/4B/9B 多模态 Embedding,MMEB-v2 上 9B 拿下 80.6)和 MTEB 榜单说明,可以对照着看不同路线的取舍。
最后提醒一次:别第一天就想着让它替换公司跑了三年的检索系统——那不是入门,那是渡劫。
更多开源技术干货和学习资料,关注公众号「遇码」,领取专属福利。
