RAG avec ChromaDB et Mistral
Pour un RAG local avec Mistral, la pile la plus simple est Ollama (génération et embeddings avec bge-m3) plus ChromaDB en mode fichier, sans serveur ni PyTorch. Côté modèle, ministral-3:8b (6,0 Go, licence Apache 2.0, contexte de 256K annoncé) est un bon défaut pour une carte de 8 à 12 Go, ministral-3:14b pour 16 Go, mistral-small3.2:24b (15 Go) au-delà. Le réglage à ne pas oublier : la fenêtre de contexte d'Ollama, à relever pour que les passages tiennent dans le prompt.
Ce guide construit un assistant documentaire complet, en deux scripts Python, avec un modèle Mistral exécuté sur votre machine : vos PDF et fichiers texte sont découpés, indexés dans ChromaDB, puis les passages retrouvés sont donnés au modèle qui répond en citant ses sources. Il précise aussi quel modèle Mistral choisir selon votre mémoire graphique et les pièges qui font qu'un RAG répond à côté.
#Ce qu'on construit : un RAG Mistral entièrement local
Le RAG (génération augmentée par récupération) consiste à retrouver les passages de vos documents qui concernent la question, puis à les coller dans le prompt du modèle pour qu'il réponde à partir d'eux. Le résultat attendu ici est un petit outil en ligne de commande : un script indexe un dossier de documents ; un second lit une question, retrouve les cinq passages les plus proches dans ChromaDB, les transmet à un modèle Mistral via Ollama avec la question, et affiche la réponse suivie des fichiers consultés. Rien ne quitte la machine : Ollama sert le modèle de génération et le modèle d'embeddings, ChromaDB stocke les vecteurs dans un dossier local.
Deux sens du mot « Mistral » circulent : les modèles à poids ouverts de Mistral AI, que l'on télécharge et exécute soi-même (objet de ce guide), et les API hébergées de l'entreprise, qui envoient vos passages sur ses serveurs. Pour des documents confidentiels, seul le premier respecte l'exigence « 100 % local ».
#Quel modèle Mistral choisir pour le RAG
Tes documents, ton IA : un RAG local fiable sur tes PDF, notes et mails — sans rien envoyer dans le cloud.
- Espace en ligne à vie
- PDF + fichiers
- Mises à jour à vie
Un RAG a des besoins particuliers : le modèle doit suivre une consigne stricte (« réponds uniquement à partir des passages »), lire plusieurs passages sans se perdre, et répondre en français. La taille compte moins que pour la conversation libre ; en revanche la mémoire disponible pour le contexte compte plus. Les tailles ci-dessous sont celles affichées par la bibliothèque Ollama, en quantification par défaut.
| Modèle | Taille Ollama | Contexte annoncé | Pour qui |
|---|---|---|---|
| ministral-3:3b | 3,0 Go | 256K | Machine sans GPU dédié ; réponses simples, tolérance faible aux consignes complexes |
| ministral-3:8b | 6,0 Go | 256K | Défaut raisonnable pour une carte de 8 à 12 Go ou un portable avec 16 Go de mémoire |
| ministral-3:14b | 9,1 Go | 256K | Carte de 16 Go, ou 12 Go avec un contexte modéré |
| mistral-nemo (12B) | voir la page Ollama | 128K | Alternative plus ancienne, encore répandue |
| mistral-small3.2:24b | 15 Go | 128K | Carte de 24 Go ou mémoire unifiée de 32 Go et plus ; le plus solide sur les consignes de format |
| mistral (7B, version 0.3) | 4,4 Go | 32K | Modèle ancien : à réserver aux machines très limitées |
La famille Ministral 3 (3B, 8B et 14B) est publiée sous licence Apache 2.0, comme l'indique l'annonce de Mistral 3, et la page Ollama la décrit comme conçue pour un déploiement en périphérie, capable de tourner sur une large gamme de matériel. Mistral Small 4, publié en 2026 avec 119 milliards de paramètres au total d'après le nom de sa fiche Hugging Face, vise du matériel de serveur : il n'est pas un candidat pour une machine personnelle. Pour un ordre de grandeur de la mémoire nécessaire, le calculateur de VRAM du site donne le poids du modèle plus le cache de contexte.
#La pile technique
- Génération
- Un modèle Mistral servi par Ollama, par l'API HTTP locale sur le port 11434.
- Embeddings
- bge-m3 servi par Ollama : la page de la bibliothèque le décrit comme un modèle de BAAI polyvalent, multilingue et multi-granularité, de 567 millions de paramètres. Il évite d'installer PyTorch et sentence-transformers.
- Base vectorielle
- ChromaDB en mode local (PersistentClient) : un dossier, aucun serveur. Chroma fournit une enveloppe, OllamaEmbeddingFunction, qui appelle l'API d'embeddings d'Ollama.
- Lecture des fichiers
- pypdf pour les PDF contenant du texte, lecture directe pour Markdown et texte brut. Un PDF scanné est une image : il faut d'abord une reconnaissance de caractères.
#Préparer l'environnement
- 01Installer Ollama et récupérer les modèlesInstallez Ollama, puis téléchargez le modèle de génération et le modèle d'embeddings avec les deux commandes ci-dessous.
- 02Créer l'environnement PythonPython 3.10 ou plus. Un environnement virtuel garde les dépendances du projet à part.
- 03Placer les documentsCopiez vos PDF, fichiers Markdown et texte dans un dossier docs/ à côté des scripts.
#2. Indexer les documents dans ChromaDB
Le script lit chaque fichier, découpe le texte en passages d'environ 1 800 caractères en coupant sur les paragraphes, puis les confie à Chroma, qui appelle bge-m3 par Ollama pour calculer les vecteurs. Deux détails comptent : chaque passage garde le nom du fichier en métadonnée (pour citer la source), et les ajouts se font par lots plutôt qu'un passage à la fois.
L'utilisation d'upsert avec des identifiants construits sur le nom de fichier et le numéro de passage rend le script relançable : réindexer le même dossier met à jour les passages au lieu de les dupliquer. Attention toutefois : si un document raccourcit, les anciens passages surnuméraires restent dans la base ; pour un changement important, supprimez le dossier chroma_db et réindexez. Le choix de la taille des passages est détaillé dans le guide sur les stratégies de chunking.
#3. Interroger : recherche puis génération
Le second script embarque la question, récupère les cinq passages les plus proches et compose le prompt. L'instruction de consigne est décisive : elle demande de répondre uniquement à partir des passages, d'avouer quand l'information manque, et de citer le fichier. Le paramètre num_ctx relève la fenêtre de contexte : la documentation d'Ollama indique que la fenêtre par défaut est de 4 096 tokens, et que la variable OLLAMA_CONTEXT_LENGTH ou le paramètre num_ctx la modifient. Avec cinq passages de 400 à 500 tokens, la consigne et la réponse, 4 096 tokens sont à la limite : un contexte trop court est coupé silencieusement, et le modèle répond sans avoir lu la fin de vos passages.
#Vérifier ce que ChromaDB renvoie avant d'accuser le modèle
Quand une réponse est mauvaise, la cause se trouve à l'un de deux endroits : la recherche n'a pas ramené le bon passage, ou le modèle l'a mal utilisé. Les deux se distinguent en affichant les passages retrouvés avec leur distance, sans appeler le modèle. Si le bon passage est absent des cinq premiers, changez le découpage, ajoutez une recherche par mots-clés ou un reranker. S'il est présent et que la réponse reste fausse, le problème vient du prompt, du contexte tronqué ou du modèle : essayez le modèle de taille supérieure avant de conclure.
#Budget mémoire : ce qui doit tenir en même temps
Le RAG fait cohabiter deux modèles, celui qui génère et celui qui calcule les vecteurs, plus le cache de contexte du premier. Ollama charge chaque modèle à la demande et peut décharger l'un pour faire de la place à l'autre, ce qui ajoute un délai à chaque bascule si la mémoire est juste. Le tableau donne un ordre de grandeur pour trois configurations ; le poids du modèle vient de la bibliothèque Ollama, le reste est un calcul à affiner avec le calculateur de VRAM du site.
| Configuration | Poids du modèle de génération | À ajouter | Carte visée |
|---|---|---|---|
| ministral-3:8b + bge-m3 | 6,0 Go | Cache de contexte, modèle d'embeddings (567 millions de paramètres, à peine plus d'un Go en demi-précision), marge du système | 8 à 12 Go |
| ministral-3:14b + bge-m3 | 9,1 Go | Idem ; le contexte long devient le facteur limitant sur 12 Go | 12 à 16 Go |
| mistral-small3.2:24b + bge-m3 | 15 Go | Idem ; prévoir une marge confortable | 24 Go ou plus |
#Les pièges qui font répondre à côté
- Le contexte par défaut trop court
- Voir plus haut : sans num_ctx relevé, les derniers passages sont tronqués. Symptôme typique : la bonne réponse est bien récupérée par ChromaDB, mais le modèle dit qu'il ne la trouve pas.
- PDF scannés
- pypdf ne lit que du texte déjà présent. Un scan renvoie du vide : le script l'affiche. Passez d'abord le document par un OCR, décrit dans le guide sur Tesseract.
- Passages sans contexte
- Un passage arraché à son document (« le délai est de 30 jours ») ne dit pas de quoi il parle. Préfixez chaque passage du titre du document ou de la section.
- Question sans réponse dans les documents
- Sans la consigne « dis-le clairement », un modèle comble le vide avec ce qu'il sait. Testez toujours une question dont la réponse n'est pas dans vos fichiers.
- Identifiants et termes exacts
- Un numéro de contrat ou de dossier n'est pas bien retrouvé par les embeddings : ajoutez une recherche par mots-clés, comme décrit dans le guide sur la recherche hybride.
#Pour aller plus loin
| Amélioration | Effort | À faire quand |
|---|---|---|
| Relever le nombre de passages (k) de 5 à 8 | Une ligne | La réponse est répartie sur plusieurs passages |
| Chunking par titres au lieu de paragraphes | Moyen | Documents structurés (documentation, contrats à articles) |
| Recherche hybride BM25 + vectoriel | Moyen | Questions par identifiant, sigle ou nom propre |
| Reranker (bge-reranker-v2-m3) | Moyen | La bonne réponse est récupérée mais rangée au-delà du 5e rang |
| Interface de chat (Open WebUI, API FastAPI) | Variable | D'autres personnes doivent utiliser l'outil |
| Sauvegarde et réindexation planifiées | Faible | Le dossier de documents évolue chaque semaine |
Chaque amélioration a son propre guide : mesurez le rappel sur 30 à 50 questions réelles avant et après, plutôt que d'empiler les techniques. Si vous préférez une interface toute faite sans écrire de code, le guide sur le RAG sans coder présente Open WebUI et AnythingLLM.
#Questions fréquentes sur le RAG avec Mistral
Quel modèle Mistral pour un RAG en local ?+
Ollama peut-il calculer les embeddings à la place de sentence-transformers ?+
Pourquoi le modèle dit-il ne pas trouver la réponse alors qu'elle est dans mes documents ?+
Peut-on utiliser l'API Mistral à la place d'Ollama ?+
Comment ajouter de nouveaux documents sans tout réindexer ?+
Faut-il un GPU pour ce RAG ?+
- RAG en local avec ChromaDB et Ollama : tutoriel Python
- Stratégies de chunking
- Recherche hybride BM25 + vectoriel
- Ajouter un reranker à son pipeline
- Calculateur de VRAM
- RAG local avec Ollama sans coder
- Source : Ollama, ministral-3
- Source : Ollama, mistral-small3.2
- Source : Ollama, bge-m3
- Source : Chroma, embeddings Ollama
- Source : FAQ Ollama, fenêtre de contexte
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.