今天,我们发布了 Jina Reranker v2(jina-reranker-v2-base-multilingual),这是我们搜索底座系列中最新且性能最佳的神经重排模型。使用 Jina Reranker v2,RAG/搜索系统的开发者可以享受以下优势:
- 多语言:支持100+ 种语言的更相关搜索结果,性能优于
bge-reranker-v2-m3
; - 智能代理:为智能代理 RAG 提供最先进的函数调用和 text-to-SQL 感知文档重排;
- 代码检索:在代码检索任务上表现出色,以及
- 超快速度:文档处理吞吐量比
bge-reranker-v2-m3
快 15 倍,比 jina-reranker-v1-base-en 快 6 倍。
您可以通过我们的 Reranker API 开始使用 Jina Reranker v2,我们为所有新用户提供 100 万个免费 token。
在本文中,我们将详细介绍 Jina Reranker v2 支持的这些新特性,展示我们的重排模型与其他最先进模型(包括 Jina Reranker v1)的性能对比,并解释使 Jina Reranker v2 在任务准确性和文档吞吐量方面达到顶级性能的训练过程。
tag回顾:为什么需要重排器
虽然嵌入模型是搜索底座中使用最广泛和最容易理解的组件,但它们通常为了检索速度而牺牲了精确性。基于嵌入的搜索模型通常是双编码器模型,每个文档都被嵌入并存储,然后查询也被嵌入,检索则基于查询嵌入与文档嵌入之间的相似度。在这个模型中,用户查询和匹配文档之间的许多 token 级别的交互细节都丢失了,因为原始查询和文档永远无法"看到"对方 - 只有它们的嵌入可以。这可能会影响检索准确性 - 而这正是交叉编码器重排模型擅长的领域。
重排器通过采用交叉编码器架构解决了这种细粒度语义缺失的问题,查询-文档对一起编码以产生相关性分数,而不是嵌入。研究表明,对于大多数 RAG 系统,使用重排器模型可以改善语义基础并减少幻觉。
tagJina Reranker v2 的多语言支持
在过去,Jina Reranker v1 通过在四个关键英语基准测试中取得最先进的性能而脱颖而出。今天,我们在 Jina Reranker v2 中显著扩展了重排能力,为超过 100 种语言和跨语言任务提供支持!
为了评估 Jina Reranker v2 的跨语言和英语能力,我们将其性能与类似的重排模型进行比较,使用以下三个基准:
MKQA:多语言知识问答
这个数据集包含 26 种语言的问题和答案,源自真实世界的知识库,旨在评估问答系统的跨语言性能。MKQA 包含英语查询及其对非英语语言的人工翻译,以及包括英语在内的多种语言的答案。
在下图中,我们报告了每个重排器的 recall@10 分数,包括作为基线的"密集检索器",执行传统的基于嵌入的搜索:
BEIR:多样化 IR 任务异构基准
这个开源仓库包含了多种语言的检索基准,但我们仅关注英语任务。这些包括 17 个数据集,没有任何训练数据,这些数据集的重点是评估神经或词法检索器的检索准确性。
在下图中,我们报告了每个重排器在 BEIR 上的 NDCG@10 分数。BEIR 的结果清楚地表明,jina-reranker-v2-base-multilingual 新引入的多语言能力并没有影响其英语检索能力,而且比 jina-reranker-v1-base-en 有显著提升。
AirBench:自动化异构 IR 基准
我们与北京智源人工智能研究院(BAAI)联合创建并发布了用于 RAG 系统的 AirBench 基准测试。这个基准测试使用自动生成的合成数据用于自定义领域和任务,不公开发布真实标准答案,这样被测试的模型就没有机会过拟合数据集。
在撰写本文时,jina-reranker-v2-base-multilingual 在所有重排序模型中表现最佳,在排行榜上位居第一。
tag工具代理回顾:教 LLM 使用工具
自从几年前 AI 大潮开始以来,人们发现 AI 模型在计算机本应擅长的任务上表现不佳。例如,看看这个与 Mistral-7b-Instruct-v0.1 的对话:
乍看之下似乎没问题,但实际上 203 乘以 7724 等于1,567,972。
为什么 LLM 的结果错得超过十倍?这是因为 LLM 并不是为了进行数学运算或其他类型的推理而训练的,而且缺乏内部递归几乎注定了它们无法解决复杂的数学问题。它们被训练来表达或执行一些本质上不需要精确的任务。
然而,LLM 很乐意编造答案。从它的角度来看,15,824,772 是 204 × 7,724 的一个完全合理的答案。只不过这个答案完全错误。
Agentic RAG 改变了生成式 LLM 的角色,让它们从不擅长的事情(思考和知道事物)转向擅长的事情:阅读理解和将信息综合成自然语言。RAG 不是直接生成答案,而是在其可访问的数据源中找到与你的请求相关的信息,并将其呈现给语言模型。它的任务不是为你编造答案,而是以自然和响应的形式呈现由其他系统找到的答案。
我们已经训练 Jina Reranker v2 对 SQL 数据库架构和函数调用敏感。这需要与传统文本检索不同的语义。它必须具备任务和代码感知能力,我们已经专门为这个功能训练了我们的重排序器。
tagJina Reranker v2 在结构化数据查询中的应用
虽然嵌入和重排序模型已经将非结构化数据视为一等公民,但大多数模型对结构化表格数据的支持仍然不足。
Jina Reranker v2 理解查询结构化数据库(如 MySQL 或 MongoDB)的下游意图,并根据输入查询为结构化表格架构分配正确的相关性分数。
如下所示,重排序器在 LLM 被提示从自然语言查询生成 SQL 查询之前,检索最相关的表格:
我们使用 NSText2SQL 数据集基准评估了查询感知能力。我们从原始数据集的"instruction"列中提取用自然语言编写的指令和相应的表格架构。
下图对比了不同重排序模型在为自然语言查询对应的表格架构排序时的成功程度,使用recall@3指标:
tagJina Reranker v2 在函数调用中的应用
就像查询 SQL 表一样,你可以使用 agentic RAG 调用外部工具。考虑到这一点,我们将函数调用集成到了 Jina Reranker v2 中,使其能够理解你对外部函数的意图,并相应地为函数规范分配相关性分数。
下面的示意图(通过一个例子)解释了 LLM 如何使用重排序器来改进函数调用能力,并最终提升 agentic AI 的用户体验。
我们使用 ToolBench 基准测试评估了函数感知能力。该基准测试收集了超过 16,000 个公共 API 和相应的合成生成指令,用于单一和多 API 场景。
以下是与其他重排序模型相比的结果(recall@3 指标):
正如我们将在后面章节展示的,jina-reranker-v2-base-multilingual 几乎达到最优性能的同时,其模型大小只有 bge-reranker-v2-m3
的一半,速度快了近 15 倍。
tagJina Reranker v2 在代码检索中的表现
Jina Reranker v2 除了在函数调用和结构化数据查询方面经过训练外,相比同等规模的竞争模型,在代码检索方面也有所改进。我们使用 CodeSearchNet 基准测试评估了其代码检索能力。该基准测试结合了 docstring 格式和自然语言格式的查询,并标注了与查询相关的代码段。
以下是与其他重排序模型相比的 MRR@10 结果:
tagJina Reranker v2 的超快推理速度
虽然交叉编码器式神经重排序器在预测检索文档相关性方面表现出色,但它们的推理速度比嵌入模型要慢。具体来说,在大多数向量数据库中,逐一比较查询与 n 个文档的速度远慢于 HNSW 或其他快速检索方法。我们通过 Jina Reranker v2 解决了这个速度问题。
- 我们独特的训练见解(将在下一节描述)使我们的模型仅用 278M 参数就达到了最先进的准确性表现。相比之下,
bge-reranker-v2-m3
有 567M 参数,Jina Reranker v2 的大小仅为其一半。这种减少是提高吞吐量(每 50ms 处理的文档数)的第一个原因。 - 即使在相似的模型大小下,Jina Reranker v2 的吞吐量也比我们之前的英文版最先进的 Jina Reranker v1 模型高6 倍。这是因为我们在 Jina Reranker v2 中实现了 Flash Attention 2,它在基于 transformer 的模型的注意力层中引入了内存和计算优化。
你可以从下图看到上述步骤在 Jina Reranker v2 吞吐量性能方面的成果:
tag我们如何训练 Jina Reranker v2
我们通过四个阶段训练 jina-reranker-v2-base-multilingual:
- 英文数据准备:我们仅使用英语数据训练骨干模型,准备了第一个版本,包括配对数据(对比训练)或三元组(查询、正确响应、错误响应)、查询-函数模式配对和查询-表模式配对。
- 添加跨语言数据:在下一阶段,我们添加了跨语言配对和三元组数据集,专门改进骨干模型在检索任务上的多语言能力。
- 添加所有多语言数据:在这个阶段,我们主要专注于确保模型能看到最大量的数据。我们使用来自 100 多种低资源和高资源语言的所有配对和三元组数据集对第二阶段的模型检查点进行微调。
- 使用挖掘的困难负样本进行微调:在观察第三阶段的重排序性能后,我们通过添加更多三元组数据进行微调,特别是为现有查询添加更多困难负样本的例子——那些表面上看起来与查询相关,但实际上是错误的响应。
这种四阶段训练方法基于这样的见解:在训练过程中尽早包含函数和表格模式,使模型能特别意识到这些用例,并学会更关注候选文档的语义而不是语言构造。
tagJina Reranker v2 的实践应用
tag通过我们的重排序 API
使用 Jina Reranker v2 最快速和简单的方式是使用 Jina Reranker 的 API。
前往该页面的 API 部分,使用您选择的编程语言集成 jina-reranker-v2-base-multilingual。
示例 1:函数调用排序
要对最相关的外部函数/工具进行排序,请按如下所示格式化查询和文档(函数模式):
您应该得到:
{
"model": "jina-reranker-v2-base-multilingual",
"usage": {
"total_tokens": 383,
"prompt_tokens": 383
},
"results": [
{
"index": 2,
"document": {
"text": "{'Name': 'calculateCarbonFootprint', 'Specification': 'Estimates the carbon footprint for various activities, including transportation', 'spec': 'https://www.carboninterface.com/api/v1/estimates', 'example': '{type: vehicle, distance: distance, vehicle_model_id: car}'}"
},
"relevance_score": 0.5422876477241516
},
{
"index": 1,
"document": {
"text": "{'Name': 'calculateDistance', 'Specification': 'Calculates the driving distance and time between multiple locations', 'spec': 'https://maps.googleapis.com/maps/api/distancematrix/json?origins={startCity}&destinations={endCity}&key={API_KEY}', 'example': 'https://maps.googleapis.com/maps/api/distancematrix/json?origins=Berlin&destinations=Munich&key=YOUR_API_KEY'}"
},
"relevance_score": 0.23283305764198303
},
{
"index": 0,
"document": {
"text": "{'Name': 'getWeather', 'Specification': 'Provides current weather information for a specified city', 'spec': 'https://api.openweathermap.org/data/2.5/weather?q={city}&appid={API_KEY}', 'example': 'https://api.openweathermap.org/data/2.5/weather?q=Berlin&appid=YOUR_API_KEY'}"
},
"relevance_score": 0.05033063143491745
}
]
}
示例 2:对 SQL 查询进行排序
同样,要为您的查询获取结构化表模式的相关性得分,您可以使用以下示例 API 调用:
curl -X 'POST' \
'https://api.jina.ai/v1/rerank' \
-H 'accept: application/json' \
-H 'Authorization: Bearer <YOUR JINA AI TOKEN HERE>' \
-H 'Content-Type: application/json' \
-d '{
"model": "jina-reranker-v2-base-multilingual",
"query": "which customers bought a summer outfit in the past 7 days?",
"documents": [
"CREATE TABLE customer_personal_info (customer_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50));",
"CREATE TABLE supplier_company_info (supplier_id INT PRIMARY KEY, company_name VARCHAR(100), contact_name VARCHAR(50));",
"CREATE TABLE transactions (transaction_id INT PRIMARY KEY, customer_id INT, purchase_date DATE, FOREIGN KEY (customer_id) REFERENCES customer_personal_info(customer_id), product_id INT, FOREIGN KEY (product_id) REFERENCES products(product_id));",
"CREATE TABLE products (product_id INT PRIMARY KEY, product_name VARCHAR(100), season VARCHAR(50), supplier_id INT, FOREIGN KEY (supplier_id) REFERENCES supplier_company_info(supplier_id));"
]
}'
预期的响应是:
{
"model": "jina-reranker-v2-base-multilingual",
"usage": {
"total_tokens": 253,
"prompt_tokens": 253
},
"results": [
{
"index": 2,
"document": {
"text": "CREATE TABLE transactions (transaction_id INT PRIMARY KEY, customer_id INT, purchase_date DATE, FOREIGN KEY (customer_id) REFERENCES customer_personal_info(customer_id), product_id INT, FOREIGN KEY (product_id) REFERENCES products(product_id));"
},
"relevance_score": 0.2789437472820282
},
{
"index": 0,
"document": {
"text": "CREATE TABLE customer_personal_info (customer_id INT PRIMARY KEY, first_name VARCHAR(50), last_name VARCHAR(50));"
},
"relevance_score": 0.06477169692516327
},
{
"index": 3,
"document": {
"text": "CREATE TABLE products (product_id INT PRIMARY KEY, product_name VARCHAR(100), season VARCHAR(50), supplier_id INT, FOREIGN KEY (supplier_id) REFERENCES supplier_company_info(supplier_id));"
},
"relevance_score": 0.027742892503738403
},
{
"index": 1,
"document": {
"text": "CREATE TABLE supplier_company_info (supplier_id INT PRIMARY KEY, company_name VARCHAR(100), contact_name VARCHAR(50));"
},
"relevance_score": 0.025516605004668236
}
]
}
tag通过 RAG/LLM 框架
使用模型名称 jina-reranker-v2-base-multilingual,Jina Reranker 已有的 LLM 和 RAG 编排框架集成应该可以直接使用。参考各自的文档页面以了解更多关于如何在您的应用中集成 Jina Reranker v2 的信息。
- Haystack by deepset:Jina Reranker v2 可以通过 Haystack 中的 JinaRanker 类使用:
from haystack import Document
from haystack_integrations.components.rankers.jina import JinaRanker
docs = [Document(content="Paris"), Document(content="Berlin")]
ranker = JinaRanker(model="jina-reranker-v2-base-multilingual", api_key="<YOUR JINA AI API KEY HERE>")
ranker.run(query="City in France", documents=docs, top_k=1)
- LlamaIndex:Jina Reranker v2 可以作为 JinaRerank 节点后处理器模块使用,通过初始化:
import os
from llama_index.postprocessor.jinaai_rerank import JinaRerank
jina_rerank = JinaRerank(model="jina-reranker-v2-base-multilingual", api_key="<YOUR JINA AI API KEY HERE>", top_n=1)
- Langchain:使用 Jina Rerank 集成在您现有的应用程序中使用 Jina Reranker 2。JinaRerank 模块应该使用正确的模型名称进行初始化:
from langchain_community.document_compressors import JinaRerank
reranker = JinaRerank(model="jina-reranker-v2-base-multilingual", jina_api_key="<YOUR JINA AI API KEY HERE>")
tag通过 HuggingFace
我们还在 Hugging Face 上开放了(在 CC-BY-NC-4.0 许可下)jina-reranker-v2-base-multilingual 模型的访问权限,用于研究和评估目的。
要从 Hugging Face 下载并运行模型,请安装 transformers
和 einops
库:
pip install transformers einops
pip install ninja
pip install flash-attn --no-build-isolation
使用您的 Hugging Face 访问令牌通过 Hugging Face CLI 登录您的 Hugging Face 账户:
huggingface-cli login --token <"HF-Access-Token">
下载预训练模型:
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained(
'jinaai/jina-reranker-v2-base-multilingual',
torch_dtype="auto",
trust_remote_code=True,
)
model.to('cuda') # 如果没有 GPU 可用,则使用 'cpu'
model.eval()
定义查询和要重新排序的文档:
query = "Organic skincare products for sensitive skin"
documents = [
"Organic skincare for sensitive skin with aloe vera and chamomile.",
"New makeup trends focus on bold colors and innovative techniques",
"Bio-Hautpflege für empfindliche Haut mit Aloe Vera und Kamille",
"Neue Make-up-Trends setzen auf kräftige Farben und innovative Techniken",
"Cuidado de la piel orgánico para piel sensible con aloe vera y manzanilla",
"Las nuevas tendencias de maquillaje se centran en colores vivos y técnicas innovadoras",
"针对敏感肌专门设计的天然有机护肤产品",
"新的化妆趋势注重鲜艳的颜色和创新的技巧",
"敏感肌のために特別に設計された天然有機スキンケア製品",
"新しいメイクのトレンドは鮮やかな色と革新的な技術に焦点を当てています",
]
构造句子对并计算相关性得分:
sentence_pairs = [[query, doc] for doc in documents]
scores = model.compute_score(sentence_pairs, max_length=1024)
得分将是一个浮点数列表,其中每个浮点数代表相应文档与查询的相关性得分。得分越高表示相关性越高。
或者,使用 rerank
函数通过基于 max_query_length
自动分块查询和文档来对大型文本进行重新排序
max_length
。每个块都会被单独打分,然后将每个块的分数合并来生成最终的重排结果:results = model.rerank(
query,
documents,
max_query_length=512,
max_length=1024,
top_n=3
)
该函数不仅返回每个文档的相关性分数,还会返回它们的内容和在原始文档列表中的位置。
tag通过私有云部署
Jina Reranker v2 在 AWS 和 Azure 账户上进行私有部署的预构建包很快就能在我们的 AWS Marketplace 和 Azure Marketplace 销售页面上找到。
tagJina Reranker v2 的主要特点
Jina Reranker v2 代表了搜索底座能力的重要扩展:
- 使用 cross-encoding 的最先进检索功能开启了广泛的新应用领域。
- 增强的多语言和跨语言功能消除了用例中的语言障碍。
- 对 function calling 的一流支持,以及对结构化数据查询的感知能力,将您的智能体 RAG 能力提升到更高的精确度水平。
- 更好地检索计算机代码和计算机格式化数据,能够远超纯文本信息检索的范畴。
- 更快的文档处理能力确保无论使用何种检索方法,您现在都可以更快地重排更多检索到的文档,并将大部分细粒度相关性计算工作交给 jina-reranker-v2-base-multilingual。
有了 Reranker v2,RAG 系统变得更加精确,帮助您现有的信息管理解决方案产生更多更好的可执行结果。跨语言支持使这些功能直接可用于跨国和多语言企业,并提供了易用的 API 和实惠的价格。
通过使用源自真实用例的基准测试进行测试,您可以亲自体验 Jina Reranker v2 如何在一个 AI 模型中保持与实际业务模型相关任务的最先进性能,从而降低成本并简化您的技术栈。