“Je jure par Apollon médecin, par Asclépios, Hygie et Panacée…”
— Serment d’Hippocrate
🧠 Explorez les fondements de la médecine occidentale grâce à un système RAG (Retrieval-Augmented Generation) moderne, alimenté par les Aphorismes d’Hippocrate.
- ✨ Explorer un corpus historique de textes médicaux anciens.
- 🧠 Utiliser le RAG pour faciliter l’apprentissage interactif des textes classiques.
- 📚 Mettre en avant les principes hippocratiques via une interface numérique moderne.
- 🧑⚕️ Inspirer une approche pédagogique de la redécouverte des textes médicaux anciens.
- Permet aux utilisateurs d’explorer les bases de la médecine antique.
- Encourage une réflexion critique à travers l’analyse des textes originaux.
- Facilite la compréhension de l’évolution de la pensée médicale.
- Méthode active : poser des questions et recevoir des réponses contextualisées.
- Développe la compétence "recherche + synthèse" via un assistant IA.
- Favorise l’autonomie dans l’étude des textes classiques.
- Exploration du langage médical ancien via NLP.
- Première étape vers la création de référentiels sémantiques historiques.
- Ouvre la voie à l'analyse d'autres œuvres majeures (Galien, Avicenne, etc.).
- Démonstration pratique de la chaîne complète RAG, du PDF au serveur web.
- Documentation pédagogique claire et reproductible.
.
├── data/
│ ├── hippocrates_questions.json # Questions prédéfinies
│ └── hippocrate_rag_data.json # Données préparées pour le RAG
├── models/
│ └── config_schema.py # Schéma Pydantic de configuration
├── prepare_corpus/
│ └── process_pdf.ipynb # Notebook d'extraction du PDF
├── rag/
│ └── hippocrag.py # Moteur RAG principal
├── templates/
│ └── index.html # Template Jinja2 de l’interface
├── app.py # Point d’entrée Flask
├── config_loader.py # Chargement du YAML
├── Dockerfile # Définition du conteneur
├── docker-compose.yml # Orchestration
├── rag_config.yaml # Fichier de configuration global
├── requirements.txt # Dépendances python pour exécuter le projet dans un conteneur docker
└── requirements_pjt.txt # Dépendances Python pour executer le projet en local
Les Aphorismes d’Hippocrate proviennent de :
- Titre : Aphorismes d'Hippocrate, traduits par Émile Littré
- Format numérique : PDF issu de archive.org
- Pages traitées : 96 à 260 (traduction française principale)
Ils sont découpés et stockés dans :
data/hippocrate_rag_data.json
- Et indexés avec FAISS après encodage sémantique via Sentence-BERT (
sentence-camembert-large
).
À chaque question posée :
- La requête est encodée en vecteur.
- Une recherche par plus proches voisins est effectuée dans l’index FAISS.
- Les passages pertinents sont récupérés.
La réponse est générée par un modèle LLM open-source (Mistral) via Ollama, reformulée en français à partir des extraits trouvés.
graph TD
A(Question utilisateur) --> B(Encodage vectoriel *CamemBERT*)
B --> C(Recherche dans l'*index FAISS*)
C --> D(Récupération des chunks pertinents)
D --> E(Appel LLM *Mistral* → réponse générée)
-
[Question utilisateur]
- L'utilisateur pose une question en langage naturel.
- Exemple : "Quel est le rôle du régime dans la santé selon Hippocrate ?"
-
[Encodage vectoriel (CamemBERT)]
- La question est encodée en vecteur grâce à un modèle sémantique comme CamemBERT ou Sentence CamemBERT large.
- Permet de comparer la requête aux embeddings précalculés des aphorismes.
-
[Recherche dans index FAISS]
- Le moteur de recherche vectorielle (FAISS) compare le vecteur de la question avec les embeddings stockés dans l’index.
- Retourne les
top_k
passages les plus proches (ex: 6 fragments).
-
[Récupération des chunks pertinents]
- Les textes associés aux vecteurs trouvés sont récupérés depuis la base JSON.
- Ces chunks contiennent les informations nécessaires pour répondre à la question.
-
[Appel LLM (Mistral) → réponse générée]
- Un prompt est construit à partir de la question et des contextes trouvés.
- Le LLM (
mistral
, via Ollama) génère une réponse structurée en français. - Réponse renvoyée à l’utilisateur sous forme HTML ou texte brut.
Technologie | Usage |
---|---|
Flask | Backend API Web |
Bootstrap 5.3 | Interface responsive |
Sentence-BERT | Encodage sémantique |
FAISS | Indexation vectorielle |
Mistral (Ollama) | Génération de réponses |
Docker | Déploiement portable |
Bleach | Sécurisation HTML |
- Python 3.9+
- Docker (optionnel mais recommandé)
- Ollama (ou autre LLM compatible via API)
- Git (facultatif)
- Processeur : architecture moderne (x86 ou ARM comme M1/M2/M4)
- RAM : minimum 16 Go, idéalement 24 Go
- Stockage : espace disque suffisant (~5–10 Go)
✅ Testé avec succès sur un Mac M4 avec 24 Go de RAM, Python 3.11, Docker Desktop et Ollama.
Commencez par cloner le dépôt GitHub sur votre machine locale :
git clone https://github.com/micheldpd24/rag_aph_hippocrate.git
cd rag_aph_hippocrate
Assurer vous d'abord que dans le fichier configuration rag_config.yaml nous avons bien: rag: llm: endpoint: "http://ollama:11434/api/generate"
Lancez l’application en une seule commande grâce à Docker Compose :
docker compose up --build
Télécharger et lancer le modèle llm mistral
ollama run mistral
L’application sera accessible à l’adresse : http://localhost:5000
python -m venv .venv
Sous macOS / Linux :
source .venv/bin/activate
Sous Windows (CMD) :
.venv\Scripts\activate
pip install -r requirements.txt
Ouvrez un nouveau terminal et démarrez le service Ollama :
ollama serve
Toujours dans ce terminal :
ollama run mistral
Assurez vous d'abord que dans le fichier configuration rag_config.yaml vous avez bien: rag / llm / endpoint: "http://localhost:11434/api/generate"
Revenez au terminal principal et exécutez :
python app.py
Accédez ensuite à l’interface via : http://localhost:5000
Le notebook prepare_corpus/process_pdf.ipynb
extrait les aphorismes depuis le PDF et les prépare pour le RAG :
- Téléchargement du PDF
- Nettoyage du texte (mots coupés, erreurs de numérotation)
- Extraction structurée des aphorismes
- Segmentation adaptée au RAG :
- < 450 caractères → conservé tel quel
- 450–800 → divisé en 2 parties
-
800 → divisé en 3 parties avec chevauchement
Chaque document inclut :
- Un identifiant unique (
s1.aph_01.p100
) - Le texte segmenté
- Des métadonnées (section, page, source)
Fichier central : rag_config.yaml
Paramètre | Valeur par défaut |
---|---|
name |
"HippocRAG" |
debug |
true |
host |
"0.0.0.0" |
port |
5000 |
secret_key |
"change_this_secret" |
data_dir |
"data" |
cache_dir |
"cache" |
question_cache_file |
"questions_cache.json" |
Paramètre | Valeur par défaut |
---|---|
model.name |
"dangvantuan/sentence-camembert-large" |
normalize_embeddings |
true |
index.json_path |
"data/hippocrate_rag_data.json" |
faiss_path |
"hippocrate.index" |
build_on_startup |
true |
top_k |
6 |
Paramètre | Valeur par défaut / Description |
---|---|
provider |
"ollama" → Fournisseur du modèle LLM utilisé |
endpoint |
- Local : "http://localhost:11434/api/generate" → Si lancé manuellement sur la machine - Container : "http://ollama:11434/api/generate" → Si lancé via Docker Compose |
model |
"mistral" → Modèle LLM utilisé pour générer les réponses |
Balises HTML autorisées : <p>
, <h4>
, <ul>
, <em>
, <strong>
, <blockquote>
Protection contre XSS via bleach
.
Classe principale : HippocRAG_FAISS
- Encodage sémantique via
SentenceTransformer
- Indexation rapide avec
FAISS
- Génération de réponses via LLM externe
- Configuration flexible via YAML
data/hippocrate_rag_data.json
: données segmentéeshippocrate.index
: index FAISS précalculé
Application Flask interactive permettant :
- De choisir un thème médical
- De poser une question personnalisée
- D’obtenir une réponse contextuelle construite à partir des aphorismes
Routes principales :
Route | Méthode | Description |
---|---|---|
/ |
GET/POST | Page principale |
/api/questions |
GET | Charger des questions par thème |
/reset-cache |
POST | Vider le cache des réponses |
MIT License – Voir le fichier LICENSE
Michel Douglas P
Ingénieur ML.