La génération augmentée par recherche (RAG) est un ensemble de techniques en pleine expansion qui ont été initialement conçues comme une extension des grands modèles de langage (LLMs) mais sont de plus en plus considérées comme un paradigme alternatif qui réinvente entièrement le rôle des modèles d'IA.
Nous allons vous montrer comment créer un moteur RAG basique en utilisant le framework LlamaIndex, un LLM Mistral open-source, Jina Embeddings v2, et la base de données vectorielle Qdrant prête pour l'IA.
tagLe RAG en Contexte
Dans un système RAG, le rôle du modèle d'IA reste central mais beaucoup plus limité. Au lieu de répondre aux prompts à partir de ses connaissances internes, dérivées de ses données d'entraînement, il reçoit les informations pertinentes dans son prompt. Le rôle du modèle est alors de comprendre et de synthétiser ces informations en une sortie.
Cela exploite les points forts des modèles d'IA et minimise leurs faiblesses.
Par exemple, nous pourrions donner au modèle Mistral-Instruct le prompt suivant :
Answer the query. Please be brief, concise, and complete.
Query: Why is Taylor Swift planning to attend the Superbowl?
Answer:
Quand j'ai fait cela, le modèle a répondu :
I don't have real-time information. However, as of my last update,
Taylor Swift is not officially confirmed to attend or perform at
the Superbowl. If there are any updates, I recommend checking the
latest news sources.Les grands modèles de langage sont coûteux à mettre à jour et à réentraîner, donc leurs informations internes ne peuvent jamais être totalement à jour.
De plus, les grands modèles de langage sont connus pour "halluciner", c'est-à-dire inventer des réponses plausibles qui peuvent être partiellement ou totalement incorrectes et qui doivent être vérifiées.
Answer the query. Please be brief, concise, and complete.
Query: What was Weird Al Yankovic's first Taylor Swift parody?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," a spoof
of Swift's song "Blank Space." The parody was released in 2014
as part of Yankovic's album "Mandatory Fun." The song humorously
addresses the obsession with celebrity gossip and scandals, as
reported by the tabloid news website TMZ.Le TMZ de Weird Al Yankovic est sorti en 2011 sur l'album Alpocalypse et est une parodie de You Belong with Me de Swift.
La nature des réseaux neuronaux rend l'hallucination difficile, voire impossible, à prévenir complètement et compromet fortement tout projet d'utilisation des modèles d'IA comme sources d'information.
Selon les mots de Sam Altman, PDG d'OpenAI :
"Je pense que les gens font une grande erreur quand ils considèrent ces modèles [LLMs] comme une base de données. [...] Ça marchera, plus ou moins. Mais c'est la base de données la plus chère, la plus lente et la moins précise au monde."
Le RAG minimise la dépendance aux connaissances internes d'un modèle d'IA sur les faits du monde réel et tire parti de ses plus grands atouts : la compréhension du langage naturel et la génération fluide de langage.
Prenons un autre exemple de question à laquelle Mistral-Instruct ne peut pas répondre :
Answer the query. Please be brief, concise, and complete.
Query: What is the title of Taylor Swift's next album?
Answer:
As of the time I am providing this answer, Taylor Swift has
not yet announced the title of her next album. She has released
several re-recorded albums, but the title of her next original
album remains unknown. I recommend checking her official social
media channels or website for the latest updates.Maintenant, un système RAG pourrait avoir une base de données d'articles d'actualité récents, ou peut-être rechercher sur Internet des textes liés au titre du prochain album de Taylor Swift. Ensuite, il insérerait les textes qu'il trouve dans le prompt.
Supposons qu'il identifie cet article AP comme pertinent pour la requête et construit le prompt suivant :
Context information is below.
---------------------
February 6, 2024
LOS ANGELES (AP) — Forget her "Reputation." Taylor Swift has a
whole new album coming out.
Accepting the Grammy for best pop vocal album on Sunday night,
Taylor said she'd been keeping a secret for two years.
"My brand-new album comes out April 19. It's called 'The Tortured
Poets Department.' I'm going to go and post the cover right now
backstage," she announced.
And so she did.
---------------------
Given the context information and not prior knowledge, answer the query.
Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What is the title of Taylor Swift's next album?
Answer:Mistral-Instruct a répondu :
The title of Taylor Swift's next album is 'The Tortured Poets Department'.Ce type de prompting réduit aussi drastiquement la probabilité d'hallucinations. Par exemple :
Context information is below.
---------------------
Alpocalypse is the thirteenth studio album by American parody
musician "Weird Al" Yankovic, released on June 21, 2011.
Track List
1. Perform This Way (Parody of "Born This Way" by Lady Gaga)
2. CNR
3. TMZ (Parody of "You Belong with Me" by Taylor Swift)
4. Skipper Dan
5. Polka Face (Polka medley including songs by artists such as
Lady Gaga, Justin Bieber, Britney Spears, Ke$ha, and others)
6. Craigslist
7. Party in the CIA (Parody of "Party in the U.S.A." by Miley
Cyrus)
8. Ringtone
9. Another Tattoo (Parody of "Nothin' on You" by B.o.B featuring
Bruno Mars)
10. If That Isn't Love
11. Whatever You Like (Parody of "Whatever You Like" by T.I.)
12. Stop Forwarding That Crap to Me
---------------------
Given the context information and not prior knowledge, answer the
query. Please be brief, concise, and complete.
If the context information does not contain an answer to the query,
respond with "No information".
Query: What was Weird Al Yankovic's first Taylor Swift parody, what
year was it released, and what song was he parodying?
Answer:
Weird Al Yankovic's first Taylor Swift parody was "TMZ," and it was
released in 2011. He was parodying "You Belong with Me" by Taylor
Swift.
tagAnatomie d'un système RAG
Un système RAG comporte, au minimum, deux composants :
- Un modèle d'IA génératif.
- Un système de recherche d'information.
Dans cet article, nous utiliserons Mistral-Instruct comme modèle d'IA génératif et y accéderons via l'API d'inférence Hugging Face. Nous utiliserons la base de données vectorielle Qdrant et Jina Embeddings ensemble pour le système de recherche d'information.
Comme source de données, nous utiliserons le Plan Stratégique National de Recherche et Développement en Intelligence Artificielle - Mise à jour 2023, publié en mai 2023 par le Conseil National des Sciences et de la Technologie, un organisme qui conseille le Président américain sur les questions scientifiques et techniques. Ce document d'environ 25 000 mots est un document de politique et de planification stratégique pour la politique et le développement de l'IA américaine.
C'est aussi un exemple classique de document politique gouvernemental "trop long ; pas lu". La majeure partie est très ennuyeuse et, à moins d'avoir un intérêt direct ou un intérêt marqué dans ce domaine, vous ne le lirez probablement pas. Mais vous pourriez quand même vouloir savoir ce qu'il dit.
Cet article vous guidera à travers les étapes de création d'un système RAG capable de répondre aux questions sur le texte et son contenu.
tagInstaller les Prérequis
Tout d'abord, assurez-vous d'avoir installé toutes les bibliothèques Python pertinentes. Dans votre environnement Python, exécutez ce qui suit :
pip install llama-index qdrant-client
pip install pdfminer.six llama-index-vector-stores-qdrant
pip install llama-index-llms-openai llama-index-embeddings-jinaai
pip install llama-index-llms-huggingface "huggingface_hub[inference]"Nous utiliserons LlamaIndex pour construire un système RAG autour du modèle de langage Mistral-Instruct et pdfminer.six pour traiter le fichier PDF dans un magasin de vecteurs Qdrant.
tagSe connecter à Mistral-Instruct via l'API Inference de Hugging Face
Tout d'abord, configurez le LLM. Vous aurez besoin d'accéder à l'API Inference de Hugging Face, y compris un jeton d'accès. Si vous avez un compte Hugging Face, vous pouvez en obtenir un depuis votre page de paramètres de compte.
Si vous n'avez pas de compte, commencez par en créer un, puis créez un jeton d'accès.
Placez votre jeton dans une variable pour une utilisation future :
hf_inference_api_key = '<your HuggingFace Inference API token>'Ensuite, nous construisons un modèle de prompt :
from llama_index.core import PromptTemplate
qa_prompt_tmpl = (
"Context information is below.\n"
"---------------------\n"
"{context_str}\\n"
"---------------------\n"
"Given the context information and not prior knowledge, "
"answer the query. Please be brief, concise, and complete.\n"
"If the context information does not contain an answer to the query, "
"respond with \"No information\".\n"
"Query: {query_str}\n"
"Answer: "
)
qa_prompt = PromptTemplate(qa_prompt_tmpl)Ce modèle demande au LLM d'utiliser uniquement les informations contextuelles fournies dans le prompt pour répondre aux questions. Ce prompt a bien fonctionné pour nous avec Mistral-Instruct, mais vous pouvez expérimenter d'autres formulations pour voir ce qui convient à votre cas d'utilisation.
from llama_index.llms.huggingface import HuggingFaceInferenceAPI
mixtral_llm = HuggingFaceInferenceAPI(
model_name="mistralai/Mixtral-8x7B-Instruct-v0.1",
token=hf_inference_api_key
)Enfin, créez et initialisez un objet pour le framework LlamaIndex qui contient la connexion à Mistral-Instruct. Le code ci-dessous provient du précédent article sur la création de systèmes RAG utilisant LlamaIndex.
Cela place la connexion au LLM Mistral dans la variable mistral_llm.
tagRécupération d'informations avec Qdrant et Jina Embeddings
Pour configurer le système de récupération, vous aurez besoin d'une clé API Jina Embeddings. Vous pouvez en obtenir une gratuitement avec un budget prépayé d'un million de tokens sur le site web de Jina Embeddings.

Placez votre clé Jina Embeddings dans une variable pour une utilisation future :
jina_emb_api_key = "<your Jina Embeddings API key>"Ensuite, créez un objet connecteur en utilisant LlamaIndex pour le serveur Jina Embeddings, en sélectionnant spécifiquement le modèle monolingue anglais :
from llama_index.embeddings.jinaai import JinaEmbedding
jina_embedding_model = JinaEmbedding(
api_key=jina_emb_api_key,
model="jina-embeddings-v2-base-en",
)tagCharger les données textuelles
Ensuite, nous allons charger le document et le diviser en paragraphes. Tout d'abord, téléchargez le PDF depuis le site web de la Maison Blanche dans la variable pdf_data :
import urllib.request
uri = "https://www.whitehouse.gov/wp-content/uploads/2023/05/National-Artificial-Intelligence-Research-and-Development-Strategic-Plan-2023-Update.pdf"
pdf_data = urllib.request.urlopen(uri).read()Ensuite, nous allons traiter le PDF page par page, extraire le texte puis le découper en paragraphes en séparant sur les doubles sauts de ligne. Ceux-ci sont stockés dans la liste text_paras :
import regex as re
from io import BytesIO, StringIO
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.pdfpage import PDFPage
from pdfminer.pdfparser import PDFParser
text_paras = []
parser = PDFParser(BytesIO(pdf_data))
doc = PDFDocument(parser)
rsrcmgr = PDFResourceManager()
for page in PDFPage.create_pages(doc):
output_string = StringIO()
device = TextConverter(rsrcmgr, output_string, laparams=LAParams())
interpreter = PDFPageInterpreter(rsrcmgr, device)
interpreter.process_page(page)
page_text = output_string.getvalue()
text_paras.extend(re.split(r'\n\s*\n', page_text))
Vérifiez que tout est chargé :
assert len(text_paras) == 615Ensuite, nous allons convertir cette liste de textes courts en objets Document LlamaIndex :
from llama_index.core.readers import StringIterableReader
rag_docs = StringIterableReader().load_data(text_paras)Et vous pouvez inspecter le texte :
print(rag_docs[0].text)Résultat :
NATIONAL ARTIFICIAL INTELLIGENCE
RESEARCH AND DEVELOPMENT
STRATEGIC PLAN
2023 UPDATEtagConfigurer une base de données vectorielle Qdrant
Dans cet article, nous utiliserons le Qdrant Vector Search Cloud pour implémenter la base de données du système RAG. L'offre gratuite de Qdrant inclut 1 Go de stockage, ce qui est plus que suffisant pour ce tutoriel.
Vous devrez créer un compte sur le site web de Qdrant Cloud avant de continuer.

Une fois que vous avez un compte et que vous êtes connecté, vous devrez créer un cluster. Suivez les instructions de "démarrage rapide" sur le site web de Qdrant pour configurer un cluster gratuit et obtenir une API et le nom du serveur hôte Qdrant.

Stockez la clé et le nom d'hôte dans des variables :
qdrant_api_key = "<your API key>"
qdrant_server = "https://<your server>"Ensuite, nous devrons importer les composants pertinents des packages qdrant_client et llama_index :
import qdrant_client
from llama_index.vector_stores.qdrant import QdrantVectorStore
client = qdrant_client.QdrantClient(qdrant_server, api_key=qdrant_api_key)
vector_store = QdrantVectorStore(client=client, collection_name="NTSC")Ceci crée une collection nommée NTSC dans votre cluster gratuit.
Vous pouvez consulter la documentation Qdrant pour plus d'informations sur la création d'un stockage de données local en mémoire ou sur disque et l'hébergement de votre propre instance de serveur Qdrant dans un conteneur docker via une API web.
tagCompléter le système RAG
Nous allons maintenant assembler ces composants en un système RAG complet en utilisant le code standard de LlamaIndex :
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.storage.storage_context import StorageContext
from llama_index.core import (
VectorStoreIndex,
ServiceContext,
get_response_synthesizer,
)
# set up the service and storage contexts
service_context = ServiceContext.from_defaults(
llm=mixtral_llm, embed_model=jina_embedding_model
)
storage_context = StorageContext.from_defaults(vector_store=vector_store)
# create an index
index = VectorStoreIndex.from_documents(
rag_docs, storage_context=storage_context, service_context=service_context
)
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=2,
)
# configure response synthesizer
response_synthesizer = get_response_synthesizer(
service_context=service_context,
text_qa_template=qa_prompt,
response_mode="compact",
)
# assemble query engine
query_engine = RetrieverQueryEngine(
retriever=retriever,
response_synthesizer=response_synthesizer,
)
Ce système utilisera Jina Embeddings pour indexer les paragraphes de notre source textuelle et placera les deux meilleures correspondances dans le contexte de chaque prompt. Pour passer aux trois meilleures correspondances par exemple, il suffit de modifier l'initialisation de VectorIndexRetriever ci-dessus pour avoir un paramètre similarity_top_k différent :
# configure retriever
retriever = VectorIndexRetriever(
index=index,
similarity_top_k=3,
)Le système est maintenant prêt à être utilisé.
tagInterroger un Document
Essayons une requête simple :
response = query_engine.query("""
What is the Biden Administration's policy with regard to AI?
""")
print(response.response)Le résultat (le vôtre peut être différent) :
The Biden Administration prioritizes responsible AI systems that
are ethical, trustworthy, and safe, and serve the public good.
The Administration has committed to substantial funding for AI
R&D, and has established the National AI Initiative Office to
coordinate AI activities across the federal government.
The Administration's AI policy focuses on developing evaluative
techniques for AI, workforce development, public-private
partnerships, and international collaboration in AI research.Ou quelque chose de plus spécifique :
response = query_engine.query("""
What protections does the AI Bill of Rights propose to offer?
""")
print(response.response)The AI Bill of Rights proposes five core protections: Safe and
Effective Systems; Algorithmic Discrimination Protections; Data
Privacy; Notice and Explanation; and Human Alternatives,
Consideration, and Fallback.Ou même très spécifique :
response = query_engine.query("Who is Kei Koizumi?")
print(response.response)Kei Koizumi is the Principal Deputy Director for Policy at the Office
of Science and Technology Policy (OSTP).Vous pouvez également poser des questions plus fantaisistes :
response = query_engine.query("""
What rights will AI's receive under President Biden's proposed
AI Bill of Rights?
""")
print(response.response)The proposed AI Bill of Rights does not grant rights to AI systems, but
rather outlines principles to ensure that AI technologies are
developed and used in a manner that respects human rights and values.
The principles include safety, transparency, fairness, disclosure,
data privacy, non-discrimination, and the ability for individuals to
opt out of certain AI systems.response = query_engine.query("""
Why is President Biden's proposing an AI Bill of Rights?
Does AI really need rights?
""")
print(response.response)President Biden's proposed AI Bill of Rights aims to ensure that AI
technologies are developed and used ethically, legally, and with
societal considerations in mind. The Bill of Rights is not granting
"rights" to AI, but rather setting guidelines for the responsible
development and deployment of AI systems to protect individuals and
communities from potential negative impacts.response = query_engine.query("""
Has Donald Trump weighed in on AI?
Will he Make Humans Great Again?
""")
print(response.response)
No information. The context information does not mention Donald
Trump's views on AI.tagJina AI et Qdrant
La fenêtre de contexte de 8k tokens de Jina Embeddings le rend particulièrement adapté à la génération augmentée par récupération car il peut travailler avec des blocs de texte beaucoup plus grands. Là où d'autres applications RAG doivent souvent stocker des phrases individuelles ou des paires de phrases, dans ce tutoriel, nous avons pu utiliser des paragraphes entiers sans nous soucier de leur taille.
Cela réduit le nombre d'éléments de texte qui doivent être stockés pour transporter la même information, réduisant les coûts de calcul, économisant la mémoire et rendant la récupération plus rapide.
La base de données vectorielle de Qdrant est simple à configurer, rapide et rentable, et comme vous l'avez vu, il ne faut que quelques lignes de Python pour l'intégrer dans un système RAG.
Pour en savoir plus sur la base de données prête pour l'IA et les offres cloud de Qdrant, vous pouvez visiter leur site web.

tagContactez-nous
Jina AI s'engage à apporter des technologies d'IA fiables et abordables aux entreprises de toute taille et de tout type. Nous aimerions en savoir plus sur vos cas d'utilisation et vous aider à intégrer l'IA dans vos processus métier. Pour plus d'informations sur les offres de Jina AI et pour nous contacter, consultez le site web de Jina AI ou rejoignez notre communauté sur Discord.











