CLIP 架起了文本和图像的桥梁,但实际上没有人会用它来进行文本检索。
为了解决这一问题,我们推出了 Jina CLIP v1,一个增强版的 OpenAI CLIP 模型,擅长文本-文本、文本-图像、图像-文本,还能进行图像-图像四个方向的检索。从现在起,你的 Jina CLIP 模型不仅是图像检索器,更是强大的文本检索器。
在构建多模态 RAG 应用时,你不再需要在不同的向量模型之间切换,一个模型、两种模态、四个搜索方向 都交给 Jina CLIP v1。更关键的是,它还能够处理长达 8K 的输入长度。接下来,就让我们一探这款新模型的精华所在。
CLIP 的多模态架构
在 2021 年 1 月,OpenAI 推出了开创性的 CLIP 模型,其架构简洁却极具巧思:将一个文本编码器与一个图像编码器结合,在统一的向量空间中输出结果。CLIP 的文本向量与图像向量之间的距离,反映了两者语义关联的紧密程度。
CLIP 这一架构非常适用于跨模态检索和零样本分类任务,通过学习大量的图像和文本对,即使在没有针对性任务训练的情况下,也能理解并分类新的图像。
原始 CLIP 模型中的文本向量部分是一个定制的神经网络,在图像向量方面,OpenAI 则使用了一系列 ResNet 和 ViT 模型,再用图像描述进行训练,以生成相似的图像-文本向量。
这种方法非常有效,尤其是在零样本分类中的表现。举个例子,即使训练数据中没有标注宇航员的图像,CLIP 仍能凭借对文本和图像相关概念的理解,准确识别宇航员的图片。
然而,OpenAI 的 CLIP 也存在两大短板:
1. 文本输入容量非常有限。最多仅支持 77 个 token 的输入,根据 LongCLIP 的实验,实际上其有效输入不超过 20 个 token。
2. 在纯文本检索中表现不佳。主要原因有两点:首先,CLIP 模型的训练目标是对齐文本和图像,没有针对纯文本检索进行专门优化。其次,CLIP 模型的训练数据主要由相对较短的文本组成,难以泛化到更广阔的文本检索场景。
因此,在大多数应用到 CLIP 模型的实际应用场景中,如果涉及到纯文本检索任务,就需要引入其他专用文本向量模型并行使用,使得 AI 框架的规模和复杂性增加了一倍。
Jina CLIP v1 直接解决了这些痛点,利用了近年来的进展,jina-clip-v1 为涉及所有文本和图像模态组合的任务提供了最先进的性能,一个模型支持两种模态、四个搜索方向,为用户带来前所未有的便捷性和高效性。
介绍 Jina CLIP v1
Jina CLIP v1 沿用了 OpenAI CLIP 的双编码器架构:两个编码器共同训练,生成在同一向量空间中的输出结果。
在文本编码器,我们采用自身的向量模型所使用的 Jina BERT v2 架构,支持高达 8k token 的长文本输入,输出维度 768,明显优于 CLIP,能够可以处理更长的文本,并生成更精确的向量。
在图像编码器方面,我们使用了北京智源人工智能研究院的最新模型 EVA-02(https://github.com/baaivision/EVA/tree/master/EVA-02),我们对一系列图像编码器进行了测评,在相似的预训练背景下进行跨模态测试,EVA-02 明显优于其他模型。它的模型大小也与 Jina BERT 架构相当,因此图像和文本处理任务的计算负担大致相同。经过我们的进一步训练,它在图像到图像及跨模态任务中展现出极佳表现。
通过这一全新组合,Jina CLIP v1 取得了以下重大进展:
- 在跨模态、纯文本、纯图像等所有场景下表现都很卓越,相比 CLIP 模型平均性能提升了 46%。
- EVA-02 不仅在图像-文本和纯图像任务中表现卓越,并且经过 Jina AI 的额外训练后,其纯图像的表现进一步提升。
- 支持更长的文本输入。最高支持 8k token 输入,可与丰富语义上下文相关联。
- Jina CLIP 即使在非跨模态场景中也有出色表现,因此可以大幅节省用户使用时的空间、计算、代码维护和复杂度。
模型训练
Jina CLIP v1 在性能上的出色表现,归因于我们创新性的三阶段训练流程。前面提到了 CLIP 模型在纯文本场景下表现不佳的主要原因:
- CLIP 专注于捕捉跨模态(图像和文本)的语义关联,对于单个模态(纯文本)之间的细粒度语义建模能力相对较弱。
- CLIP 使用的训练数据主要来自网络上的图像-文本对,相比于大规模语料库,训练数据在覆盖面和多样性方面存在局限。这导致模型难以泛化到更广阔的文本检索场景,无法有效处理一些长尾或领域特定的查询。
因此,我们有针对性地设计了训练方案来改善这一问题,通过两个任务共同优化、以及长文本单项优化的方式进行训练,具体分为三个步骤:
三阶段联合训练流程
第一阶段:对齐图像和文本向量
首先,我们使用带描述的图像数据来对齐图像和文本向量,辅助文本对来进行协同训练。这种训练方法使两模态互相促进,提升短文本的检索能力,同时保持跨模态检索性能。
第二阶段:利用合成数据进行长文本优化
接着,我们引入了由 AI 模型生成的合成数据,主要是长文本图像描述数据,通过增加文本序列长度(至 512)来训练模型。这一阶段重点提升了模型对于长文本的关注和处理能力,进一步优化了文本检索的性能。
第三阶段:难负样本学习
在最后阶段,我们使用包含难负样本的文本三元组,进一步改进文本编码器,学习区分相关文本与不相关文本。同时,为保持文本-图像对齐,我们继续对长图像标题进行训练。此阶段显著提升了纯文本性能,模型的图像-文本的跨模态检索能力则保持稳定。
通过上述策略,我们实现了文本和图像两模态的共同进化,使模型在所有检索场景中均能发挥出色表现。有关训练和模型架构的详细信息,请参阅我们的论文:《Jina CLIP: Your CLIP Model Is Also Your Text Retriever》https://arxiv.org/abs/2405.20204。
多模态向量的新前沿
我们评估了 Jina CLIP v1 在纯文本、纯图像以及跨模态任务中的表现。我们使用 MTEB 检索基准来评估其文本性能;在纯图像任务中,采用 CIFAR-100 基准测试;在跨模态任务方面,选择了包含在 CLIP 基准中的 Flickr8k、Flickr30K 和 MSCOCO Captions 数据集进行评估。
结果如上图所示:,jina-clip-v1 在所有类别中均优于 OpenAI 的原始 CLIP,尤其是在纯文本和纯图像检索方面,表现显著优越。平均来看性能提升了 46%。
如何上手 API
您可以轻松地通过 Jina Embeddings API 将 Jina CLIP v1 集成到您的应用中。
下面的代码展示了如何使用 requests 包在 Python 中调用 API 以获取文本和图像的向量。它将文本字符串和图像的 URL 传递给 Jina AI 服务器,并返回两者的编码。
下面的代码示例展示了如何通过 Python 中的 requests 包调用 API 来获取文本和图像的向量,它将文本字符串和图像的 URL 传递给 Jina AI 服务器,并返回两者的编码。
☝️ 记得将 <YOUR_JINA_AI_API_KEY> 替换为已激活的 Jina API 密钥。你可以在 Jina Embeddings 网页获取包含一百万免费 tokens 的试用密钥。
import requests
import numpy as np
from numpy.linalg import norm
cos_sim = lambda a,b: (a @ b.T) / (norm(a)*norm(b))
url = 'https://api.jina.ai/v1/embeddings'
headers = {
'Content-Type': 'application/json',
'Authorization': 'Bearer <YOUR_JINA_AI_API_KEY>'
}
data = {
'input': [
{"text": "Bridge close-shot"},
{"url": "https://fastly.picsum.photos/id/84/1280/848.jpg?hmac=YFRYDI4UsfbeTzI8ZakNOR98wVU7a-9a2tGF542539s"}],
'model': 'jina-clip-v1',
'encoding_type': 'float'
}
response = requests.post(url, headers=headers, json=data)
sim = cos_sim(np.array(response.json()['data'][0]['embedding']), np.array(response.json()['data'][1]['embedding']))
print(f"Cosine text<->image: {sim}")
主流 LLM 框架集成
Jina CLIP v1 已与 LlamaIndex 和 LangChain 等热门框架集成:
- 在 LlamaIndex 中: 通过 MultimodalEmbedding 基类使用 JinaEmbedding,并调用 get_image_embeddings 或 get_text_embeddings。
- 在 LangChain 中: 使用 JinaEmbeddings,并调用 embed_images 或 embed_documents。
定价
文本和图像输入的费用按 token 消耗计算。
- 对于英语文本,平均每个单词需要 1.1 个 token。
- 对于图像,则 224x224 像素块数量计算,每块 1,000 tokens,不足一块的按一块计算。
我们还为企业用户提供包含个性化咨询、定制解决方案、优先支持等增值服务。
在 Hugging Face 上开源
Jina AI 一直积极推动开源社区发展,致力于建立开源搜索基础。因此,我们在 Hugging Face 上发布了 Jina CLIP v1 模型,采用 Apache 2.0 许可证,欢迎大家下载使用。
你可以在 Hugging Face 的 jina-clip-v1 模型页面上找到示例代码,用于在你自己的系统或云部署中下载并运行此模型。
jinaai/jina-clip-v1 · Hugging Face:https://huggingface.co/jinaai/jina-clip-v1
总结
作为我们在多模态向量检索的力作,Jina CLIP v1 性能显著超越了 OpenAI 的 CLIP。它在纯文本和纯图像检索任务中有显著改进,在从文本到图像、从图像到文本的检索任务中表现也很优秀,是应对复杂向量用例的理想解决方案。现在,您不再需要为不同模态使用不同的模型了。
由于资源限制,该模型目前仅支持英文文本。我们正努力扩展其对更多语言的支持。
有关 Jina AI 及其产品的更多信息,请访问我们的网站 https://jina.ai/embeddings。如需讨论具体用例和 Jina AI 产品,请通过小助手 jinaai01 与我们联系。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。