RAG respectueux de la vie privée : dialoguez avec vos documents locaux en toute sécurité
La Génération Augmentée par Récupération (RAG) est l'étalon-or pour dialoguer avec votre documentation. Elle interroge les fichiers, extrait les segments les plus pertinents et les transmet au LLM comme contexte de référence. Mais quand vous utilisez des solutions cloud, vous téléchargez des rapports financiers, des dossiers médicaux ou des documents juridiques chez un tiers.
Dans ce tutoriel, nous allons mettre en place un système RAG 100% privé. Vos documents restent chiffrés sur votre disque dur, analysés par un modèle d'embedding local et répondus par un LLM local orchestré directement par Ollama.
L'architecture du RAG privé
Un pipeline RAG se compose de trois composants principaux, tous exécutables localement :
- Analyseur de Documents & Base de Données Vectorielle : Découpe les PDFs ou fichiers texte en morceaux digestes et les indexe à l'aide d'embeddings mathématiques (via ChromaDB ou LanceDB).
- Modèle d'Embedding : Un petit modèle spécialisé (comme
nomic-embed-text) servi par Ollama, qui convertit les passages de texte en vecteurs. - LLM d'Inférence : Un modèle conversationnel (comme
mistral) servi par Ollama, qui lit le contexte récupéré et répond à votre question.
Contrairement aux solutions cloud, une base de données vectorielle locale traite les données à la vitesse du bus système. Votre taux d'ingestion est limité uniquement par les cœurs CPU et les performances d'écriture SSD, plutôt que par la bande passante internet.
Configuration pas à pas avec Ollama
Ollama expose nativement l'endpoint /api/embeddings pour la vectorisation et /api/chat pour l'inférence. Couplé à un script Python mince et à ChromaDB, vous obtenez un pipeline RAG complet, scriptable et sans dépendance graphique. Open WebUI reste utilisable par-dessus si vous préférez une interface web, mais n'est plus requis.
1. Télécharger les modèles via Ollama
Ouvrez votre ligne de commande et récupérez le modèle d'embedding puis le LLM d'inférence. Ollama les exécutera en local et les servira via son API REST :
ollama pull nomic-embed-text
ollama pull mistral
nomic-embed-text tourne extrêmement rapidement sur CPU ou GPU. mistral répond aux questions en s'appuyant sur le contexte récupéré.
2. Démarrer le daemon Ollama
Si Ollama n'est pas déjà actif, lancez-le en mode headless. Il écoutera sur http://localhost:11434 :
ollama serve
3. Installer ChromaDB pour le stockage vectoriel
Dans un environnement Python, installez ChromaDB. Aucune connexion réseau n'est requise au-delà de l'installation :
pip install chromadb requests
4. Ingérer vos documents et les indexer
Le script Python ci-dessous lit un dossier de fichiers, les découpe en morceaux, génère les embeddings via Ollama et les stocke dans ChromaDB. Tout reste sur votre machine :
import os
import requests
import chromadb
OLLAMA = "http://localhost:11434"
chroma = chromadb.PersistentClient(path="./chroma_db")
collection = chroma.get_or_create_collection("documents")
def embed(text):
return requests.post(f"{OLLAMA}/api/embeddings", json={
"model": "nomic-embed-text",
"prompt": text,
}).json()["embedding"]
for filename in os.listdir("./docs"):
with open(f"./docs/{filename}") as f:
chunks = [f.read()[i:i+500] for i in range(0, len(f.read()), 500)]
for idx, chunk in enumerate(chunks):
collection.add(ids=[f"{filename}-{idx}"], embeddings=[embed(chunk)], documents=[chunk])
5. Poser une question à vos documents
Une fois la base vectorisée, chaque question passe par trois étapes : embedding de la question, recherche des passages similaires dans ChromaDB, puis envoi au LLM Ollama avec ce contexte :
import requests
def ask(question):
q_emb = embed(question)
results = collection.query(query_embeddings=[q_emb], n_results=3)
context = "\n".join(results["documents"][0])
response = requests.post(f"{OLLAMA}/api/chat", json={
"model": "mistral",
"messages": [{"role": "user", "content": f"Contexte :\n{context}\n\nQuestion : {question}"}],
"stream": False,
})
return response.json()["message"]["content"]
print(ask("Quel est le chiffre d'affaires du T3 ?"))
Pendant l'ingestion de documents, votre CPU montera à 100% car il lit et intègre les textes par morceaux. C'est normal. Une fois les documents vectorisés, leur interrogation ne nécessite pas plus de calcul qu'un message de chat standard.