An open API service indexing awesome lists of open source software.

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

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](https://img.shields.io/github/license/micheldpd/rag_aph_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 :
    ![Interface Web - illustration avec un exemple de réponse](img/interface_reponse.png)

    ---

    ## 📄 Licence

    MIT License – Voir le fichier [LICENSE](LICENSE)

    ---

    ## đŸ§‘â€đŸ’» Auteur

    *Michel Douglas P*
    Ingénieur ML.