说明文档
<br><br>
<p align="center"> <img src="https://huggingface.co/datasets/jinaai/documentation-images/resolve/main/logo.webp" alt="Jina AI: Your Search Foundation, Supercharged!" width="150px"> </p>
<p align="center"> <b>由 <a href="https://jina.ai/"><b>Jina AI</b></a> 训练的嵌入模型集合。</b> </p>
<p align="center"> <b>Jina CLIP v2:用于文本和图像的多语言多模态嵌入</b> </p>
本模型基于论文 jina-clip-v2: Multilingual Multimodal Embeddings for Text and Images。
快速开始
博客 | 技术报告 | Azure | AWS SageMaker | Google Cloud Platform | API
预期用途与模型信息
jina-clip-v2 是一个通用的多语言多模态文本和图像嵌入模型。
多模态嵌入通过统一的表示形式实现跨不同模态的数据搜索和理解。它们是神经信息检索和多模态 GenAI 应用的支柱。
基于 jina-clip-v1 和我们近期发布的 jina-embeddings-v3,jina-clip-v2 具有以下显著改进:
- 性能提升:v2 在文本-图像和文本-文本检索任务上相比 v1 提升了 3% 的性能。与 v1 类似,v2 的文本编码器可用作有效的多语言长上下文密集检索器。它的表现与我们前沿模型
jina-embeddings-v2相当(目前是 MTEB 上 10 亿参数以下最好的多语言嵌入模型)。 - 多语言支持:使用与
jina-embeddings-v3相同的骨干网络作为文本塔,jina-clip-v2支持 89 种语言进行多语言-图像检索,相比nllb-clip-large-siglip在多语言图像检索任务上提升高达 4%。 - 更高图像分辨率:v2 现在支持 512x512 输入图像分辨率,相比 v1 的 224x224 有显著提升。更高的分辨率能够更好地处理细节图像,改进特征提取,以及更准确地识别细粒度的视觉元素。
- 嵌套表示:v2 允许用户将文本和图像嵌入的输出维度从 1024 截断至 64,在保持强劲性能的同时减少存储和处理开销。
jina-clip-v2 共有 9 亿参数,结合了两个强大的编码器:
- 文本编码器
Jina-XLM-RoBERTa(jina-embeddings-v3的骨干网络)和 - 视觉编码器
EVA02-L14(BAAI 开发的高效视觉 Transformer)。
| 特性 | 文本编码器 | 图像编码器 |
|---|---|---|
| 基础模型 | Jina-XLM-RoBERTa | EVA02-L |
| 参数量 | 561M | 304M |
| 输入规格 | 8,192 个词元(最大) | 512×512 像素 |
| 最小输出维度 | 64 | 64 |
| 最大输出维度 | 1,024 | 1,024 |
| 层数 | 24 | 24 |
| 注意力机制 | FlashAttention2 | xFormers |
| 池化策略 | Mean pooling | CLS pooling |
| 额外特性 | 支持 89 种语言 | Patch 大小 14x14 |
这些编码器经过联合训练,以创建图像和文本的对齐表示。
CLIP 类模型已被确立为通用多模态应用的支柱。通过 jina-clip-v2,我们将这些能力提升到新的水平,打破语言障碍,提供更准确的跨模态理解和检索。我们相信此版本实现了让全球开发者都能使用更强大、更易用的多模态搜索和检索的承诺。
训练、数据、参数
请参阅我们的 jina-clip-v2 技术报告 了解模型和训练详情。
更快的推理:FA2、XFormers 和 bf16
在启用 CUDA 的 PyTorch 环境中,模型默认使用 torch.bfloat16 精度。强烈建议安装 FlashAttention 和 xFormers 以利用它们的高效注意力机制实现。
使用方法
<details> <summary>通过 Jina AI <a href="https://jina.ai/embeddings/">Embedding API</a></summary>
curl https://api.jina.ai/v1/embeddings \
-H "Content-Type: application/json" \
-H "Authorization: Bearer [JINA_AI_API_TOKEN]" \
-d @- <<EOFEOF
{
"model": "jina-clip-v2",
"dimensions": 1024,
"task": "retrieval.query",
"normalized": true,
"embedding_type": "float",
"input": [
{
"text": "غروب جميل على الشاطئ"
},
{
"text": "海滩上美丽的日落"
},
{
"text": "A beautiful sunset over the beach"
},
{
"text": "Un beau coucher de soleil sur la plage"
},
{
"text": "Ein wunderschöner Sonnenuntergang am Strand"
},
{
"text": "Ένα όμορφο ηλιοβασίλεμα πάνω από την παραλία"
},
{
"text": "समुद्र तट पर एक खूबसूरत सूर्यास्त"
},
{
"text": "Un bellissimo tramonto sulla spiaggia"
},
{
"text": "浜辺に沈む美しい夕日"
},
{
"text": "해변 위로 아름다운 일몰"
},
{
"image": "https://i.ibb.co/nQNGqL0/beach1.jpg"
},
{
"image": "https://i.ibb.co/r5w8hG8/beach2.jpg"
}
]
}
EOFEOF
</details>
<details> <summary>通过 <a href="https://huggingface.co/docs/transformers/en/index">transformers</a></summary>
# !pip install transformers einops timm pillow
from transformers import AutoModel
# 初始化模型
model = AutoModel.from_pretrained('jinaai/jina-clip-v2', trust_remote_code=True)
# 语料库
sentences = [
'غروب جميل على الشاطئ', # 阿拉伯语
'海滩上美丽的日落', # 中文
'Un beau coucher de soleil sur la plage', # 法语
'Ein wunderschöner Sonnenuntergang am Strand', # 德语
'Ένα όμορφο ηλιοβασίλεμα πάνω από την παραλία', # 希腊语
'समुद्र तट पर एक खूबसूरत सूर्यास्त', # 印地语
'Un bellissimo tramonto sulla spiaggia', # 意大利语
'浜辺に沈む美しい夕日', # 日语
'해변 위로 아름다운 일몰', # 韩语
]
# 公开图像 URL 或 PIL Image
image_urls = ['https://i.ibb.co/nQNGqL0/beach1.jpg', 'https://i.ibb.co/r5w8hG8/beach2.jpg']
# 选择嵌套维度,设为 None 以获取完整的 1024 维向量
truncate_dim = 512
# 编码文本和图像
text_embeddings = model.encode_text(sentences, truncate_dim=truncate_dim)
image_embeddings = model.encode_image(
image_urls, truncate_dim=truncate_dim
) # 也接受 PIL.Image.Image、本地文件名、dataURI
# 编码查询文本
query = 'beautiful sunset over the beach' # 英语
query_embeddings = model.encode_text(
query, task='retrieval.query', truncate_dim=truncate_dim
)
# 文本到图像
print('En -> Img: ' + str(query_embeddings @ image_embeddings[0].T))
# 图像到图像
print('Img -> Img: ' + str(image_embeddings[0] @ image_embeddings[1].T))
# 文本到文本
print('En -> Ar: ' + str(query_embeddings @ text_embeddings[0].T))
print('En -> Zh: ' + str(query_embeddings @ text_embeddings[1].T))
print('En -> Fr: ' + str(query_embeddings @ text_embeddings[2].T))
print('En -> De: ' + str(query_embeddings @ text_embeddings[3].T))
print('En -> Gr: ' + str(query_embeddings @ text_embeddings[4].T))
print('En -> Hi: ' + str(query_embeddings @ text_embeddings[5].T))
print('En -> It: ' + str(query_embeddings @ text_embeddings[6].T))
print('En -> Jp: ' + str(query_embeddings @ text_embeddings[7].T))
print('En -> Ko: ' + str(query_embeddings @ text_embeddings[8].T))
</details>
<details> <summary>通过 <a href="https://sbert.net/">sentence-transformers</a></summary>
# !pip install sentence-transformers einops timm pillow
from sentence_transformers import SentenceTransformer
# 选择嵌套维度
truncate_dim = 512
# 初始化模型
model = SentenceTransformer(
'jinaai/jina-clip-v2', trust_remote_code=True, truncate_dim=truncate_dim
)
# 语料库
sentences = [
'غروب جميل على الشاطئ', # 阿拉伯语
'海滩上美丽的日落', # 中文
'Un beau coucher de soleil sur la plage', # 法语
'Ein wunderschöner Sonnenuntergang am Strand', # 德语
'Ένα όμορφο ηλιοβασίλεμα πάνω από την παραλία', # 希腊语
'समुद्र तट पर एक खूबसूरत सूर्यास्त', # 印地语
'Un bellissimo tramonto sulla spiaggia', # 意大利语
'浜辺に沈む美しい夕日', # 日语
'해변 위로 아름다운 일몰', # 韩语
]
# 公开图像 URL 或 PIL Image
image_urls = ['https://i.ibb.co/nQNGqL0/beach1.jpg', 'https://i.ibb.co/r5w8hG8/beach2.jpg']
# 编码文本和图像
text_embeddings = model.encode(sentences, normalize_embeddings=True)
image_embeddings = model.encode(
image_urls, normalize_embeddings=True
) # 也接受 PIL.Image.Image、本地文件名、dataURI
# 编码查询文本
query = 'beautiful sunset over the beach' # 英语
query_embeddings = model.encode(
query, prompt_name='retrieval.query', normalize_embeddings=True
)
</details>
<details> <summary>通过 <a href="https://huggingface.co/docs/transformers.js/en/index">transformers.js</a></summary>
[!注意] JinaCLIP 于 Transformers.js v3.1.0 添加,请确保使用兼容版本! 更多信息请参阅发布说明。
如果还没有安装,可以从 NPM 安装 Transformers.js JavaScript 库:
npm i @huggingface/transformers
示例: 使用 jinaai/jina-clip-v2 计算文本和/或图像嵌入:
import { AutoModel, AutoProcessor, RawImage, matmul } from "@huggingface/transformers";
// 加载处理器和模型
const model_id = "jinaai/jina-clip-v2";
const processor = await AutoProcessor.from_pretrained(model_id);
const model = await AutoModel.from_pretrained(model_id, { dtype: "q4" /* 例如 "fp16"、"q8" 或 "q4" */ });
// 准备输入
const urls = ["https://i.ibb.co/nQNGqL0/beach1.jpg", "https://i.ibb.co/r5w8hG8/beach2.jpg"];
const images = await Promise.all(urls.map(url => RawImage.read(url)));
const sentences = [
"غروب جميل على الشاطئ", // 阿拉伯语
"海滩上美丽的日落", // 中文
"Un beau coucher de soleil sur la plage", // 法语
"Ein wunderschöner Sonnenuntergang am Strand", // 德语
"Ένα όμορφο ηλιοβασίλεμα πάνω από την παραλία", // 希腊语
"समुद्र तट पर एक खूबसूरत सूर्यास्त", // 印地语
"Un bellissimo tramonto sulla spiaggia", // 意大利语
"浜辺に沈む美しい夕日", // 日语
"해변 위로 아름다운 일몰", // 韩语
];
// 编码文本和图像
const inputs = await processor(sentences, images, { padding: true, truncation: true });
const { l2norm_text_embeddings, l2norm_image_embeddings } = await model(inputs);
// 编码查询(仅文本)
const query_prefix = "Represent the query for retrieving evidence documents: ";
const query_inputs = await processor(query_prefix + "beautiful sunset over the beach");
const { l2norm_text_embeddings: query_embeddings } = await model(query_inputs);
// 计算文本-图像相似度分数
const text_to_image_scores = await matmul(query_embeddings, l2norm_image_embeddings.transpose(1, 0));
console.log("text-image similarity scores", text_to_image_scores.tolist()[0]); // [0.29530206322669983, 0.3183615803718567]
// 计算图像-图像相似度分数
const image_to_image_score = await matmul(l2norm_image_embeddings[0], l2norm_image_embeddings[1]);
console.log("image-image similarity score", image_to_image_score.item()); // 0.9344457387924194
// 计算文本-文本相似度分数
const text_to_text_scores = await matmul(query_embeddings, l2norm_text_embeddings.transpose(1, 0));
console.log("text-text similarity scores", text_to_text_scores.tolist()[0]); // [0.5566609501838684, 0.7028406858444214, 0.582255482673645, 0.6648036241531372, 0.5462006330490112, 0.6791588068008423, 0.6192430257797241, 0.6258729100227356, 0.6453716158866882]
</details>
<details> <summary>通过 <a href="https://onnxruntime.ai/">ONNX Runtime</a></summary>
# !pip install transformers onnxruntime pillow
import onnxruntime as ort
from transformers import AutoImageProcessor, AutoTokenizer
# 使用 transformers 加载分词器和图像处理器
tokenizer = AutoTokenizer.from_pretrained('jinaai/jina-clip-v2', trust_remote_code=True)
image_processor = AutoImageProcessor.from_pretrained(
'jinaai/jina-clip-v2', trust_remote_code=True
)
# 语料库
sentences = [
'غروب جميل على الشاطئ', # 阿拉伯语
'海滩上美丽的日落', # 中文
'Un beau coucher de soleil sur la plage', # 法语
'Ein wunderschöner Sonnenuntergang am Strand', # 德语
'Ένα όμορφο ηλιοβασίλεμα πάνω από την παραλία', # 希腊语
'समुद्र तट पर एक खूबसूरत सूर्यास्त', # 印地语
'Un bellissimo tramonto sulla spiaggia', # 意大利语
'浜辺に沈む美しい夕日', # 日语
'해변 위로 아름다운 일몰', # 韩语
]
# 公开图像 URL 或 PIL Image
image_urls = ['https://i.ibb.co/nQNGqL0/beach1.jpg', 'https://i.ibb.co/r5w8hG8/beach2.jpg']
# 对输入文本进行分词并转换输入图像
input_ids = tokenizer(sentences, return_tensors='np')['input_ids']
pixel_values = image_processor(image_urls)['pixel_values']
# 启动 ONNX Runtime 会话
session = ort.InferenceSession('jina-clip-v2/onnx/model.onnx')
# 运行推理
output = session.run(None, {'input_ids': input_ids, 'pixel_values': pixel_values})
# 保留归一化的嵌入,前两个输出是非归一化的
_, _, text_embeddings, image_embeddings = output
</details>
许可证
本模型根据 CC BY-NC 4.0 许可证下载和使用。可通过 Jina Embeddings API、AWS、Azure 和 GCP 商业使用。如需商业下载,请联系我们。
联系方式
加入我们的 Discord 社区,与其他社区成员交流想法。
引用
如果您在研究中发现 jina-clip-v2 有用,请引用以下论文:
@misc{koukounas2024jinaclipv2multilingualmultimodalembeddings,
title={jina-clip-v2: Multilingual Multimodal Embeddings for Text and Images},
author={Andreas Koukounas and Georgios Mastrapas and Bo Wang and Mohammad Kalim Akram and Sedigheh Eslami and Michael Günther and Isabelle Mohr and Saba Sturua and Scott Martens and Nan Wang and Han Xiao},
year={2024},
eprint={2412.08802},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2412.08802},
}
jinaai/jina-clip-v2
作者 jinaai
创建时间: 2024-10-08 14:34:45+00:00
更新时间: 2025-04-28 09:08:11+00:00
在 Hugging Face 上查看