Aller au contenu
Cercle IA Tech · RAG Un site du réseau Cercle IA Tech

Guide

RAG en local et open source : les briques à assembler

Un RAG entièrement sur vos machines : Ollama, plongements locaux, PostgreSQL et pgvector, Docling. Les briques, le matériel, les limites.

Mis à jour le

Un RAG en local, c'est une chaîne dont aucune brique n'envoie vos documents à un service extérieur : le modèle de langage, le modèle de plongements, la base de données et l'extraction tournent sur vos serveurs ou vos postes. C'est faisable avec des briques ouvertes, à condition d'accepter deux contreparties : du matériel à dimensionner, et des modèles locaux qu'il faut tester sur vos documents en français.

Ce site est édité par IArche, qui édite ALMA. Les outils ci-dessous sont décrits d'après leur documentation, à titre d'exemples ; il en existe d'autres.

Les briques

Brique Exemple local Ce que dit la documentation
Modèle de langage Ollama sert les modèles sur la machine, interface sur localhost:11434
Plongements Ollama (/api/embed) ou Sentence Transformers vecteurs normalisés, similarité cosinus recommandée
Base vectorielle PostgreSQL + pgvector index vectoriels approximatifs, recherche plein texte de PostgreSQL pour l'hybride
Extraction des documents Docling exécution locale, y compris sans accès au réseau
Retri cross-encoder de Sentence Transformers modèle chargé localement
Orchestration LlamaIndex ou LangChain exemples locaux documentés

Le modèle de langage

L'exemple local de LlamaIndex utilise Ollama avec le modèle llama3.1 en version 8 milliards de paramètres, téléchargé par ollama pull llama3.1. La page prévient : il faut une machine d'environ 32 Go de mémoire vive au moins. Elle limite aussi la fenêtre de contexte (context_window=8000) pour contenir la consommation de mémoire, ce qui borne la quantité de passages que vous pourrez donner au modèle à chaque question.

Les plongements

Deux voies documentées :

  • Ollama. La documentation décrit le point d'entrée POST http://localhost:11434/api/embed, avec les champs model et input (une chaîne ou une liste). Ses exemples utilisent le modèle embeddinggemma. Les vecteurs renvoyés sont normalisés, et la similarité cosinus est recommandée pour la recherche par le sens.
  • Sentence Transformers via LlamaIndex. L'exemple local utilise HuggingFaceEmbedding(model_name="BAAI/bge-base-en-v1.5") : aucune clé d'interface n'est nécessaire.

Il existe aussi des modèles de plongements à poids ouverts publiés par des fournisseurs commerciaux : la documentation d'Anthropic mentionne voyage-4-nano de Voyage AI, sous licence Apache 2.0, à télécharger et exécuter soi-même.

Règle donnée par Ollama et valable partout : le même modèle pour indexer et pour interroger. Changer de modèle, c'est réindexer.

Exemple, d'après la documentation d'Ollama :

import ollama

resultat = ollama.embed(model="embeddinggemma", input="Quel est le délai de préavis ?")
vecteur = resultat["embeddings"][0]

La base : PostgreSQL et pgvector

Le dépôt pgvector ajoute à PostgreSQL un type vecteur, des opérateurs de distance (<-> pour la distance euclidienne, <=> pour la distance cosinus, <#> pour le produit scalaire négatif) et deux types d'index approximatifs : HNSW, un graphe à plusieurs niveaux, au meilleur compromis entre vitesse et rappel mais plus lent à construire et plus gourmand en mémoire ; IVFFlat, qui range les vecteurs en listes, plus rapide à construire mais moins performant à l'interrogation. Il s'utilise avec la recherche plein texte de PostgreSQL pour faire de la recherche hybride, et accepte des filtres WHERE, utiles pour les droits d'accès. Avantage pour une petite structure : une seule base à sauvegarder.

L'extraction

Docling lit PDF, documents Word, présentations, tableurs et pages HTML, reconstruit la mise en page et les tableaux, propose une reconnaissance de caractères pour les scans, et annonce une exécution locale adaptée aux données sensibles et aux environnements sans accès au réseau. Sa page affiche une licence MIT. Voir aussi RAG sur des PDF.

Les limites à connaître

  1. Le matériel. 32 Go de mémoire vive pour l'exemple de LlamaIndex, avec un modèle de 8 milliards de paramètres. Un modèle plus grand demandera davantage ; mesurez avant d'acheter.
  2. La qualité en français. Les exemples officiels sont écrits pour des textes anglais. Évaluez les modèles retenus sur vos propres questions (voir Évaluer un RAG).
  3. La maintenance. Mises à jour des modèles, de la base, des bibliothèques : en local, elles sont pour vous.
  4. La fenêtre de contexte. Une fenêtre réduite pour économiser la mémoire limite le nombre de passages transmis. Le retri devient alors plus important : il faut que les quelques passages retenus soient les bons.

Quand le local se justifie

Le local se justifie quand vos documents ne doivent pas sortir de vos murs, par contrainte contractuelle, par politique interne ou par choix. Il ne dispense pas des règles sur les données personnelles : un traitement local reste un traitement, avec ses obligations.

Questions fréquentes

Quelle machine faut-il pour un RAG en local ?

L'exemple local de LlamaIndex, qui fait tourner le modèle Llama 3.1 en version 8 milliards de paramètres via Ollama, demande une machine d'environ 32 Go de mémoire vive au moins.

Peut-on mélanger deux modèles de plongements ?

Non : la documentation d'Ollama recommande d'utiliser le même modèle de plongements pour indexer et pour interroger.

Sources

Pages consultées pour écrire cet article :

  1. https://developers.llamaindex.ai/python/framework/getting_started/starter_example_local/
  2. https://docs.ollama.com/capabilities/embeddings
  3. https://github.com/pgvector/pgvector
  4. https://docling-project.github.io/docling/
  5. https://platform.claude.com/docs/en/build-with-claude/embeddings
  6. https://sbert.net/examples/cross_encoder/applications/README.html

À lire aussi