{"id":28577632,"url":"https://github.com/micheldpd24/rag_aph_hippocrate","last_synced_at":"2026-04-04T21:33:30.850Z","repository":{"id":293240901,"uuid":"981989313","full_name":"micheldpd24/rag_aph_hippocrate","owner":"micheldpd24","description":"RAG / Chatbot IA sur les Aphorismes d'Hippocrate","archived":false,"fork":false,"pushed_at":"2025-05-29T13:58:40.000Z","size":467,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-08T21:58:23.336Z","etag":null,"topics":["assistant-ia","docker","faiss-cpu","flask","hippocrate","llm","medecine-ancienne","mistral","ollama","pymupdf-fitz","rag","rag-chatbot"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/micheldpd24.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-12T07:58:54.000Z","updated_at":"2025-06-07T14:04:07.000Z","dependencies_parsed_at":"2025-05-14T11:45:46.765Z","dependency_job_id":"5c02257e-aa44-4d99-b695-09f6bc79d580","html_url":"https://github.com/micheldpd24/rag_aph_hippocrate","commit_stats":null,"previous_names":["micheldpd24/rag_aph_hippocrate"],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/micheldpd24/rag_aph_hippocrate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micheldpd24%2Frag_aph_hippocrate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micheldpd24%2Frag_aph_hippocrate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micheldpd24%2Frag_aph_hippocrate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micheldpd24%2Frag_aph_hippocrate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/micheldpd24","download_url":"https://codeload.github.com/micheldpd24/rag_aph_hippocrate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/micheldpd24%2Frag_aph_hippocrate/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31415110,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assistant-ia","docker","faiss-cpu","flask","hippocrate","llm","medecine-ancienne","mistral","ollama","pymupdf-fitz","rag","rag-chatbot"],"created_at":"2025-06-11T00:38:45.816Z","updated_at":"2026-04-04T21:33:30.813Z","avatar_url":"https://github.com/micheldpd24.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🏛️ Assistant Hippocratique : RAG basé sur les Aphorismes d'Hippocrate  \n\u003e “Je jure par Apollon médecin, par Asclépios, Hygie et Panacée…”  \n\u003e — Serment d’Hippocrate\n\n[![License](https://img.shields.io/github/license/micheldpd/rag_aph_hippocrate)](LICENSE)\n\n🧠 Explorez les fondements de la médecine occidentale grâce à un système **RAG (Retrieval-Augmented Generation)** moderne, alimenté par les *Aphorismes d’Hippocrate*.\n\n---\n\n## 🎯 Objectifs du Projet\n\n- ✨ Explorer un corpus historique de textes médicaux anciens.\n- 🧠 Utiliser le **RAG** pour faciliter l’apprentissage interactif des textes classiques.\n- 📚 Mettre en avant les principes hippocratiques via une interface numérique moderne.\n- 🧑‍⚕️ Inspirer une approche pédagogique de la redécouverte des textes médicaux anciens.\n\n---\n\n## ⚖️ Enjeux Pédagogiques et Éducatifs\n\n### 🧑‍🏫 Vulgarisation des textes fondateurs\n- Permet aux utilisateurs d’explorer les bases de la médecine antique.\n- Encourage une réflexion critique à travers l’analyse des textes originaux.\n- Facilite la compréhension de l’évolution de la pensée médicale.\n\n### 📚 Apprentissage Interactif\n- Méthode active : poser des questions et recevoir des réponses contextualisées.\n- Développe la compétence \"recherche + synthèse\" via un assistant IA.\n- Favorise l’autonomie dans l’étude des textes classiques.\n\n### 🧠 Référentiel Sémantique Médical Ancien\n- Exploration du langage médical ancien via NLP.\n- Première étape vers la création de référentiels sémantiques historiques.\n- Ouvre la voie à l'analyse d'autres œuvres majeures (Galien, Avicenne, etc.).\n\n### 💡 Exemple Concret d’un RAG Appliqué à un Corpus de Médécine Ancienne\n- Démonstration pratique de la chaîne complète RAG, du PDF au serveur web.\n- Documentation pédagogique claire et reproductible.\n\n---\n\n## 🗂 Structure du Projet\n\n```\n.\n├── data/\n│   ├── hippocrates_questions.json  # Questions prédéfinies\n│   └── hippocrate_rag_data.json    # Données préparées pour le RAG\n├── models/\n│   └── config_schema.py            # Schéma Pydantic de configuration\n├── prepare_corpus/\n│   └── process_pdf.ipynb           # Notebook d'extraction du PDF\n├── rag/\n│   └── hippocrag.py                # Moteur RAG principal\n├── templates/\n│   └── index.html                  # Template Jinja2 de l’interface\n├── app.py                          # Point d’entrée Flask\n├── config_loader.py                # Chargement du YAML\n├── Dockerfile                      # Définition du conteneur\n├── docker-compose.yml              # Orchestration\n├── rag_config.yaml                 # Fichier de configuration global\n├── requirements.txt                # Dépendances python pour exécuter le projet dans un conteneur docker\n└── requirements_pjt.txt            # Dépendances Python pour executer le projet en local\n```\n\n---\n\n## 🤖 Fonctionnement Technique\n\n### 🧠 Base de Connaissances\nLes *Aphorismes d’Hippocrate* proviennent de :\n- **Titre** : *Aphorismes d'Hippocrate*, traduits par Émile Littré  \n- **Format numérique** : PDF issu de [archive.org](https://archive.org/details/aphorismesdhippo00hipp)  \n- **Pages traitées** : 96 à 260 (traduction française principale)\n\nIls sont découpés et stockés dans :\n- `data/hippocrate_rag_data.json`  \n- Et indexés avec **FAISS** après encodage sémantique via **Sentence-BERT** (`sentence-camembert-large`).\n\n### 🔍 Recherche Vectorielle\nÀ chaque question posée :\n1. La requête est encodée en vecteur.\n2. Une recherche par plus proches voisins est effectuée dans l’index FAISS.\n3. Les passages pertinents sont récupérés.\n\n### 🧾 Génération de Réponse\nLa 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.\n\n### 📊 Diagramme du Workflow RAG\n\n```mermaid\ngraph TD\n    A(Question utilisateur) --\u003e B(Encodage vectoriel *CamemBERT*)\n    B --\u003e C(Recherche dans l'*index FAISS*)\n    C --\u003e D(Récupération des chunks pertinents)\n    D --\u003e E(Appel LLM *Mistral* → réponse générée)\n```\n\n---\n\n### 🧾 Explication détaillée des étapes\n\n1. **[Question utilisateur]**  \n   - L'utilisateur pose une question en langage naturel.\n   - Exemple : *\"Quel est le rôle du régime dans la santé selon Hippocrate ?\"*\n\n2. **[Encodage vectoriel (CamemBERT)]**\n   - La question est encodée en vecteur grâce à un modèle sémantique comme **CamemBERT** ou **Sentence CamemBERT large**.\n   - Permet de comparer la requête aux embeddings précalculés des aphorismes.\n\n3. **[Recherche dans index FAISS]**\n   - Le moteur de recherche vectorielle (FAISS) compare le vecteur de la question avec les embeddings stockés dans l’index.\n   - Retourne les `top_k` passages les plus proches (ex: 6 fragments).\n\n4. **[Récupération des chunks pertinents]**\n   - Les textes associés aux vecteurs trouvés sont récupérés depuis la base JSON.\n   - Ces chunks contiennent les informations nécessaires pour répondre à la question.\n\n5. **[Appel LLM (Mistral) → réponse générée]**\n   - Un prompt est construit à partir de la question et des contextes trouvés.\n   - Le LLM (`mistral`, via Ollama) génère une réponse structurée en français.\n   - Réponse renvoyée à l’utilisateur sous forme HTML ou texte brut.\n\n---\n\n## 🧰 Technologies Utilisées\n\n| Technologie       | Usage |\n|------------------|-------|\n| Flask             | Backend API Web |\n| Bootstrap 5.3     | Interface responsive |\n| Sentence-BERT     | Encodage sémantique |\n| FAISS             | Indexation vectorielle |\n| Mistral (Ollama)  | Génération de réponses |\n| Docker            | Déploiement portable |\n| Bleach            | Sécurisation HTML |\n\n---\n\n## 📦 Prérequis\n\n### ✅ Logiciels requis\n- **Python 3.9+**\n- **Docker** *(optionnel mais recommandé)*\n- **Ollama** *(ou autre LLM compatible via API)*\n- **Git** *(facultatif)*\n\n### 💻 Configuration Matérielle Recommandée\n- **Processeur** : architecture moderne (x86 ou ARM comme M1/M2/M4)\n- **RAM** : minimum 16 Go, idéalement 24 Go\n- **Stockage** : espace disque suffisant (~5–10 Go)\n\n✅ **Testé avec succès** sur un Mac M4 avec 24 Go de RAM, Python 3.11, Docker Desktop et Ollama.\n\n---\n\n## 🚀 Démarrage rapide\n\n### 1. 🧬 Cloner le dépôt distant\n\nCommencez par cloner le dépôt GitHub sur votre machine locale :\n\n```bash\ngit clone https://github.com/micheldpd24/rag_aph_hippocrate.git\ncd rag_aph_hippocrate\n```\n\n---\n\n### 2. 🐳 Avec Docker Compose (Recommandé)\n\nAssurer vous d'abord que dans le fichier configuration rag_config.yaml nous avons bien:\nrag: llm: endpoint: \"http://ollama:11434/api/generate\"\n\nLancez l’application en une seule commande grâce à Docker Compose :\n\n```bash\ndocker compose up --build\n```\n\nTélécharger et lancer le modèle llm mistral\n```bash\nollama run mistral\n```\n\nL’application sera accessible à l’adresse : [http://localhost:5000](http://localhost:5000)\n\n---\n\n### 3. 💻 En mode développement local\n\n#### a. Préparer l’environnement virtuel\n\n```bash\npython -m venv .venv\n```\n\nSous macOS / Linux :\n```bash\nsource .venv/bin/activate\n```\n\nSous Windows (CMD) :\n```bash\n.venv\\Scripts\\activate\n```\n\n#### b. Installer les dépendances Python\n\n```bash\npip install -r requirements.txt\n```\n\n#### c. Démarrer le serveur Ollama\n\nOuvrez un nouveau terminal et démarrez le service Ollama :\n\n```bash\nollama serve\n```\n\n#### d. Télécharger le modèle LLM (ex. Mistral)\n\nToujours dans ce terminal :\n\n```bash\nollama run mistral\n```\n\n#### e. Configuration du endpoint du llm du RAG:\n\nAssurez vous d'abord que dans le fichier configuration rag_config.yaml vous avez bien:\nrag / llm / endpoint: \"http://localhost:11434/api/generate\"\n\n#### f. Lancer l’application Flask\n\nRevenez au terminal principal et exécutez :\n\n```bash\npython app.py\n```\n\nAccédez ensuite à l’interface via : [http://localhost:5000](http://localhost:5000)\n\n\n---\n\n## 📊 Extraction \u0026 Préparation du Corpus\n\nLe notebook `prepare_corpus/process_pdf.ipynb` extrait les aphorismes depuis le PDF et les prépare pour le RAG :\n\n### 📄 Étapes Principales\n1. **Téléchargement du PDF**\n2. **Nettoyage du texte** (mots coupés, erreurs de numérotation)\n3. **Extraction structurée** des aphorismes\n4. **Segmentation adaptée au RAG** :\n   - \u003c 450 caractères → conservé tel quel\n   - 450–800 → divisé en 2 parties\n   - \u003e 800 → divisé en 3 parties avec chevauchement\n\n### ✅ Format Final pour le RAG\nChaque document inclut :\n- Un identifiant unique (`s1.aph_01.p100`)\n- Le texte segmenté\n- Des métadonnées (section, page, source)\n\n---\n\n## 🛠️ Configuration du Système RAG\n\nFichier central : `rag_config.yaml`\n\n### 🖥️ Application Flask\n| Paramètre        | Valeur par défaut          |\n|------------------|----------------------------|\n| `name`           | `\"HippocRAG\"`              |\n| `debug`          | `true`                     |\n| `host`           | `\"0.0.0.0\"`                |\n| `port`           | `5000`                     |\n| `secret_key`     | `\"change_this_secret\"`     |\n| `data_dir`       | `\"data\"`                   |\n| `cache_dir`      | `\"cache\"`                  |\n| `question_cache_file` | `\"questions_cache.json\"`|\n\n### 🔍 Moteur RAG\n| Paramètre             | Valeur par défaut                        |\n|-----------------------|------------------------------------------|\n| `model.name`          | `\"dangvantuan/sentence-camembert-large\"`|\n| `normalize_embeddings`| `true`                                   |\n| `index.json_path`     | `\"data/hippocrate_rag_data.json\"`        |\n| `faiss_path`          | `\"hippocrate.index\"`                     |\n| `build_on_startup`    | `true`                                   |\n| `top_k`               | `6`                                      |\n\n### 🤖 LLM (Modèle de Génération)\n| Paramètre   | Valeur par défaut / Description                                                                 |\n|-------------|--------------------------------------------------------------------------------------------------|\n| `provider`  | `\"ollama\"`\u003cbr\u003e→ Fournisseur du modèle LLM utilisé                                               |\n| `endpoint`  | - Local : `\"http://localhost:11434/api/generate\"`\u003cbr\u003e→ Si lancé manuellement sur la machine\u003cbr\u003e\u003cbr\u003e- Container : `\"http://ollama:11434/api/generate\"`\u003cbr\u003e→ Si lancé via Docker Compose |\n| `model`     | `\"mistral\"`\u003cbr\u003e→ Modèle LLM utilisé pour générer les réponses                                  |\n\n### 🔐 Sécurité\nBalises HTML autorisées : `\u003cp\u003e`, `\u003ch4\u003e`, `\u003cul\u003e`, `\u003cem\u003e`, `\u003cstrong\u003e`, `\u003cblockquote\u003e`  \nProtection contre XSS via `bleach`.\n\n---\n\n## 🧠 Implémentation du Moteur RAG\n\nClasse principale : `HippocRAG_FAISS`\n\n### 🔧 Fonctionnalités\n- Encodage sémantique via `SentenceTransformer`\n- Indexation rapide avec `FAISS`\n- Génération de réponses via LLM externe\n- Configuration flexible via YAML\n\n### 📁 Entrées attendues\n- `data/hippocrate_rag_data.json` : données segmentées\n- `hippocrate.index` : index FAISS précalculé\n\n---\n\n## 🌐 Interface Web\n\nApplication Flask interactive permettant :\n- De choisir un thème médical\n- De poser une question personnalisée\n- D’obtenir une réponse contextuelle construite à partir des aphorismes\n\nRoutes principales :\n| Route            | Méthode | Description |\n|------------------|---------|-------------|\n| `/`              | GET/POST| Page principale |\n| `/api/questions` | GET     | Charger des questions par thème |\n| `/reset-cache`   | POST    | Vider le cache des réponses |\n\n\nInterface web :\n![Interface Web - illustration avec un exemple de réponse](img/interface_reponse.png)\n\n---\n\n## 📄 Licence\n\nMIT License – Voir le fichier [LICENSE](LICENSE)\n\n---\n\n## 🧑‍💻 Auteur\n\n*Michel Douglas P*  \nIngénieur ML. ","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicheldpd24%2Frag_aph_hippocrate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmicheldpd24%2Frag_aph_hippocrate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmicheldpd24%2Frag_aph_hippocrate/lists"}