ONNX 模型库
返回模型

说明文档

<br><br>

<p align="center"> <img src="https://huggingface.co/datasets/jinaai/documentation-images/resolve/main/logo.webp" alt="Jina AI: 您的搜索基础,超级赋能!" width="150px"> </p>

<p align="center"> <b>由 <a href="https://jina.ai/"><b>Jina AI</b></a> 训练的嵌入模型。</b> </p>

<p align="center"> <b>jina-embeddings-v3: 带有任务 LoRA 的多语言嵌入模型</b> </p>

快速开始

博客 | Azure | AWS SageMaker | API

预期用途与模型信息

jina-embeddings-v3 是一个多语言多任务文本嵌入模型,专为各种 NLP 应用设计。 基于 Jina-XLM-RoBERTa 架构, 该模型支持旋转位置嵌入,可处理长达 8192 个 token 的长输入序列。 此外,它还包含 5 个 LoRA 适配器,可高效生成任务特定的嵌入。

主要特性:

  • 扩展序列长度: 通过 RoPE 支持最多 8192 个 token。
  • 任务特定嵌入: 通过 task 参数自定义嵌入,可选以下选项:
    • retrieval.query:用于非对称检索任务中的查询嵌入
    • retrieval.passage:用于非对称检索任务中的段落嵌入
    • separation:用于聚类和重排序应用中的嵌入
    • classification:用于分类任务中的嵌入
    • text-matching:用于量化两个文本之间相似度的任务,如 STS 或对称检索任务
  • Matryoshka 嵌入:支持灵活的嵌入维度(32, 64, 128, 256, 512, 768, 1024),可截断嵌入以适应您的应用。

支持的语言:

虽然基础模型支持 100 种语言,但我们将调优工作重点放在以下 30 种语言上: 阿拉伯语、孟加拉语、汉语、丹麦语、荷兰语、英语、芬兰语、法语、格鲁吉亚语、德语、希腊语、 印地语、印度尼西亚语、意大利语、日语、韩语、拉脱维亚语、挪威语、波兰语、葡萄牙语、罗马尼亚语、 俄语、斯洛伐克语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语、乌尔都语越南语。

⚠️ 重要提示: 我们修复了 encode 函数中的一个 bug #60,该 bug 导致 Matryoshka 嵌入截断在归一化之后进行,从而产生非归一化的截断嵌入。此问题已在最新代码版本中解决。

如果您使用旧版本编码了数据并希望保持一致性,请在加载模型时使用特定代码版本:AutoModel.from_pretrained('jinaai/jina-embeddings-v3', code_revision='da863dd04a4e5dce6814c6625adfba87b83838aa', ...)

使用方法

<details><summary>集成模型时应用平均池化。</summary> <p>

为什么使用平均池化?

平均池化将模型输出的所有 token 嵌入汇总并在句子或段落级别求平均。 这种方法已被证明可以产生高质量的句子嵌入。

我们提供了一个 encode 函数,可自动为您处理此操作。

但是,如果您直接在模型外部使用模型, 则需要手动应用平均池化。以下是操作方法:

import torch
import torch.nn.functional as F
from transformers import AutoTokenizer, AutoModel


def mean_pooling(model_output, attention_mask):
    token_embeddings = model_output[0]
    input_mask_expanded = (
        attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
    )
    return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(
        input_mask_expanded.sum(1), min=1e-9
    )


sentences = ["How is the weather today?", "What is the current weather like today?"]

tokenizer = AutoTokenizer.from_pretrained("jinaai/jina-embeddings-v3")
model = AutoModel.from_pretrained("jinaai/jina-embeddings-v3", trust_remote_code=True)

encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")
task = 'retrieval.query'
task_id = model._adaptation_map[task]
adapter_mask = torch.full((len(sentences),), task_id, dtype=torch.int32)
with torch.no_grad():
    model_output = model(**encoded_input, adapter_mask=adapter_mask)

embeddings = mean_pooling(model_output, encoded_input["attention_mask"])
embeddings = F.normalize(embeddings, p=2, dim=1)

</p> </details>

开始使用 jina-embeddings-v3 最简单的方法是使用 Jina Embedding API

或者,您也可以通过 Transformers 包直接使用 jina-embeddings-v3

!pip install transformers torch einops
!pip install 'numpy<2'

如果您在支持 FlashAttention-2 的 GPU 上运行。到 2024.9.12,它支持 Ampere、Ada 或 Hopper GPU(如 A100、RTX 3090、RTX 4090、H100),

!pip install flash-attn --no-build-isolation
from transformers import AutoModel

# 初始化模型
model = AutoModel.from_pretrained("jinaai/jina-embeddings-v3", trust_remote_code=True)

texts = [
    "Follow the white rabbit.",  # 英语
    "Sigue al conejo blanco.",  # 西班牙语
    "Suis le lapin blanc.",  # 法语
    "跟着白兔走。",  # 中文
    "اتبع الأرنب الأبيض.",  # 阿拉伯语
    "Folge dem weißen Kaninchen.",  # 德语
]

# 调用 `encode` 函数时,您可以根据用例选择 `task`:
# 'retrieval.query', 'retrieval.passage', 'separation', 'classification', 'text-matching'
# 或者,您也可以不传递 `task`,这样将不会使用特定的 LoRA 适配器。
embeddings = model.encode(texts, task="text-matching")

# 计算相似度
print(embeddings[0] @ embeddings[1].T)

默认情况下,模型支持最大序列长度为 8192 个 token。 但是,如果您想将输入文本截断到较短的长度,可以向 encode 函数传递 max_length 参数:

embeddings = model.encode(["非常长的 ... 文档"], max_length=2048)

如果您想使用 Matryoshka 嵌入并切换到不同的维度, 可以通过向 encode 函数传递 truncate_dim 参数来调整:

embeddings = model.encode(['示例文本'], truncate_dim=256)

最新版本(3.1.0)的 SentenceTransformers 也支持 jina-embeddings-v3

!pip install -U sentence-transformers
from sentence_transformers import SentenceTransformer

model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True)

task = "retrieval.query"
embeddings = model.encode(
    ["今天柏林的天气怎么样?"],
    task=task,
    prompt_name=task,
)

您可以使用 SentenceTransformerTrainerjina-embeddings-v3 进行微调。 要为特定任务进行微调,您应该在将模型传递给 ST Trainer 之前设置任务,可以在初始化时设置:

model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True, model_kwargs={'default_task': 'classification'})

或者之后设置:

model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True)
model[0].default_task = 'classification'

这样您就可以为所选任务微调 LoRA 适配器。

但是,如果您想微调整个模型,请在加载模型时确保将主参数设置为可训练的:

model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True, model_kwargs={'lora_main_params_trainable': True})

这将允许您微调整个模型,而不仅仅是 LoRA 适配器。

<details><summary>ONNX 推理。</summary> <p>

您可以使用 ONNX 进行高效的 jina-embeddings-v3 推理:

import onnxruntime
import numpy as np
from transformers import AutoTokenizer, PretrainedConfig

# 平均池化函数
def mean_pooling(model_output: np.ndarray, attention_mask: np.ndarray):
    token_embeddings = model_output
    input_mask_expanded = np.expand_dims(attention_mask, axis=-1)
    input_mask_expanded = np.broadcast_to(input_mask_expanded, token_embeddings.shape)
    sum_embeddings = np.sum(token_embeddings * input_mask_expanded, axis=1)
    sum_mask = np.clip(np.sum(input_mask_expanded, axis=1), a_min=1e-9, a_max=None)
    return sum_embeddings / sum_mask

# 加载分词器和模型配置
tokenizer = AutoTokenizer.from_pretrained('jinaai/jina-embeddings-v3')
config = PretrainedConfig.from_pretrained('jinaai/jina-embeddings-v3')

# 对输入文本进行分词
input_text = tokenizer('sample text', return_tensors='np')

# ONNX 会话
model_path = 'jina-embeddings-v3/onnx/model.onnx'
session = onnxruntime.InferenceSession(model_path)

# 为 ONNX 模型准备输入
task_type = 'text-matching'
task_id = np.array(config.lora_adaptations.index(task_type), dtype=np.int64)
inputs = {
    'input_ids': input_text['input_ids'],
    'attention_mask': input_text['attention_mask'],
    'task_id': task_id
}

# 运行模型
outputs = session.run(None, inputs)[0]

# 对模型输出应用平均池化和归一化
embeddings = mean_pooling(outputs, input_text["attention_mask"])
embeddings = embeddings / np.linalg.norm(embeddings, ord=2, axis=1, keepdims=True)

</p> </details>

联系方式

加入我们的 Discord 社区,与其他社区成员交流想法。

许可证

jina-embeddings-v3 已列入 AWS 和 Azure。如果您需要在这些平台之外或在公司内部使用,请注意该模型采用 CC BY-NC 4.0 许可。如有商业使用咨询,请随时 联系我们

引用

如果您在研究中觉得 jina-embeddings-v3 有用,请引用以下论文:

@misc{sturua2024jinaembeddingsv3multilingualembeddingstask,
      title={jina-embeddings-v3: Multilingual Embeddings With Task LoRA}, 
      author={Saba Sturua and Isabelle Mohr and Mohammad Kalim Akram and Michael Günther and Bo Wang and Markus Krimmel and Feng Wang and Georgios Mastrapas and Andreas Koukounas and Andreas Koukounas and Nan Wang and Han Xiao},
      year={2024},
      eprint={2409.10173},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2409.10173}, 
}

jinaai/jina-embeddings-v3

作者 jinaai

feature-extraction transformers
↓ 3.6M ♥ 1.1K

创建时间: 2024-09-05 11:56:46+00:00

更新时间: 2025-02-24 07:06:37+00:00

在 Hugging Face 上查看

文件 (15)

.gitattributes
1_Pooling/config.json
README.md
config.json
config_sentence_transformers.json
custom_st.py
model.safetensors
modules.json
onnx/model.onnx ONNX
onnx/model.onnx_data
onnx/model_fp16.onnx ONNX
pytorch_model.bin
special_tokens_map.json
tokenizer.json
tokenizer_config.json