176MB 的多模态向量模型:EmbeddingGemma 2 开源,Unsloth 顺手卷成了 GGUF

做 RAG 的人大概都懂这种纠结:一端是 embedding 模型要够聪明,另一端是跑起来要轻。到了多模态这层,矛盾更直接——检索的文档里混着图、截屏、视频片段和录音,可一旦把图像、音频编码器全塞进服务,显存、内存、延迟全都要账本一样慢慢算。今天这两件事同时往前挪了一步:Google DeepMind 把 EmbeddingGemma 2 开源了(Apache 2.0),而 Unsloth 已经把它量化成了一套 GGUF,4-bit 版本只有 176MB。

这模型的卖点是「一个模型吃四种模态」——文本、代码、图像、视频、音频,以及它们的任意组合,都被映射进同一个 768 维向量空间。一段视频的帧、一段录音、一段代码和一段文字,最终可以放在同一个空间里做距离比较。总参数 740M,其中文本主干是 130M transformer + 140M embedder,图像编码器 170M,音频编码器 300M,上下文窗口 8K。按 Google 的说法,这模型就是冲着消费级硬件设计的——手机、笔记本上跑低延迟的语义表示,用于搜索、RAG、分类、聚类。

对做 on-device 检索的人来说,向量可以截断这一条更实在。它原生支持 Matryoshka Representation Learning,768 维输出能直接砍到 512、256、128 维再归一化,存储成本最高压到 1/6。官方给的数据里,砍到 256 维和满维度质量几乎无损——MTEB 多语言从 61.36 降到 60.41,代码从 78.68 到 76.18;但砍到 128 维时多模态部分掉得明显,MMEB 整体从 59.01 直接掉到 45.65,基本只适合文本场景。128d 这条别直接上,得先拿自己负责的 workload 先验一遍。

Unsloth 这套 GGUF 的看点也在这。EmbeddingGemma 2 本体 740M,量化之后 UD-Q4_K_XL 是 176MB,Q5 是 210MB,Q6 是 249MB,Q8_0 是 310MB,BF16/F16 各 558MB。以前做「服务端跑一个上 GB 的多模态 embedding」的人,看到 176MB 这个数字,第一反应应该是算算手机和边缘盒子还能不能再塞一个模型进去。Unsloth 标的是 Dynamic 3.0,称比其它主流量化精度更好——这个话术听听就好,真部署时拿自己的数据对比一下。

有几个工程细节得拎出来,踩了就是整晚查日志的命。这模型不能跑 float16——官方明确写了,它的激活范围超出 float16 的动态范围,跑 float16 会返回 NaN 或静默退化的向量,而且不报错,检索结果莫名变差,查半天查不出原因。正确做法是硬件支持就用 bfloat16(和 float32 同样 8-bit 指数,显存减半),否则 CPU 上用 float32。截断向量后必须重新做 L2 归一化,不然 cosine similarity 会算出「看起来还行、其实全乱」的分数;查询向量和语料库向量维度还得分一致,768d 的 query 不能拿去和 128d 的语料打分。text 要带任务前缀——检索用 SearchQuery/Document,分类用 Classification,聚类用 Clustering,同构任务所有输入加同一个前缀;有标题的文档格式是 title: {title} | text: {content},没标题就用 title: none。这四个细节没有一个是「锦上添花」,全都直接影响结果质量。

多模态输入吃多少 token,也得心里有数。图像默认 280 token/张,视频每帧 140 token,音频每秒 25 token,全挤在同一个 8192 token 的上下文里。于是纯文本能吃满 8192 token,纯图像约 29 张,纯音频约 327 秒,视频约 58 帧,混着用就互相挤占。想塞更多图或帧,把视觉 token 预算从 280 降到 70,最多约 114 张图/帧,代价是视觉细粒度理解下降。这几行数字,基本就是多模态 RAG 索引设计的边界条件。

再说一个跟安全相关的点。EmbeddingGemma 2 是预训练 embedding 模型,不像生成式模型那样做过对齐和安全调优。它输出的是向量不是文字,所以「风险」在下游用法——检索、分类、聚类这些应用怎么用这些表示,责任在部署方。训练数据里做了 CSAM 过滤和敏感信息过滤,但开发者在生产里该做的检索过滤、公平性测试一个也不能省,还得守 Gemma Prohibited Use Policy。

这波最大的意义不在这模型本身有多能打,而在于「多模态语义检索」这个以前必须上服务器的活,现在有了能在手机和边缘设备上跑的开源选项——还是 Apache 2.0。176MB 的 4-bit 单模型把四种模态挤进一个空间,GGUF 文件直接能接上 llama.cpp 那套本地推理链路。至于量化后和全精度差多少,官方给的 benchmark 都是全精度 checkpoints 的数,这点别当成量化后的结果。拿自己的图库和录音跑一遍,比看任何宣传都准。

相关链接