像 雙編碼器模型 如 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 Nike 兒童產品目錄
為了展示 Jina Reranker 對 RAG 應用的性能提升,我們選擇了 2024 Nike 兒童產品目錄作為我們的資料集。該文件包含了 Nike 在 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 個 tokens 的輸入,這個長度足夠大,因此對於這樣的文件,我們不需要進行任何額外的文本分段或檢查任何部分是否有太多 tokens。要嵌入和索引文件,請執行以下程式碼:
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 現在還包含了 node_postprocessors 參數,設定為 [jina_rerank]。
結果:
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 後,我們得到的頂部結果是"專為最佳透氣性而設計",具有"可以讓你在比賽日壓力下保持乾爽清涼的吸濕排汗設計",並具有"輕量級面料,採用寬鬆、舒適的剪裁"。
第二個結果更加準確,更符合我們提出的查詢。通過我們最後兩篇文章,我們從理論和實踐的角度展示了將 Jina Reranker 添加到你的 RAG 流程中可以增加檢索準確性,並提高從中獲得的回應質量。









