Guide
RAG avec LlamaIndex : de l'exemple à un vrai projet
Un RAG avec LlamaIndex d'après sa documentation : index, persistance, choix des modèles, découpage, filtres et recherche hybride.
Mis à jour le
LlamaIndex est une bibliothèque Python centrée sur l'indexation de documents et leur interrogation par un modèle de langage. Son exemple de démarrage tient en trois lignes : lire un dossier, construire un index, poser une question. Cette page reprend ce code d'après la documentation officielle, consultée le 15/11/2026, puis montre les réglages qui transforment l'exemple en projet.
Les trois lignes de départ
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
SimpleDirectoryReader lit les fichiers du dossier data ; VectorStoreIndex les découpe, calcule les plongements et les range ; as_query_engine() renvoie un objet qui cherche les passages et fait rédiger la réponse.
Attention au réglage par défaut : la page indique que, sans configuration, LlamaIndex appelle des modèles OpenAI pour la génération comme pour les plongements, et recommande de préciser explicitement le modèle de plongements pour un nouveau projet. Choisissez vos fournisseurs en connaissance de cause (voir plus bas, et RAG en local).
Persister l'index
Sans persistance, l'index est recalculé à chaque lancement, et les plongements refacturés. D'après la documentation :
index.storage_context.persist("storage")
Puis, au lancement suivant :
from llama_index.core import StorageContext, load_index_from_storage
storage_context = StorageContext.from_defaults(persist_dir="storage")
index = load_index_from_storage(storage_context)
Avec une base vectorielle externe, la documentation indique qu'on recharge avec VectorStoreIndex.from_vector_store(vector_store).
Choisir ses modèles
Tout passe par l'objet global Settings. L'exemple local de LlamaIndex remplace les deux modèles :
Settings.embed_model = HuggingFaceEmbedding(model_name="BAAI/bge-base-en-v1.5")
Settings.llm = Ollama(model="llama3.1", request_timeout=360.0, context_window=8000)
Le nom du modèle de plongements de cet exemple porte la mention « en », pour anglais : pour des documents en français, vérifiez qu'il convient sur vos questions ou choisissez un modèle multilingue.
Régler le découpage et le nombre de résultats
D'après la page « Basic Strategies », la taille par défaut des morceaux est de 1 024 avec un recouvrement de 20. On la change avant de construire l'index :
Settings.chunk_size = 512
Settings.chunk_overlap = 50
La même page conseille, quand on réduit la taille, d'augmenter le nombre de passages récupérés : index.as_query_engine(similarity_top_k=4). Pour des découpages plus fins (par structure Markdown, par le sens, hiérarchique), voir la liste des découpeurs et notre page Chunking.
Filtrer par métadonnées
C'est la brique qui permet de gérer les droits ou de restreindre une question à un service. La documentation montre un filtre exact passé au moteur de requête, sur le modèle ExactMatchFilter(key="author", value="John Doe"), transmis par index.as_query_engine(filters=filters). Remplacez l'auteur par le service ou le groupe autorisé, et le filtre s'applique avant la recherche des passages les plus proches. Pour aller plus loin sur le sujet, voir Droits d'accès.
Recherche hybride
La même page explique que les plongements peuvent manquer des passages qui contiennent les mots-clés exacts, et que LlamaIndex propose deux voies : une base vectorielle qui fait nativement la recherche hybride, ou une recherche BM25 locale (algorithme de classement par mots-clés). Voir Recherche hybride.
Exemple de progression (illustratif)
Prenons une équipe de deux développeurs dans une entreprise de transport qui veut interroger ses procédures d'exploitation :
- semaine 1 : les trois lignes de départ sur un dossier de procédures, pour voir ;
- semaine 2 : persistance, choix des modèles, jeu de trente questions réelles ;
- semaine 3 : réglage du découpage et de
similarity_top_k, mesures comparées ; - semaine 4 : métadonnées par service et filtre, puis ouverture à un premier groupe d'utilisateurs.
Le calendrier est un exemple, pas une norme ; ce qui compte est l'ordre : mesurer avant de régler.
LangChain couvre la même chaîne avec une autre organisation : voir RAG avec LangChain.
Questions fréquentes
Quel modèle LlamaIndex utilise-t-il par défaut ?
La page de démarrage indique qu'en l'absence de réglage, LlamaIndex utilise des modèles OpenAI pour la génération et les plongements. On change les deux par Settings.llm et Settings.embed_model.
Comment éviter de recalculer l'index à chaque lancement ?
En le persistant avec index.storage_context.persist("storage"), puis en le rechargeant avec StorageContext.from_defaults et load_index_from_storage.
Sources
Pages consultées pour écrire cet article :
- https://developers.llamaindex.ai/python/framework/getting_started/starter_example/
- https://developers.llamaindex.ai/python/framework/getting_started/starter_example_local/
- https://developers.llamaindex.ai/python/framework/optimizing/basic_strategies/basic_strategies/
- https://developers.llamaindex.ai/python/framework/module_guides/loading/node_parsers/modules/