# Madagascar RAG
Système de Retrieval-Augmented Generation répondant à des questions en
français ou en anglais, exclusivement à partir du contenu de la page
Wikipedia Madagascar.
## 1. Architecture
```
Question (FR/EN)
│
▼
┌─────────────────┐
│ HybridRetriever │ dense (embeddings multilingues) + BM25 (lexical)
└────────┬─────────┘ fusion par Reciprocal Rank Fusion (RRF)
▼
┌─────────────────┐
│ Cross-encoder │ re-ranking du top-N sur la paire (question, chunk)
│ reranker │
└────────┬─────────┘
▼
┌─────────────────┐
│ Générateur LLM │ LLM via OpenRouter (modèle gratuit), prompt
│ │ strict "réponds uniquement à partir du
│ │ contexte, cite la section, refuse si absent"
└────────┬─────────┘
▼
Réponse + sources + statut "trouvé / non trouvé"
```
**Ingestion (une fois, en amont)** :
```
API Wikipedia (action=parse)
│ HTML rendu de l'article
▼
Nettoyage (BeautifulSoup) : suppression refs [1], sections hors
périmètre (References, See also...), bruit CSS
│
▼
Chunking à deux voies :
- Texte narratif -> découpage par section + sous-découpage par
taille avec chevauchement
- Tableaux -> "row-as-document" (une ligne = un chunk) + "table
complète" en Markdown (pour les questions de synthèse)
│
▼
Chunks (JSONL) --> embeddings multilingues --> Chroma (persistant)
```
### Arborescence
```
madagascar-rag/
├── src/
│ ├── config.py # toute la configuration centralisée
│ ├── models.py # dataclass Chunk / ChunkType
│ ├── pipeline.py # façade RagPipeline (question -> réponse)
│ ├── ingestion/
│ │ ├── fetch_wikipedia.py # appel API Wikipedia
│ │ ├── cleaner.py # nettoyage HTML
│ │ ├── chunker.py # découpage texte + tableaux
│ │ └── pipeline.py # orchestration ingestion + sauvegarde JSONL
│ ├── indexing/
│ │ ├── embeddings.py # wrapper modèle d'embeddings multilingue
│ │ └── vector_store.py # wrapper Chroma
│ ├── retrie …