假设你正在构建一个体育新闻搜索系统。用户搜索“网球运动员庆祝锦标赛胜利”,你需要从数据库中找到最相关的文章。每篇文章都包含文本标题和图像——这是现代体育报道的典型特征。
你的系统需要接收一个文本查询 (text query),并返回一个排序后的、最相关的多模态文档列表 (ranked list of the most relevant multimodal documents),这些文档来自你的语料库。听起来很简单,但存在一个根本性的问题,它破坏了所有显而易见的方法。
当尝试对这些文档进行排序时,会发生以下情况。你的 向量模型 (Embeddings)(比如 jina-clip-v2)会产生如下相似度分数:
| 文章 | 内容类型 | 描述 | 相似度分数 |
|---|---|---|---|
| A | 文本 | 诺瓦克·德约科维奇在澳大利亚网球公开赛决赛中直落三盘获胜 | 0.72 |
| A | 图像 | [球员手持奖杯并微笑的照片] | 0.31 |
| B | 文本 | 天气延误影响室外锦标赛的赛程安排 | 0.23 |
| B | 图像 | [网球运动员跳跃和庆祝的照片] | 0.54 |
哪篇文章更相关?文章 A 的文本得分很高,但图像得分很低。文章 B 的文本得分很低,但图像得分较高。根本的挑战在于,你无法比较 0.72(文本)和 0.54(图像),因为这些相似度分数存在于完全不同的尺度上。
tag当简单的解决方案失败时
由于模态差异 (modality gap),在 jina-clip-v2 或几乎所有其他类 CLIP 模型中,你可能尝试的任何显而易见的方法都行不通。如果你只使用较高的分数,你会遇到这样的情况:文本分数聚集在 0.2-0.8 附近,而图像分数聚集在 0.4-0.6 附近。这意味着平庸的文本匹配(0.6)总是会胜过优秀的图像匹配(0.5)。
对分数进行平均也无济于事。计算 (0.7 + 0.3)/2 = 0.5 会得到一个数字,但它实际上意味着什么?你正在平均从根本上毫无意义的量。同样,任何固定的加权方案都是武断的——有时文本更重要,有时图像更重要,这完全取决于具体的 查询 (Prompt) 和文档。
即使首先对分数进行归一化也无法解决核心问题。你仍然试图组合从根本上不同的相似性度量,这些度量捕捉了相关性的不同方面。
tag实际发生了什么

为了更好地了解我们正在处理的内容,这是一个来自 EDIS 数据集的示例文档,显示了图像(一场德国足球比赛)和标题(One More Field Where the Content Trails Germany)。

总的来说,jina-clip-v2 在比较 查询 (Prompt) 到文本的相似度时,比 查询 (Prompt) 到图像的相似度表现出更高的相似度,部分原因是模型的训练方式,部分原因是数据集本身:

因此,根据文档的文本而不是图像来检索文档似乎是合乎逻辑的。而且,正如我们在下面的图表中看到的,当我们比较文本 查询 (Prompt) ... for undocumented immigrants helping to establish legal status in the United States 与语料库的文本内容时,我们获得了更好的结果。事实上,按图像搜索根本无法检索到真实文档(以黄色突出显示):

top_k 为 3 时,只能通过这种方式检索到真实文档(以黄色边框突出显示)的示例。但不要被愚弄了。尽管 查询 (Prompt) 到文本显示出更高的相似度分数,但 查询 (Prompt) 到文本和 查询 (Prompt) 到图像的相似度分数是不可比较的。当使用 jina-clip-v2 从 EDIS 数据集中检索 32 个文档时,我们可以通过查看 recall@10 来看到这一点。显然,查询到图像的召回率更高:
| Recall@10 | |
|---|---|
| Query-to-text | 14.55 |
| Query-to-image | 22.38 |
我们可以在下面看到:如果我们使用数据集中的一个 查询 (Prompt),Ear ear An elephant is decorated with Bhartiya Janta Party symbols near the BJP headquarters in New Delhi.,我们只能通过其图像内容来检索真实文档。按其文本内容搜索不会返回任何匹配项:

top_k 为 3 时,只能通过这种方式检索到真实文档(以黄色边框突出显示)的示例。因此,如果相似度得分意味着我们应该从文本中检索文档,而召回率意味着我们应该从图像中检索文档,那么我们应该选择哪个呢?当然,图 3 和图 4 表明没有明显的赢家。哪种模态真正呈现了我们的查询和我们正在寻找的文档之间最接近的匹配?如果我们要合并来自query-to-text和query-to-image检索的候选结果,如果我们甚至无法比较分数,我们如何才能有意义地选择最佳匹配?显然,仅仅使用 jina-clip-v2 是不够的。我们需要将另一个模型加入其中。
tag一个简单的两阶段流程
在 2025 年 4 月,我们发布了 jina-reranker-m0,这是一个用于检索视觉文档的多语言多模态重排器 (Reranker)。我们可以在下面看到它较窄的模态差距,其中 jina-reranker-m0 显示出可比较的 query-to-text 和 query-to-image 相似度得分,这与 jina-clip-v2 显示的更大差距形成对比:

考虑到这一点,我们可以在从 jina-clip-v2 检索到初始结果后,使用 jina-reranker-m0 进行检索链中的第二轮处理:
阶段 1:从两种模态检索候选结果
- 使用 jina-clip-v2 通过文本搜索获取 16 个文档,通过图像搜索获取 16 个文档
- 接受我们还无法比较分数
阶段 2:统一重排
- 将每个(查询 + 完整文档)对输入到 jina-reranker-m0 中
- 重排器 (Reranker) 同时处理文本和图像
- 输出:统一尺度上的单个相关性得分

我们扩展了表 1 中的实验,现在使用 jina-clip-v2 从语料库中检索文档,然后使用 jina-reranker-m0 对它们进行重排:
- 通过 query-to-text 检索 32 个文档,然后根据 query-to-text 得分进行重排。
- 通过 query-to-image 检索 32 个文档,然后根据 query-to-image 得分进行重排。
- 通过 query-to-text 检索 16 个文档,通过 query-to-image 检索 16 个文档。根据查询模态,基于 query-to-text 或 query-to-image 得分进行重排。
- 通过 query-to-text 检索 16 个文档,通过 query-to-image 检索 16 个文档。基于每个文档的平均 query-to-text 和 query-to-image 得分进行重排,给出最终得分(query-to-text + query-to-image)/2。
| Experiment | Description | Recall@10 - with jina-clip-v2 | Recall@10 - with jina-reranker-m0 |
|---|---|---|---|
| 1 | 32 docs: query-to-text | 14.55 | 17.42 |
| 2 | 32 docs: query-to-image | 22.38 | 28.94 |
| 3 | 16 docs: query-to-text 16 docs: query-to-image |
14.55 | 33.81 |
| 4 | 16 docs: query-to-text 16 docs: query-to-image Combined average reranker scores |
14.55 | 36.24 |
正如我们所看到的,通过使用 jina-reranker-m0 执行第二轮处理,召回率全面提高,而与模态无关。但是,当我们结合从检索到的文档中提取的文本和图像内容时,我们看到了最大的增长,达到了 36.24 的 recall@10。一个可视化示例表明,无论是搜索文本还是图像内容,jina-reranker-m0 始终将真实文档排在第一位:

top_k 为 1 的结果(右侧的四列),表明结合图像和文本相似度得分始终将真实文档排在第一位。top_k 为 3,但出于空间原因,图 7 仅显示了每个查询的 top_k 为 1。tag结论
这种简单的两阶段方法带来了 62% 的召回率提升,因为该系统最终利用了人类自然而然的行为:同时考虑我们阅读的内容和我们看到的内容来确定相关性。这一经验也适用于搜索之外的领域:在处理多模态 AI 系统时,将模态分开处理的单次处理方法总是会遇到这种评分不兼容的问题。先广泛检索然后智能排序的两阶段架构正变得至关重要。通过我们的 API 或在 AWS、GCP 和 Azure 上试用 jina-reranker-m0。









