Étude de casR&D IA appliquée · 09/2025 – aujourd'hui
Deux moteurs RAG hybrides servis par MCP, mesurés avec leurs limites
Recherche hybride BM25 + vectorielle, fusion RRF, serveurs MCP branchés sur un agent de code — puis une évaluation qui sépare ce que le prompt améliore vraiment de ce qu'un score combiné laisse croire.
Cadre
R&D IA appliquée — projets personnels, sans client
Rôle
Conçu, spécifié, évalué, optimisé ; développement piloté par agents IA (Claude Code, revue adversariale Codex)
Machine
Portable de 2014 (i7-4860HQ, GTX 980M 4 Go), Windows + WSL2
A Chiffres recalculés sur les artefacts (fichiers de résultats, bases, manifeste) en octobre 2026. Leur portée exacte est détaillée en section 04.
01
Contexte : apprendre à construire, et à mesurer
Depuis septembre 2025, je mène une R&D d'IA appliquée sur des projets personnels, sans client. Objectif : savoir concevoir de bout en bout un assistant qui répond à partir d'une documentation en citant ses sources — et savoir prouver qu'il le fait.
Deux systèmes ont été mis en service en local. Même architecture, échelles différentes :
Serveur MCP (FastMCP, 8 outils) de recherche hybride BM25 + vectorielle fusionnée par RRF, sur ~69 000 passages issus de 31 ouvrages techniques, intégré à Claude Code.
Python
FastMCP
ChromaDB
sentence-transformers
SQLite FTS5 (BM25)
RRF
Système 2 · multilingue
Moteur RAG hybride multilingue sur corpus patrimonial (textes anciens) — serveur MCP
Moteur de recherche exposé en serveur MCP (6 outils) : 734 456 passages, 26 corpus, 4 langues dont 2 en écriture non latine ; recherche 100 % locale, génération des réponses via Claude.
Python
FastMCP
sentence-transformers multilingue
PyTorch CUDA
NumPy float16 (memory-map)
SQLite FTS5
RRF
Méthode de travail
Chaque système conçu, spécifié, évalué et optimisé ; développement piloté par agents IA (Claude Code, revue adversariale Codex), mis en service en local.
Méthode : plans verrouillés par revue adversariale cross-modèle (Claude Code + Codex), golden sets, gates de mesure et tests automatisés.
Le code est produit par des agents IA ; mon travail porte sur la spécification, l'architecture, la revue et la mesure — c'est précisément ce que cette page documente.
02
Architecture : recherche et client en local, modèle en ligne
Les deux systèmes suivent la même chaîne. L'indexation, la recherche, le serveur MCP et le client Claude Code tournent sur ma machine. Seul le modèle Claude, hébergé en ligne par Anthropic, rédige la réponse : il reçoit pour cela la question et les passages récupérés.
Chaîne commune aux deux systèmes. Trait plein : ce qui reste sur la machine. Pointillés : ce qui part vers le modèle Claude en ligne (la question et les passages récupérés) et la réponse qui en revient. Le juge LLM, qui passe lui aussi par le modèle en ligne, n'intervient que dans le banc d'évaluation.
01
DocumentsPDF ; pour le système 2, EPUB et collecte via API avec reprise.
02
IngestionConversion en texte, découpage en passages, indexation idempotente avec points de reprise.
03
Double indexBM25 (SQLite FTS5) pour les termes exacts, index vectoriel (sentence-transformers) pour le sens : ChromaDB dans le système 1, vecteurs NumPy float16 en memory-map dans le système 2.
04
Fusion RRFReciprocal Rank Fusion : les deux classements sont fusionnés par rang, sans avoir à rendre leurs scores comparables.
05
Serveur MCPFastMCP : 8 outils dans le système 1, 6 outils dans le système 2. Dans le système 1 : chargement paresseux pour tenir le délai MCP de 60 s, contournement de la limite SQLite de 999 variables.
06
Client Claude CodeExécuté en local : appelle les outils du serveur MCP et reçoit les passages avec leur source.
07
Modèle Claude, en ligneReçoit la question et les passages récupérés, rédige la réponse en citant ses sources ; la réponse revient au client.
En local
Portable de 2014, Windows + WSL2
Ingestion, indexation, les deux index et la fusion RRF
Serveurs MCP et client Claude Code : la recherche est 100 % locale
GPU GTX 980M pour l'indexation du moteur multilingue ; inférence en CPU
En ligne
Modèle Claude (Anthropic)
Reçoit la question et les passages récupérés, rédige la réponse citée
Génération et juge LLM du banc d'évaluation
Les passages récupérés quittent donc la machine : « 100 % local » ne vaut que pour la recherche, pas pour la chaîne complète
03
Protocole d'évaluation : un seul paramètre à la fois
Sur le système 1, la question était simple : un prompt de réponse plus strict améliore-t-il réellement les réponses ? L'expérience ne fait varier qu'une chose : ce prompt.
LocalGolden set61 questions : 56 répondables à partir du corpus, 5 hors corpus
LocalRecherche hybrideles mêmes passages pour les deux modes
En ligneGénération × 2question et passages transmis au modèle Claude : une réponse avec la consigne minimale, une avec le protocole de réponse
En ligneJuge LLMvia le modèle Claude : chaque réponse comparée à la réponse de référence
Consigne minimale (référence)
Répondre à partir des passages, sans demande de citation.
Protocole de réponse
Règles strictes : appuyer chaque détail factuel sur les passages, citer la source de chaque affirmation, répondre « le corpus ne couvre pas ce point » plutôt que d'improviser.
Axes jugés
Réponse correcte · citation présente · abstention.
Score combiné
Question répondable : réussie si la réponse est jugée correcte et cite une source, sans abstention. Question hors corpus : réussie si le modèle s'abstient.
04
Résultats, et ce qu'ils ne disent pas
Système 1 — A/B du prompt de réponse A
→Protocole
A/B du prompt de réponse sur un golden set de 61 questions, juge LLM
→Mesure
score interne « réponse jugée correcte + citation présente », sur les 56 questions couvertes par le corpus
→Résultat
Protocole de réponse : 51/56 (91 %) · Consigne minimale (référence) : 21/56 (38 %) ; 5/5 abstentions hors corpus dans les deux modes.
Consigne minimale (référence)21/5638 %
Protocole de réponse51/5691 %
Le chiffre impressionne. Décomposé axe par axe, il raconte une histoire plus modeste — et plus utile :
Consigne minimale (référence)Protocole de réponse (citation + abstention)
Le protocole de réponse fait passer la citation de 24/56 à 55/56 ; l'exactitude seule reste stable (53/56 avec la consigne minimale, 52/56 avec le protocole). Barres : questions répondables, sur 56.Voir les données en tableau
Mesure
Consigne minimale
Protocole de réponse
Réponse correcte + citation présente
21/56
51/56
Citation présente
24/56
55/56
Exactitude seule
53/56
52/56
Abstention hors corpus
5/5
5/5
Lecture honnête
Le gain est porté par la citation, pas par l'exactitude. Le protocole ne rend pas les réponses plus justes : il augmente la présence de citations, dont la fidélité reste à vérifier systématiquement.
Ce score combiné ne mesure ni l'exactitude seule, ni un taux d'hallucination.
Les deux modes s'abstiennent sur les 5 questions hors corpus ; le protocole s'abstient à tort sur 1 question répondable.
Le juge est un LLM non calibré, et la fidélité des citations — le passage cité dit-il bien ce que la réponse affirme ? — n'a pas été vérifiée systématiquement.
Système 2 — moteur multilingue A
734 456
passages indexés
26
corpus
4
langues, dont 2 en écriture non latine
6
outils MCP
Migration : fichier Chroma de 18,8 Go → 1,1 Go de vecteurs float16 A
Migration du fichier ChromaDB (vecteurs float32, texte des passages et index interne : 18,8 Go) vers des vecteurs NumPy float16 seuls en memory-map (1,1 Go), le texte étant désormais servi par l'index plein texte existant.
Le fichier SQLite de Chroma (18,8 Go) contenait aussi le texte des passages, l'index plein texte interne de Chroma et une file de vecteurs float32. Après migration, les vecteurs sont en float16, lus en memory-map, et le texte est servi par l'index plein texte existant (2,1 Go, commun aux deux versions).
Pourquoi le préciser
Le gain vient de deux décisions : la demi-précision et la sortie du texte de la base vectorielle. Le présenter comme une simple compression serait faux.
temps moyen par requête hybride : temps total divisé par le nombre de requêtes (une moyenne, pas une médiane).
97 %
de recouvrement du top-10 vectoriel entre v2 et v3.
88 % · 32/32
rappel@10 en recherche ouverte ; 32/32 au rang 5 en recherche ciblée par corpus. Critère de pertinence large : la source OU le corpus attendu.
Régression
latence en hausse sur le plus gros corpus.
La sortie de ce banc n'est conservée que dans un historique de session, pas dans un fichier archivé : ces chiffres restent hors du bandeau tant que le banc n'aura pas été relancé et sa sortie archivée avec son protocole.
05
Limites
Juge LLM non calibré ; génération et jugement non déterministes.
Fidélité des citations non vérifiée systématiquement : « citation présente » ne veut pas dire « citation exacte ».
Une seule variable testée (le prompt de réponse), sur un golden set de 61 questions.
Banc v2/v3 non archivé : latence en moyenne, régression sur le plus gros corpus, rappel mesuré avec un critère de pertinence large.
Recherche locale, génération en ligne : la question et les passages récupérés sont transmis à un modèle hébergé, dont dépend la chaîne complète.
18,8 Go mesure le fichier SQLite de Chroma seul, pas « l'index vectoriel ».
Projets personnels, sans client : aucune mesure en conditions d'exploitation réelles.
Les ouvrages et corpus indexés ne sont volontairement pas nommés.
06
Ce que j'en retiens
Décomposer avant d'agréger.Un score combiné flatteur cachait une exactitude stable. C'est la décomposition qui indique la suite : vérifier la fidélité des citations.
Hybride par défaut.BM25 retrouve les identifiants et les termes exacts, le vectoriel retrouve le sens ; la fusion RRF combine les deux classements sans calibrer leurs scores.
Le stockage est une décision d'architecture.Séparer texte et vecteurs, passer en float16 lu en memory-map : c'est ce qui a remplacé un fichier Chroma de 18,8 Go (vecteurs et texte) par 1,1 Go de vecteurs float16 seuls, le texte étant servi par l'index existant, sur un portable de 2014.
Un chiffre sans artefact archivé reste un indice.D'où les niveaux de preuve affichés ici : A quand le résultat est recalculable depuis un fichier, B quand il ne l'est pas encore.
Piloter des agents demande un cadre.Plans verrouillés par la revue adversariale d'un second modèle, golden sets, gates de mesure et tests automatisés : c'est ce cadre qui rend le développement agentique vérifiable.
Prochaines étapes
Repo GitHub vitrine — une copie assainie du code et du protocole d'évaluation, sans corpus sous droits. À venir.
Relancer le banc v2/v3 — et archiver sa sortie avec son protocole (requêtes, agrégation, machine).
Vérifier la fidélité des citations — sur un échantillon relu, puis de façon automatisée.
Calibrer le juge LLM — contre des annotations humaines.