Alors que les modèles bi-encodeurs comme Jina Embeddings peuvent rapidement retrouver de nombreux documents correspondants dans une base de données d'embeddings pré-calculés, les modèles de reclassement peuvent affiner cet ensemble en utilisant une approche plus lente mais plus précise de cross-encoding des requêtes utilisateurs et des documents récupérés. Jina AI a publié notre premier modèle de reclassement, jina-reranker-v1-base-en, et dans cet article, nous présenterons en détail pourquoi un reclasseur est essentiel pour optimiser la précision du RAG et comment commencer à construire un système RAG à la pointe de la technologie en utilisant Jina Embeddings/Reranker, LlamaIndex, et le modèle de langage Mixtral-8x7B-Instruct-v0.1 (hébergé sur HuggingFace).
Vous aurez besoin de :

Comme les modèles Jina Embeddings et Reranker ainsi que Mixtral fonctionnent à distance et sont accessibles via une API RESTful, vous n'aurez besoin d'aucun matériel spécial.
tagQu'est-ce qu'un reclasseur ?
Avant de poursuivre le tutoriel, il est important de souligner ce que sont les reclasseurs. Pour une compréhension complète de ce qu'est un reclasseur et pourquoi Jina Reranker V1 est le meilleur choix pour vous, nous vous encourageons à lire notre article sur la sortie de Jina Reranker V1 avant de continuer.

En résumé, les reclasseurs sont des modèles cross-encoder qui prennent en entrée une paire document-requête et émettent un score de pertinence combiné pour cette paire d'entrée. En utilisant les reclasseurs, les utilisateurs peuvent trier les documents du plus au moins pertinent pour une requête donnée.
tagPourquoi utiliser jina-reranker-v1-base-en ?
Le reclassement fournit des informations beaucoup plus pertinentes que l'utilisation d'un modèle d'embedding seul. Dans notre article de sortie du modèle, nous avons démontré que Jina Reranker se démarque par rapport à ses concurrents open et closed-source et qu'il peut améliorer les systèmes de recherche de 8 % en taux de réussite et de 33 % en rang réciproque moyen.
Cela a un impact direct sur la qualité des réponses obtenues via la solution RAG appliquée. Avec la théorie qui soutient cette affirmation, nous vous montrerons un exemple pratique pour que vous puissiez voir par vous-même l'effet que Jina Reranker a sur un pipeline RAG construit avec LlamaIndex.
tagAvant de commencer : Une note sur les Node-Postprocessors de LlamaIndex
Les node-postprocessors dans LlamaIndex sont des modules qui transforment ou filtrent les nœuds après la récupération et avant la synthèse de la réponse dans un moteur de requête. Dans ce package, LlamaIndex propose à la fois des options intégrées et une API pour des ajouts personnalisés.
Jina Reranker a maintenant été intégré à LlamaIndex comme node postprocessor. Pour augmenter la précision des réponses, les nœuds récupérés sont réordonnés en fonction de leur pertinence par rapport à la requête, et les N meilleurs nœuds sont renvoyés.
tagSuivez sur Google Colab
Ce tutoriel est accompagné d'un notebook que vous pouvez exécuter sur Google Colab ou localement.
tagLe jeu de données : Catalogue de produits Nike Kids 2024
Pour démontrer l'amélioration des performances de Jina Reranker pour les applications RAG, nous avons choisi le Catalogue de produits Nike Kids 2024 comme jeu de données. Le document contient un ensemble structuré de produits pour enfants proposés par Nike en 2024. Nous avons sélectionné ce jeu de données car il montre clairement l'effet de l'utilisation d'un reclasseur et est facilement compréhensible pour la plupart des utilisateurs.
tagInstallez les prérequis
Pour installer les prérequis, exécutez :
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]"tagAccès au LLM Mixtral
Pour utiliser le LLM Mixtral-8x7B-Instruct-v0.1, vous avez besoin d'un token HuggingFace.
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
hf_inference_api_key = "<votre token d'accès HuggingFace ici>"
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key,
)
tagAccès à Jina Embeddings et Jina Reranker
Pour utiliser nos modèles Jina Embeddings et Jina Reranker, vous avez besoin d'une clé API dédiée. Stockez-la dans une variable appelée api_key et appelez le modèle Jina Embeddings depuis LlamaIndex :
from llama_index.embeddings.jinaai import JinaEmbedding
api_key = "<votre clé Jina ici>"
jina_embeddings = JinaEmbedding(api_key=api_key)De même, vous pouvez appeler le modèle Jina Reranker. En définissant le paramètre top_n, vous pouvez décider combien de documents les plus pertinents retourner dans la sortie finale. Dans ce cas, nous définissonstop_n=2:
from llama_index.postprocessor.jinaai_rerank import JinaRerank
jina_rerank = JinaRerank(api_key=api_key, top_n=2)tagTélécharger le catalogue des produits Nike Kids 2024
Pour télécharger les données, exécutez le code suivant :
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()tagGénérer et indexer les embeddings avec Jina Embeddings
Maintenant que la configuration est terminée, nous allons générer les vecteurs d'embedding (nœuds) et les indexer. Les modèles Jina Embeddings v2 acceptent des entrées jusqu'à 8192 tokens, ce qui est suffisamment grand pour que, pour un document comme celui-ci, nous n'ayons pas besoin de faire de segmentation de texte supplémentaire ni de vérifier si une section contient trop de tokens. Pour intégrer et indexer le document, exécutez le code suivant :
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(
documents=documents, embed_model=jina_embeddings
)tagRequêter les résultats sans Jina Reranker
Lorsque nous recherchons des informations spécifiques dans cet ensemble de textes, le query_engine de LlamaIndex effectue les opérations suivantes :
- Avec Jina Embeddings V2, il crée un embedding pour la requête.
- Il utilise l'index pour obtenir les
top_k = 10embeddings stockés ayant le plus haut cosinus avec l'embedding de la requête et renvoie sa position dans l'index. - Il recherche le texte correspondant dans le tableau de données vectorielles.
Demandons quel est le meilleur maillot Nike en termes de tissu :
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)Résultat:
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)
...tagRequêter les résultats avec Reranker
Nous voulons maintenant appliquer le reranker pour voir si l'application RAG produit un résultat différent et plus pertinent. Pour ce faire, nous devons ajouter le node_postprocessors au 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)Notez que par rapport au cas précédent sans le reranker, le query_engine contient maintenant aussi le paramètre node_postprocessors défini sur [jina_rerank].
Résultat:
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)tagConclusion
Comme nous pouvons le constater, la requête sans le reranker conduit à un premier résultat qui mentionne "mesh back for breathability" et "slim fit with soft hand feel". En comparaison, en utilisant un reranker, nous obtenons un premier résultat qui est "engineered for optimal breathability", possède un "moisture-wicking design" qui "helps keep you dry and cool under match-day pressure", et présente "lightweight fabric in a relaxed, easy fit".
Le second résultat est beaucoup plus précis et approprié pour la requête que nous avons posée. Avec nos deux derniers articles, nous avons montré tant d'un point de vue théorique que pratique que l'ajout de Jina Reranker à votre pipeline RAG augmente la précision de la récupération et améliore la qualité des réponses que vous en obtenez.







