向量模型是黑盒。你输入文本,得到一个向量。这是一串没有标签、没有水印、也没有元数据告诉你它来自哪里的浮点数。如果有人给你一个 1024 维的向量,你能分辨出它是 BGE-M3、jina-embeddings-v5-text-small 还是 Qwen3-Embedding 生成的吗?即使两个向量来自同一个模型,你能看出它们是使用检索指令还是分类指令生成的吗?
事实证明,你可以。向量模型向量中的数值模式带有极其强烈的模型指纹,甚至包含了推理过程中使用的指令提示词。我们训练了一个小型 Transformer 分类器(80 万参数),通过仅读取原始浮点数,就能从 25 个以上的向量模型中识别出 68 种不同的模型-任务组合,准确率达到 87%。你可以亲自尝试 实时演示:粘贴任何向量模型向量,看看分类器认为它是哪个模型和任务生成的。
tag词元化:将数字视为文本
一个 1024 维的向量模型向量是一个由 1024 个浮点数组成的序列。为了将其输入分类器,我们需要一种不对数值结构做任何假设的表示方法。
我们采取了一种大胆的方法:将每个浮点数视为一个数字字符串,并逐字符进行词元化。与更紧凑的替代方案相比,这听起来可能有些浪费,但事实证明这是权衡后的正确选择。对于像 -0.1234 这样的数值,其词元序列为:
- 0 . 1 2 3 4各个维度之间由 [SEP] 词元分隔。完整序列以 [CLS] 开头。整个词表共有 15 个词元:

| 词元 ID | 含义 |
|---|---|
| 0-9 | 数字 |
| 10 | 负号 |
| 11 | 小数点 |
| 12 | [SEP] |
| 13 | [CLS] |
| 14 | [PAD] |
在 4 位小数精度下,一个 1024 维向量会产生大约 7,700 个词元。一个 384 维向量产生约 2,900 个词元。序列长度随向量模型维度的不同自然变化,不需要在维度之间进行填充或截断。由于词元分析器是直接的整数映射,没有可学习的部分,因此效率极高。
tag模型架构

该分类器是一个小型仅编码器 Transformer,包含 4 层、128 个维度、4 个带有 RoPE 的注意力头、SwiGLU FFN 和 RMSNorm。CLS 词元被池化并投影到 68 类的输出空间。总参数量约为 80 万。
尽管词表只有微小的 15 个词元,但这从根本上是一个长序列任务。单个 1024 维向量会变成一个 7,700 词元的序列,比典型的 NLP 输入还要长。模型必须关注成千上万个数字词元,以捕捉区分不同模型输出的统计模式。这使得高效的注意力和旋转位置编码(RoPE)即使在如此小的规模下也至关重要。
tag数据
我们使用了 10,000 个多语言文本样本,每个样本由 25 个以上的模型配合各种任务前缀(如 retrieval.query、retrieval.document、classification 和 clustering)生成向量,共产生 68 个不同的类别。重要的是,这 68 个类别不仅包括不同的模型,还包括应用于同一模型的不同指令提示词。例如,带有检索指令的 jina-embeddings-v5-text-small 和带有分类指令的 jina-embeddings-v5-text-small 被视为不同的类别。目标是仅凭原始输出就能检测出模型身份和特定任务的行为。
每个类别被划分为 7,000 个训练样本和 3,000 个验证样本。这些模型涵盖了五种输出维度。
| 维度 | 类别数 | 示例模型 |
|---|---|---|
| 384 | 8 | BGE-small, E5-small, MiniLM, GTE-small |
| 512 | 2 | BGE-small-zh |
| 768 | 24 | BGE-base, E5-base, jina-embeddings-v5-text-nano, Nomic, INSTRUCTOR, LaBSE |
| 1024 | 32 | BGE-M3, E5-large, jina-embeddings-v3, jina-embeddings-v5-text-small, Qwen3-0.6B, Snowflake, mxbai |
| 1536 | 2 | GTE-Qwen2-1.5B |
仅在 1024 维组中,就有 32 个类别需要区分,其中包括来自同一家族但带有不同任务前缀的模型。分类器在这里不能依赖序列长度;它必须学习纯粹的数值模式。
tag训练
训练在 A100 40GB 上运行,采用了混合精度、按长度分桶的批处理,以及带有余弦调度的 AdamW 优化器,处理速度达到每秒约 34 万个词元,每个训练轮次包含 23,800 个步数。
tag实验结果

极小的训练/验证差距和持续的性能提升表明,模型学到的是可泛化的知识而非简单的记忆。在 80 万参数下,该模型已接近其容量极限,更大的模型可能会进一步提高准确率。
tag混淆矩阵

总体准确率为 87.0%,是 1.5% 随机概率的 59 倍。多个模型被完美分类,包括 GTE-large、jina-embeddings-v3/jina-embeddings-v5-text-small 的分类变体、LaBSE 和 Paraphrase MiniLM。最难的情况是同一基础模型的任务前缀变体。Qwen3-0.6B 在其 4 种任务类型中家族内部混淆最严重,而 jina-embeddings-v5-text-small 在 5 种任务中实现了 92% 的家族内部准确率。同一模型上的不同指令提示词会产生可辨别的输出模式,这一事实本身就是一个值得注意的发现,这表明即使基础权重完全相同,任务适配也会留下可衡量的数值痕迹。
来自不同家族的模型(如 BGE vs. Jina vs. E5 vs. Nomic)比同一模型的任务变体更容易区分。核心架构和训练方法留下的特征比特定任务适配器留下的特征更强烈。真正的挑战在于 1024 维组(32 类)和 768 维组(24 类),在这些组中,分类器必须完全依赖数值模式而非序列长度。
tag其他方法
tag分桶词元分析器
将每个维度量化到 K 个桶(例如 256 个)之一,产生一个长度为 D 的紧凑序列,每个维度一个词元。这是 Embedding-Converter (ICLR 2025) 采用的方法。对于 1024 维向量,你会得到 1024 个词元,而不是 7,700 个。
分桶会对数值分布施加先验。你必须在看到数据之前决定分桶边界。但不同模型的数值分布方式根本不同。有些模型将大部分数值集中在零附近的狭窄范围内,而另一些模型则在 [-1, 1] 范围内均匀分布数值,且在同一个模型内部,分布也会随维度而变化。任何固定的分桶方案要么在数值聚集处浪费分辨率,要么在数值分散处分辨率不足。按模型进行自适应分桶则违背了初衷,因为它需要预先知道模型身份。
tag固定长度 MLP
将原始向量模型向量直接输入 MLP 分类器。根本问题不仅仅是变长维度问题(我们的模型产生的向量从 384 到 1536 维不等)。即使你将所有内容填充到固定长度,你也隐含地假设了维度索引在模型之间是语义对齐的,即 BGE-M3 的第 1 维对应于 jina-embeddings-v5-text-small 的第 1 维。这个假设是不成立的。不同的架构、训练数据和训练目标会产生完全不同的内部表示。
这两种替代方案都施加了模型必须设法绕过的结构性假设。数字级词元化避免了所有这些假设。这是我们能找到的最不依赖假设的表示方法:这里是每个数字的精确数字,按顺序排列,用标记分隔。剩下的由模型自己去发现。
tag结论
向量模型的训练目标是将语义相似的文本映射到相近的向量。训练目标中没有提到让向量具备可识别性,也没有提到编码模型签名。然而,签名确实存在,且强度足以被一个微小的分类器检测到。一个向量模型的“风格”,即它用来表示含义的特定数值模式,就像笔迹一样独特。甚至指令提示词的选择也会留下可检测的痕迹。
这在实际应用中具有重要价值,例如在源模型未知时审计向量数据库、验证 API 是否确实使用了其声称的模型,以及检测模型版本的变化。更从根本上说,它告诉我们向量模型以结构截然不同的方式编码含义,即使在产生相同维度的向量时也是如此。







