https://github.com/micheldpd24/rag_aph_hippocrate
RAG / Chatbot IA sur les Aphorismes d'Hippocrate
https://github.com/micheldpd24/rag_aph_hippocrate
assistant-ia docker faiss-cpu flask hippocrate llm medecine-ancienne mistral ollama pymupdf-fitz rag rag-chatbot
Last synced: 2 months ago
JSON representation
RAG / Chatbot IA sur les Aphorismes d'Hippocrate
- Host: GitHub
- URL: https://github.com/micheldpd24/rag_aph_hippocrate
- Owner: micheldpd24
- License: mit
- Created: 2025-05-12T07:58:54.000Z (about 1 year ago)
- Default Branch: main
- Last Pushed: 2025-05-29T13:58:40.000Z (about 1 year ago)
- Last Synced: 2025-10-08T21:58:23.336Z (8 months ago)
- Topics: assistant-ia, docker, faiss-cpu, flask, hippocrate, llm, medecine-ancienne, mistral, ollama, pymupdf-fitz, rag, rag-chatbot
- Language: Jupyter Notebook
- Homepage:
- Size: 456 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# đïž Assistant Hippocratique : RAG basĂ© sur les Aphorismes d'Hippocrate
> âJe jure par Apollon mĂ©decin, par AsclĂ©pios, Hygie et PanacĂ©eâŠâ
> â Serment dâHippocrate
[](LICENSE)
đ§ Explorez les fondements de la mĂ©decine occidentale grĂące Ă un systĂšme **RAG (Retrieval-Augmented Generation)** moderne, alimentĂ© par les *Aphorismes dâHippocrate*.
---
## đŻ Objectifs du Projet
- ⚠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.
---
## âïž Enjeux PĂ©dagogiques et Ăducatifs
### đ§âđ« Vulgarisation des textes fondateurs
- 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.
### đ Apprentissage Interactif
- 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.
### đ§ RĂ©fĂ©rentiel SĂ©mantique MĂ©dical Ancien
- 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.).
### đĄ Exemple Concret dâun RAG AppliquĂ© Ă un Corpus de MĂ©dĂ©cine Ancienne
- Démonstration pratique de la chaßne complÚte RAG, du PDF au serveur web.
- Documentation pédagogique claire et reproductible.
---
## đ Structure du Projet
```
.
âââ 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
```
---
## đ€ Fonctionnement Technique
### đ§ Base de Connaissances
Les *Aphorismes dâHippocrate* proviennent de :
- **Titre** : *Aphorismes d'Hippocrate*, traduits par Ămile LittrĂ©
- **Format numérique** : PDF issu de [archive.org](https://archive.org/details/aphorismesdhippo00hipp)
- **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`).
### đ Recherche Vectorielle
à chaque question posée :
1. La requĂȘte est encodĂ©e en vecteur.
2. Une recherche par plus proches voisins est effectuĂ©e dans lâindex FAISS.
3. Les passages pertinents sont récupérés.
### đ§Ÿ GĂ©nĂ©ration de RĂ©ponse
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.
### đ Diagramme du Workflow RAG
```mermaid
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)
```
---
### đ§Ÿ Explication dĂ©taillĂ©e des Ă©tapes
1. **[Question utilisateur]**
- L'utilisateur pose une question en langage naturel.
- Exemple : *"Quel est le rÎle du régime dans la santé selon Hippocrate ?"*
2. **[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.
3. **[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).
4. **[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.
5. **[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.
---
## 𧰠Technologies Utilisées
| 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 |
---
## đŠ PrĂ©requis
### â
Logiciels requis
- **Python 3.9+**
- **Docker** *(optionnel mais recommandé)*
- **Ollama** *(ou autre LLM compatible via API)*
- **Git** *(facultatif)*
### đ» Configuration MatĂ©rielle RecommandĂ©e
- **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.
---
## đ DĂ©marrage rapide
### 1. 𧏠Cloner le dépÎt distant
Commencez par cloner le dépÎt GitHub sur votre machine locale :
```bash
git clone https://github.com/micheldpd24/rag_aph_hippocrate.git
cd rag_aph_hippocrate
```
---
### 2. đł Avec Docker Compose (RecommandĂ©)
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 :
```bash
docker compose up --build
```
Télécharger et lancer le modÚle llm mistral
```bash
ollama run mistral
```
Lâapplication sera accessible Ă lâadresse : [http://localhost:5000](http://localhost:5000)
---
### 3. đ» En mode dĂ©veloppement local
#### a. PrĂ©parer lâenvironnement virtuel
```bash
python -m venv .venv
```
Sous macOS / Linux :
```bash
source .venv/bin/activate
```
Sous Windows (CMD) :
```bash
.venv\Scripts\activate
```
#### b. Installer les dépendances Python
```bash
pip install -r requirements.txt
```
#### c. Démarrer le serveur Ollama
Ouvrez un nouveau terminal et démarrez le service Ollama :
```bash
ollama serve
```
#### d. Télécharger le modÚle LLM (ex. Mistral)
Toujours dans ce terminal :
```bash
ollama run mistral
```
#### e. Configuration du endpoint du llm du RAG:
Assurez vous d'abord que dans le fichier configuration rag_config.yaml vous avez bien:
rag / llm / endpoint: "http://localhost:11434/api/generate"
#### f. Lancer lâapplication Flask
Revenez au terminal principal et exécutez :
```bash
python app.py
```
AccĂ©dez ensuite Ă lâinterface via : [http://localhost:5000](http://localhost:5000)
---
## đ Extraction & PrĂ©paration du Corpus
Le notebook `prepare_corpus/process_pdf.ipynb` extrait les aphorismes depuis le PDF et les prépare pour le RAG :
### đ Ătapes Principales
1. **Téléchargement du PDF**
2. **Nettoyage du texte** (mots coupés, erreurs de numérotation)
3. **Extraction structurée** des aphorismes
4. **Segmentation adaptée au RAG** :
- < 450 caractĂšres â conservĂ© tel quel
- 450â800 â divisĂ© en 2 parties
- > 800 â divisĂ© en 3 parties avec chevauchement
### â
Format Final pour le RAG
Chaque document inclut :
- Un identifiant unique (`s1.aph_01.p100`)
- Le texte segmenté
- Des métadonnées (section, page, source)
---
## đ ïž Configuration du SystĂšme RAG
Fichier central : `rag_config.yaml`
### đ„ïž Application Flask
| 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"`|
### đ Moteur RAG
| 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` |
### đ€ LLM (ModĂšle de GĂ©nĂ©ration)
| 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 |
### đ SĂ©curitĂ©
Balises HTML autorisées : `
`, `
`, ``, ``, ``, ``
Protection contre XSS via `bleach`.
---
## đ§ ImplĂ©mentation du Moteur RAG
Classe principale : `HippocRAG_FAISS`
### đ§ FonctionnalitĂ©s
- Encodage sémantique via `SentenceTransformer`
- Indexation rapide avec `FAISS`
- Génération de réponses via LLM externe
- Configuration flexible via YAML
### đ EntrĂ©es attendues
- `data/hippocrate_rag_data.json` : données segmentées
- `hippocrate.index` : index FAISS précalculé
---
## đ Interface Web
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 |
Interface web :

---
## đ Licence
MIT License â Voir le fichier [LICENSE](LICENSE)
---
## đ§âđ» Auteur
*Michel Douglas P*
Ingénieur ML.