虽然像 bi-encoder 模型(例如 Jina Embeddings)可以从预先计算的嵌入数据库中快速检索到许多匹配文档,但重排序模型可以通过使用较慢但更精确的方法对用户的查询和检索到的文档进行交叉编码来细化这个集合。Jina AI 已经发布了我们的第一个重排序模型,jina-reranker-v1-base-en。在本文中,我们将深入探讨为什么重排序器对于优化 RAG 准确性至关重要,以及如何使用 Jina Embeddings/Reranker、LlamaIndex 和 Mixtral-8x7B-Instruct-v0.1 语言模型(托管在 HuggingFace 上)来构建一个最先进的 RAG 系统。
你需要:

由于 Jina Embeddings、Reranker 模型以及 Mixtral 都是远程运行并通过 RESTful API 访问的,你不需要任何特殊的硬件。
tag什么是重排序器?
在继续教程之前,重要的是要首先了解重排序器是什么。为了全面理解重排序器的概念以及为什么 Jina Reranker V1 是你的最佳选择,我们建议你在继续之前阅读我们的 Jina Reranker V1 发布文章。

简而言之,重排序器是交叉编码器模型,它接收文档-查询对作为输入,并为该输入对生成一个综合相关性分数。使用重排序器,用户可以针对给定查询将文档从最相关到最不相关排序。
tag为什么使用 jina-reranker-v1-base-en?
重排序提供了比仅使用嵌入模型更相关的信息。在我们的模型发布文章中,我们展示了 Jina Reranker 相比其开源和闭源竞争对手的优势,它可以将搜索系统的命中率提高 8%,平均倒数排名提高 33%。
这对通过 RAG 解决方案获得的响应质量有直接影响。有理论支持这一说法,我们将向你展示一个实际示例,让你亲眼看到 Jina Reranker 对使用 LlamaIndex 构建的 RAG 管道的影响。
tag开始之前:关于 LlamaIndex 节点后处理器的说明
LlamaIndex 中的节点后处理器是在检索之后、响应合成之前转换或过滤节点的模块。作为此包的一部分,LlamaIndex 既提供内置选项,也提供自定义添加的 API。
Jina Reranker 现已集成到 LlamaIndex 作为节点后处理器。为了提高响应准确性,检索到的节点基于与查询的相关性重新排序,并返回排名前 N 的节点。
tag在 Google Colab 上跟随学习
本教程有一个配套的笔记本,你可以在 Google Colab 或本地运行。
tag数据集:2024 年耐克儿童产品目录
为了展示 Jina Reranker 对 RAG 应用程序的性能提升,我们选择了 2024 年耐克儿童产品目录作为我们的数据集。该文档包含了耐克 2024 年提供的儿童产品结构化集合。我们选择这个数据集是因为它清晰地展示了使用重排序器的效果,并且与大多数用户相关。
tag安装先决条件
要安装所需的依赖,请运行:
pip install llama-index-postprocessor-jinaai-rerank
pip install llama-index-embeddings-jinaai
pip install llama-index
pip install llama-index-llms-huggingface
pip install "huggingface_hub[inference]"tag访问 Mixtral LLM
要使用 Mixtral-8x7B-Instruct-v0.1 LLM,你需要一个 HuggingFace 令牌。
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
hf_inference_api_key = "<在此处填入你的 HuggingFace 访问令牌>"
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key,
)
tag访问 Jina Embeddings 和 Jina Reranker
要使用我们的 Jina Embeddings 和 Jina Reranker,你需要一个专用的 API 密钥。将其存储在名为 api_key 的变量中,并从 LlamaIndex 调用 Jina Embeddings 模型:
from llama_index.embeddings.jinaai import JinaEmbedding
api_key = "<在此处填入你的 Jina 密钥>"
jina_embeddings = JinaEmbedding(api_key=api_key)类似地,你可以调用 Jina Reranker 模型。通过设置 top_n 参数,你可以决定在最终输出中返回多少个最相关的文档。在这种情况下,我们设置top_n=2:
from llama_index.postprocessor.jinaai_rerank import JinaRerank
jina_rerank = JinaRerank(api_key=api_key, top_n=2)tag下载 2024 年 Nike 儿童产品目录
运行以下代码来下载数据:
from llama_index.core import SimpleDirectoryReader
import requests
url = '<https://niketeam-asset-download.nike.net/catalogs/2024/2024_Nike%20Kids_02_09_24.pdf?cb=09302022>'
response = requests.get(url)
with open('Nike_Catalog.pdf', 'wb') as f:
f.write(response.content)
reader = SimpleDirectoryReader(
input_files=["Nike_Catalog.pdf"]
)
documents = reader.load_data()tag使用 Jina Embeddings 生成和索引嵌入向量
现在设置已完成,我们将生成嵌入向量(节点)并对其建立索引。Jina Embeddings v2 模型接受最多 8192 个 token 的输入,对于这样的文档来说足够大,我们不需要进行任何额外的文本分段或检查任何部分是否包含太多 token。运行以下代码来嵌入和索引文档:
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(
documents=documents, embed_model=jina_embeddings
)tag不使用 Jina Reranker 进行查询
当我们从这组文本中查询特定信息时,LlamaIndex 的 query_engine 会执行以下操作:
- 使用 Jina Embeddings V2 为查询创建嵌入向量。
- 使用索引获取与查询嵌入向量余弦相似度最高的前
top_k = 10个存储嵌入向量,并返回其在索引中的位置。 - 在向量数据数组中查找相应的文本。
让我们询问在面料方面最好的 Nike 球衣是什么:
query_engine = index.as_query_engine(
similarity_top_k=10, llm=mixtral_llm
)
response = query_engine.query(
"What are the best padded pants that Nike sells?",
)
print(response.source_nodes[0].text)结果:
NIKE KIDS EQUIPMENT87NIKE BRASILIA SMALL DUFFEL 9.5
DM3976 $37.00
SIZES: Misc OFFER DATE: 07/01/22 END DATE: 07/01/25
Tough 600D polyester • Durable 300D polyester • Detachable shoulder
strap • Ventilated shoe or wet/dry storage • Secure zip pocket •
Limited lifetime guarantee • Screened Swoosh design trademark
DIMENSIONS: 20" L x 10" W x 11" H
010 Black/Black/(White) 068 Iron Grey/Black/(White)
...tag使用 Reranker 进行查询
现在我们想应用 reranker 来看看 RAG 应用是否会产生不同的、更加相关的结果。为此,我们需要将 node_postprocessors 添加到 query_engine 中:
query_engine = index.as_query_engine(
similarity_top_k=10, llm=mixtral_llm, node_postprocessors=[jina_rerank]
)
response = query_engine.query(
"What are the best padded pants that Nike sells?",
)
print(response.source_nodes[0].text)注意,与之前不使用 reranker 的情况相比,query_engine 现在还包含了设置为 [jina_rerank] 的 node_postprocessors 参数。
结果:
NIKE KIDS FOOTBALL – STOCK10
DJ5731 $47.00
SIZES: XS, S, M, L, XL, 2XL, 3XL
FABRIC: Body/panels lining: 100% polyester. Pad: 100%
ethylene vinyl acetate.
OFFER DATE: 04/01/23
END DATE: 04/01/27
Take the field ready to give it your all in the Nike Recruit
Pants. They're made from lightweight, stretchy fabric with
sweat-wicking power to help keep you dry and moving freely
when the game heats up. With integrated pads shaped for a
comfortable fit, you'll be prepared for a performance you can
be proud of. Choose from 6 different colors to outfit your
team. Nike Dri-FIT technology moves sweat away from your skin
for quicker evaporation, helping you stay dry and comfortable.
Lightweight knit fabric stretches with you to let you move
naturally. Thigh, knee, hip and tailbone pads are shaped for
an optimal fit, without compromising on coverage. A
body-hugging fit is designed to help keep the padding in place
and close to the body. Belt at the waist lets you dial in your
perfect fit to maximize comfort. Elastic at hems.
Hip width: 15", Inseam length: 11.75" (size medium).
010 Black/(White) 060 Team Anthracite/(White) 100 White/(Black)
419 Team Navy/(White) 493 Team Royal/(White) 657 Team Scarlet/(White)tag结论
正如我们所见,没有使用 reranker 的查询得到的排名最高的结果提到了"透气网布背部"和"柔软触感的修身版型"。相比之下,使用 reranker 后,我们得到的排名最高的结果具有"专为最佳透气性设计"、有"能让你在比赛日压力下保持干爽凉爽的吸汗设计",并且采用"轻便面料,宽松舒适的版型"。
第二个结果更加准确,更符合我们的查询要求。通过我们最后两篇文章,我们从理论和实践角度都证明了在 RAG 管道中添加 Jina Reranker 可以提高检索准确性,改善从中获得的响应质量。









