简介:本文面向开发者与技术选型人员,系统解释“多模态嵌入模型”这一定义:它是什么、由哪些部分组成、如何把大模型主干改造成向量输出、与生成式模型有何区别,以及在检索、聚类、去重等场景中的适用边界与注意事项,帮助读者建立完整认知框架。
嵌入模型(Embedding Model)是一类将非结构化输入(文本、图像、图文对等)映射为固定维度稠密向量的模型。它的输出不是自然语言回答,而是一个数值向量;这个向量在向量空间中的位置,编码了输入语义的可度量特征。两个向量之间的余弦相似度或内积,可以近似反映两个输入在语义上的接近程度。
与之相对,生成式大模型(如常见对话模型)的输出是 token 序列。二者可以共享同一个模型主干,但目标函数与使用方式完全不同:生成模型追求“下一个 token 的概率分布”,嵌入模型追求“让语义相近的样本在向量空间中靠近、语义无关的样本远离”。
当输入同时包含文本与图像时,这类模型被称为多模态嵌入模型。它把不同模态的样本投影到同一个向量空间,使“一张图”和“一段描述它的文字”可以直接比较相似度。这是跨模态检索、图文匹配等能力的基础。
一个值得注意的工程现象是:当前不少高性能嵌入模型并非从零训练,而是直接继承一个成熟的生成式大模型主干,再追加一个向量输出方法。例如某类 9B 级多模态嵌入模型,其自定义代码量仅约 1KB 量级,做法是继承原生成模型类、新增一个 embedding() 方法:运行主干前向计算、取最后一个有效 token 的隐状态、做归一化后返回。这说明“嵌入能力”在很大程度上是主干预训练知识的复用,真正的差异化落在数据构造与训练策略上。
传统检索方案依赖关键词匹配或浅层向量化,难以处理同义改写、跨语言、图文混合等语义问题。嵌入模型的价值体现在三点:
而“用大模型主干做嵌入”这一路线的价值在于:大模型在预训练阶段已吸收海量语料的结构化语义,将其隐状态直接作为表示,往往比小型专用双塔模型具备更强的语义分辨力,尤其在长上下文、复杂图文场景下更明显。
以继承式改造路线为例,可拆为四个部分:
配套的还有权重体积与精度:BF16 下,2B 级约 5.4GB、4B 级约 10.3GB、9B 级约 18.8GB;最大上下文可达 262,144 token 量级,这决定了单次可编码的文档长度上限。
示意性伪代码如下,体现“继承主干 + 追加池化”的通用思路:
class EmbeddingModel(GenerativeModel):def embedding(self, input_ids, attention_mask, pixel_values=None):hidden = self.backbone(input_ids, attention_mask, pixel_values) # [B, L, H]last_idx = attention_mask.sum(dim=-1) - 1 # 最后一个有效 tokenvec = hidden[torch.arange(hidden.size(0)), last_idx] # [B, H]return torch.nn.functional.normalize(vec, p=2, dim=-1)
流程可归纳为四步:输入编码 → 主干前向 → 末位有效 token 池化 → 归一化输出。其中“取最后一个有效 token”是一种因果注意力下的合理选择,因为该位置已聚合了前文全部信息;对 padded 序列必须用 attention mask 定位真实末位,否则会取到填充位,导致向量失真。
多模态嵌入模型是把大模型主干改造为向量编码器的技术路线:它复用预训练语义知识,通过末位有效 token 池化与归一化输出固定维度向量,实现文本与图像的统一语义比较。其能力边界由主干规模、视觉编码器、上下文长度与向量维度共同决定,而真正的差异化往往来自数据构造与训练策略,而非那几百行改造代码。选型时应围绕召回质量、存储成本、推理延迟三者做平衡,并严格保证训练与推理的池化、归一化、版本一致性。