Aller au contenu
Toutes les études de cas
SantéPrototype2026

Un assistant RAG médical souverain qui cite sa source ou répond « je ne sais pas »

Un assistant augmenté par la recherche pour les recommandations cliniques, qui fonctionne entièrement sur le matériel de l'organisation : modèle de langage local, embeddings locaux, base vectorielle locale, aucune API cloud. Chaque réponse cite son document et sa page, et une question hors du corpus reçoit un simple « je ne sais pas » plutôt qu'une réponse inventée.

0,1 s
Vérifié
Pour refuser une question hors périmètre
992
Vérifié
Segments issus de 7 publications officielles HAS et SFMU
94
Vérifié
Tests unitaires et d'API, plus une CI en 4 jobs

Le problème

Les hôpitaux conservent leurs protocoles et recommandations dans de longs PDF que les soignants ne peuvent pas consulter rapidement, et les assistants d'IA généralistes ne sont pas une option : les documents ne peuvent pas sortir de l'établissement, une réponse sans sa source ne peut pas être vérifiée, et un assistant qui invente une posologie est pire que pas d'assistant du tout. L'objectif était de mesurer ce qu'il faut réellement pour en construire un qu'une équipe sécurité hospitalière pourrait accepter, pas seulement un qui fait bonne impression en démonstration.

Le système en un coup d'œil

  1. Ingestion

    Recommandations officielles découpées et vectorisées sur la machine

  2. Recherche

    Recherche vectorielle Qdrant, environ 75 à 110 ms

  3. Filtre

    Rien d'assez pertinent : « je ne sais pas », le modèle n'est jamais appelé

  4. Génération

    Mistral 7B via Ollama, sur le matériel local

  5. Citation

    Chaque réponse indique son document et sa page

Approche

Hadirou a construit toute la chaîne, du modèle et des embeddings jusqu'à la base vectorielle, l'API, l'interface et le déploiement, puis a consacré l'essentiel de l'effort à essayer de la mettre en défaut : relecture critique du code, mesures, et questions auxquelles le système ne devrait pas savoir répondre. La recherche décide avant la génération, si bien que le système refuse avant même d'appeler le modèle de langage.

  • Réponses ancrées dans un corpus de sept publications officielles françaises (HAS et SFMU)
  • Document et page cités pour chaque réponse
  • Seuil de pertinence calibré sur le corpus pour basculer de la réponse au refus
  • Langue des réponses fixée par configuration, et non codée en dur

Architecture

Une interface Next.js ne parle qu'à sa propre origine ; un relais côté serveur ajoute la clé d'API et transmet à un back end FastAPI, qui interroge Qdrant pour les vecteurs et Ollama pour la génération. Le modèle d'embeddings multilingue est embarqué dans l'image Docker, car un réseau hospitalier peut n'avoir aucune route vers Internet, et un système qui en a besoin pour démarrer n'est pas souverain.

  • Front Next.js avec relais côté serveur : aucune clé n'atteint le navigateur
  • Back end FastAPI, réponses diffusées au fil de l'eau
  • Base vectorielle Qdrant et Ollama pour la génération locale
  • Sondes de vivacité et de disponibilité séparées, pour qu'une panne de base ne redémarre pas des pods sains
  • Nombre de générations simultanées plafonné, car sur CPU elles se ralentissent mutuellement

Déploiement et exploitation

La pile fonctionne de bout en bout avec Docker Compose. En mode production, elle refuse de démarrer avec une clé d'API faible ou une politique CORS ouverte. Les journaux portent un identifiant de requête et ne contiennent jamais le contenu des documents, et des métriques Prometheus suivent la latence, les erreurs du modèle et la part de questions restées sans réponse. Des manifestes Kubernetes de référence sont fournis ; ils passent kustomize mais n'ont pas encore été appliqués sur un cluster réel, ce que le dépôt indique clairement.

  • Docker Compose, conteneurs non root, en-têtes de sécurité et CSP sans aucune origine externe
  • Métriques Prometheus, dont la part de questions auxquelles le corpus ne peut pas répondre
  • CI : lint, tests, construction des deux images, et contrôle qu'aucune clé n'apparaît dans le code envoyé au navigateur
  • Manifestes Kubernetes de référence, pas encore exécutés sur un cluster

Valeur métier

Il montre à une organisation réglementée ce qu'implique un assistant documentaire souverain avant qu'elle ne s'engage : les performances mesurées, les choix de sécurité, et une liste honnête de ses limites. Rien dans la conception n'est propre à la médecine. Des documents qui ne peuvent pas sortir de l'établissement, des réponses qui doivent citer leur source et un système capable de dire « je ne sais pas » : c'est le cas de la plupart des usages documentaires réglementés.

Enseignements

01

Un seuil de similarité est un premier filtre, pas un garde-fou : une question hors périmètre a obtenu 0,5873, au-dessus d'une question légitime à 0,5591, d'où un reranker cross-encoder comme prochaine étape.

02

Mesurer révèle ce qu'une démonstration cache : passer de 61 segments synthétiques aux 992 du corpus réel a fait échouer deux questions de démonstration, et installer la version CPU de PyTorch a réduit l'image de 9,67 Go à 2,94 Go.

03

Réindexer un protocole révisé doit purger l'ancienne version, sinon l'assistant peut citer une posologie périmée.

Un système d'IA qui doit atteindre la production ?

Parlons du problème que vous cherchez à résoudre et de la pertinence de l'IA pour le traiter. Pas de mots à la mode, juste une lecture technique honnête.