2025-05-17 jina-embeddings-v3模型介绍

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

特点

  • 扩展序列程度:使用RoPE支持高达8192令牌

  • 特定任务的嵌入:通过  task  参数自定义嵌入

    •  retrieval.query :用于非对称检索任务中的查询嵌入

    •  retrieval.passage :用于非对称检索任务中的段落嵌入

    •  separation :用于聚类和重新排序应用程序中的嵌入

    •  classification :用于分类任务中的嵌入

    •  text-matching :用于量化两个文本之间相似性的任务中的嵌入,例如STS或对称检索任务

  • Matryoshka 嵌入向量:支持灵活的嵌入向量大小(  32, 64, 128, 256, 512, 768, 1024  ),允许截断嵌入向量以适应应用程序

用法

在集成模型时应用均值汇聚

为什么用 Mean Pooling

均值汇聚从模型的输出中获取所有标记嵌入,并在句子或段落级别对他们进行平均。这种方法已被证明可以产生高质量的句子嵌入。

现有 encode 函数,自动处理这个问题。如果直接在 encode 函数之外使用模型,需要手动应用均值池化。



from transformers import AutoModel

# Initialize the model
model = AutoModel.from_pretrained("jinaai/jina-embeddings-v3", trust_remote_code=True)

texts = [
    "Follow the white rabbit.",  # English
    "Sigue al conejo blanco.",  # Spanish
    "Suis le lapin blanc.",  # French
    "跟着白兔走。",  # Chinese
    "اتبع الأرنب الأبيض.",  # Arabic
    "Folge dem weißen Kaninchen.",  # German
]

# When calling the `encode` function, you can choose a `task` based on the use case:
# 'retrieval.query', 'retrieval.passage', 'separation', 'classification', 'text-matching'
# Alternatively, you can choose not to pass a `task`, and no specific LoRA adapter will be used.
embeddings = model.encode(texts, task="text-matching")

# Compute similarities
print(embeddings[0] @ embeddings[1].T)

上述代码使用了 transformers 库和 jinaai/jina-embeddings-v3 模型生成文本句子的嵌入向量(embedding)常用于语义搜索、文本相似度比较或下游NLP任务。

整体流程梳理:
  1. 加载模型和分词器

  2. 对句子进行编码

  3. 通过模型向前传播生成输出

  4. 使用平均池化(mean pooling)+ 掩码(mask)聚合token embeddings

  5. L2 归一化 得到最终的句向量

 代码详细分析: 
  •  mean_pooling(model_output, attention_mask) 对 Transformer 输出的 token 级嵌入进行平均池化(考虑 attention_mask 避免 padding token 干扰)



token_embeddings = model_output[0]  # shape: (batch_size, seq_len, hidden_dim)
input_mask_expanded = (
    attention_mask.unsqueeze(-1)               # shape: (batch_size, seq_len, 1)
    .expand(token_embeddings.size())           # shape: (batch_size, seq_len, hidden_dim)
    .float()
)
# 加权求和,再除以有效 token 的个数 => 得到句向量
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?"]
encoded_input = tokenizer(sentences, padding=True, truncation=True, return_tensors="pt")

将两个句子编码为 token IDs,自动添加 padding 和 truncation

 return_tensors="pt" 返回 PyTorch 张量格式

  • 加载 Jina Embedding 模型

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



这是一个多任务嵌入模型,可以根据不同的任务自动切换 adapter

 trust_remote_code=True 允许加载模型自定以逻辑

  • 指定任务  retrieval.query 

task = 'retrieval.query'
task_id = model._adaptation_map[task]
adapter_mask = torch.full((len(sentences),), task_id, dtype=torch.int32)



 adapter_mask 是这个模型自定以的任务切换机制

每个句子打上该任务的ID标签,使模型使用对应的 adapter

  • 模型向前传播



with torch.no_grad():
    model_output = model(**encoded_input, adapter_mask=adapter_mask)



不计算梯度,节省显存

模型返回的第一个输出通常是 last_hidden_state 

  • Mean Pooling + L2 Normalization



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



 mean_pooling :从 token 级转成句级向量

 F.normalize :对每个向量做 L2 归一化,使得后续计算余弦相似度变得合理

 jina-embeddings-v3 是一个 multi-adapter embedding model,支持多种下游任务(如检索、分类、对话等)每种任务使用不同的 adapter。

这相当于一次加载多个任务专家模块,在保持基础语言理解能力的同时微调适配不同目标任务,无需每个任务单独 finetune 整个模型。

其他情况

默认情况下,该模型支持的最大序列长度为8192个令牌。但是,如果要将输入文本截断为更短的长度,则可以将 max_length 参数传递给  encode 函数:



embeddings = model.encode(["Very long ... document"], max_length=2048)

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



embeddings = model.encode(['Sample text'], truncate_dim=256)



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



pip install sentence-transformers

from sentence_transformers import SentenceTransformer

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

task = "retrieval.query"
embeddings = model.encode(
    ["What is the weather like in Berlin today?"],
    task=task,
    prompt_name=task,
)



可以使用 SentenceTransformers 微调  jina-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 适配器

ONNX inference. ONNX 推理

可以使用ONNX通过  jina-embeddings-v3  进行高效推理



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

# Mean pool function
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

# Load tokenizer and model config
tokenizer = AutoTokenizer.from_pretrained('jinaai/jina-embeddings-v3')
config = PretrainedConfig.from_pretrained('jinaai/jina-embeddings-v3')

# Tokenize input
input_text = tokenizer('sample text', return_tensors='np')

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

# Prepare inputs for ONNX model
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
}

# Run model
outputs = session.run(None, inputs)[0]

# Apply mean pooling and normalization to the model outputs
embeddings = mean_pooling(outputs, input_text["attention_mask"])
embeddings = embeddings / np.linalg.norm(embeddings, ord=2, axis=1, keepdims=True)

<think>好的,用户想了解如何在本地使用Jina Embeddings v3。首先我需要确认用户的需求是什么。Jina Embeddings v3是一个文本嵌入模型,可能用户需要在自己的环境中部署这个模型,而不是通过API调用。用户可能关心的是本地安装步骤、依赖项、代码示例以及可能遇到的问题。 首先,我应该回忆一下Jina Embeddings的相关信息。Jina Embeddings v3应该托管在Hugging Face的模型库中,所以本地使用需要用到transformers库。需要确认是否支持本地加载,以及是否需要登录Hugging Face账户或者申请权限。 然后,安装步骤方面,用户需要安装PyTorch和transformers库。可能需要先安装PyTorch,根据用户的CUDA版本选择合适的安装命令。接着通过pip安装transformers和sentence-transformers,后者可能用于更简便的接口。 然后,代码示例部分。用户可能需要加载模型和分词器,使用from_pretrained方法,并可能需要指定本地路径或者模型名称。需要注意模型名称是否正确,比如是否是“jinaai/jina-embeddings-v3-small”之类的名称。还要考虑是否需要设置trust_remote_code参数,因为有些模型可能需要这个参数。 接下来,处理文本生成嵌入向量的步骤。需要演示如何对单个句子和多个句子进行编码,可能使用模型的encode方法或者直接调用模型。可能需要提到是否需要转换为PyTorch张量或NumPy数组。 另外,可能的应用场景,比如语义搜索、聚类等。用户可能需要了解如何计算相似度,比如使用余弦相似度。这里可能需要给出一个简单的示例,比如将两个句子编码后计算它们的相似度。 注意事项方面,模型的大小和硬件需求。比如,不同版本的v3模型可能有不同的参数量,如small、base、large,用户需要根据自己的GPU内存选择合适的模型。另外,可能需要提醒用户如果遇到下载问题,是否需要使用huggingface-cli登录或者设置镜像源。 还有可能的错误处理,比如模型无法加载时,检查网络连接,或者是否正确安装了依赖项。另外,内存不足的情况,可能需要建议用户减少批量大小或者使用CPU模式。 总结一下,回答的结构应该是:安装依赖、加载模型、生成嵌入、应用示例、注意事项。需要确保代码示例正确,特别是模型名称和参数设置是否正确。同时用中文清晰说明每个步骤,帮助用户逐步解决问题。</think>以下是如何在本地使用**Jina Embeddings v3**的逐步指南: --- ### 1. **安装依赖** 首先确保已安装Python(建议3.8+版本)和以下库: ```bash pip install torch transformers sentence-transformers ``` --- ### 2. **下载并加载模型** Jina Embeddings v3托管在Hugging Face Model Hub,本地加载方式如下: ```python from transformers import AutoModel, AutoTokenizer # 选择模型版本(如small/base/large) model_name = "jinaai/jina-embeddings-v3-small" # 加载模型和分词器 tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModel.from_pretrained(model_name, trust_remote_code=True) ``` --- ### 3. **生成文本嵌入** 使用以下代码将文本转换为向量: ```python text = "这是一个示例句子。" # 编码文本 inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) embeddings = model(**inputs).last_hidden_state.mean(dim=1).detach().numpy() print(embeddings.shape) # 输出向量维度,如(1, 768) ``` --- ### 4. **批量处理与相似度计算** 对于多文本或相似度比对: ```python from sentence_transformers.util import cos_sim texts = ["句子1", "句子2"] # 批量编码 embeddings = model.encode(texts) # 计算余弦相似度 similarity = cos_sim(embeddings[0], embeddings[1]) print(f"相似度:{similarity.item():.2f}") ``` --- ### 5. **关键注意事项** - **模型选择**:根据需求选择不同规模: - `jinaai/jina-embeddings-v3-small`(轻量级) - `jinaai/jina-embeddings-v3-base`(平衡性能) - `jinaai/jina-embeddings-v3-large`(最高质量) - **硬件要求**: - Small版本可在CPU上运行,Large版本需要GPU(至少16GB显存)。 - **序列长度**:支持最长`8192` tokens的上下文。 - **离线模式**:可提前下载模型到本地路径,通过`from_pretrained("/本地路径")`加载。 --- ### 6. **典型应用场景** - **语义搜索**:匹配查询与文档的相关性 - **聚类分析**:对大规模文本分组 - **问答系统**:检索与问题最相关的答案 --- 遇到问题可检查: 1. 网络是否通畅(首次需下载模型) 2. `trust_remote_code=True`是否添加 3. 显存不足时尝试减小`batch_size`或在CPU运行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大油头儿

你的鼓励将是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值