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 champsmodeletinput(une chaîne ou une liste). Ses exemples utilisent le modèleembeddinggemma. 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
- 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.
- 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).
- La maintenance. Mises à jour des modèles, de la base, des bibliothèques : en local, elles sont pour vous.
- 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 :
- https://developers.llamaindex.ai/python/framework/getting_started/starter_example_local/
- https://docs.ollama.com/capabilities/embeddings
- https://github.com/pgvector/pgvector
- https://docling-project.github.io/docling/
- https://platform.claude.com/docs/en/build-with-claude/embeddings
- https://sbert.net/examples/cross_encoder/applications/README.html