jina-embeddings-v3
简介
jina-embeddings-v3: Multilingual Embeddings With Task LoRA
模型卡片
模型配置
模型详情
已翻译由 Jina AI 训练的 embedding 模型。
jina-embeddings-v3:基于 Task LoRA 的多语言 Embedding 模型
快速开始
博客 | Azure | AWS SageMaker | API
预期用途与模型信息
jina-embeddings-v3 是一个多语言多任务文本 embedding 模型,专为多种 NLP 应用设计。
基于 Jina-XLM-RoBERTa 架构,
该模型支持旋转位置编码(Rotary Position Embeddings),可处理长达 8192 个 token 的输入序列。
此外,它配备了 5 个 LoRA 适配器,能够高效生成特定任务的 embedding。
主要特性:
- 扩展序列长度: 通过 RoPE 支持最长 8192 个 token。
- 任务特定 Embedding: 通过
task参数自定义 embedding,可选以下选项:retrieval.query:用于非对称检索任务中的查询 embeddingretrieval.passage:用于非对称检索任务中的段落 embeddingseparation:用于聚类和重排序应用中的 embeddingclassification:用于分类任务中的 embeddingtext-matching:用于衡量两段文本相似度的任务(如 STS 或对称检索任务)中的 embedding
- Matryoshka Embeddings: 支持灵活的 embedding 尺寸(
32, 64, 128, 256, 512, 768, 1024),允许截断 embedding 以适应您的应用。
支持的语言:
虽然基础模型支持 100 种语言,但我们将调优工作集中在以下 30 种语言上:
阿拉伯语、孟加拉语、中文、丹麦语、荷兰语、英语、芬兰语、法语、格鲁吉亚语、德语、希腊语、
印地语、印度尼西亚语、意大利语、日语、韩语、拉脱维亚语、挪威语、波兰语、葡萄牙语、罗马尼亚语、
俄语、斯洛伐克语、西班牙语、瑞典语、泰语、土耳其语、乌克兰语、乌尔都语 和 越南语。
⚠️ 重要提示:
我们修复了encode函数中的一个 bug #60,该 bug 导致 Matryoshka embedding 截断 在归一化 之后 进行,从而产生未归一化的截断 embedding。此问题已在最新代码修订版中解决。如果您使用旧版本编码了数据并希望保持一致性,请在加载模型时使用特定的代码修订版:
AutoModel.from_pretrained('jinaai/jina-embeddings-v3', code_revision='da863dd04a4e5dce6814c6625adfba87b83838aa', ...)
使用方法
集成模型时应用均值池化(mean pooling)。
为什么使用均值池化?
均值池化会取模型输出的所有 token embedding,并在句子或段落级别进行平均。
这种方法已被证明能产生高质量的句子 embedding。
我们提供了一个 encode 函数,可以自动为您处理这一操作。
然而,如果您直接在 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)
开始使用 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
# 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)
默认情况下,模型支持最大序列长度为 8192 个 token。
然而,如果您希望将输入文本截断到更短的长度,可以将 max_length 参数传递给 encode 函数:
embeddings = model.encode(["Very long ... document"], max_length=2048)
如果您想使用 Matryoshka embeddings 并切换到不同的维度,
可以通过将 truncate_dim 参数传递给 encode 函数来调整:
embeddings = model.encode(['Sample text'], 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(
["What is the weather like in Berlin today?"],
task=task,
prompt_name=task,
)
您可以使用 SentenceTransformerTrainer 对 jina-embeddings-v3 进行微调。
要为特定任务进行微调,您应在将模型传递给 ST Trainer 之前设置任务,可以在初始化时进行:
model = SentenceTransformer("jinaai/jina-embeddings-v3", trust_remote_code=True, model_kwargs={'default_task': 'classification'})
或者在之后进行:
正在翻译中,请稍候...
标签
操作
详细信息
- 厂商
- jinaai
- 任务
- feature-extraction
- 框架
- transformers
- 许可(HF)
- cc-by-nc-4.0
- 语言
- multilingual, af, am, ar, as, az, be, bg, bn, br, bs, ca, cs, cy, da, de, el, en, eo, es, et, eu, fa, fi, fr, fy, ga, gd, gl, gu, ha, he, hi, hr, hu, hy, id, is, it, ja, jv, ka, kk, km, kn, ko, ku, ky, la, lo, lt, lv, mg, mk, ml, mn, mr, ms, my, ne, nl, no, om, or, pa, pl, ps, pt, ro, ru, sa, sd, si, sk, sl, so, sq, sr, su, sv, sw, ta, te, th, tl, tr, ug, uk, ur, uz, vi, xh, yi, zh