--- title: PolyglotRAG emoji: 🌍 colorFrom: blue colorTo: yellow sdk: docker app_port: 7860 pinned: false license: mit --- # 🌍 PolyglotRAG Assistant documentaire multilingue et **cross-lingue** : posez une question en anglais, français, russe, espagnol, arabe ou portugais, et obtenez une rĂ©ponse sourcĂ©e — mĂȘme si le document pertinent est rĂ©digĂ© dans une **autre** langue que la question. > Exemple : une question posĂ©e en **russe** retrouve un rĂšglement rĂ©digĂ© en > **français** et un rapport en **anglais**, puis PolyglotRAG rĂ©pond en russe > en citant les documents originaux — sans jamais traduire le corpus au > prĂ©alable. PropulsĂ© par **DeepSeek-V4.1-Flash** (gĂ©nĂ©ration) et **BAAI/bge-m3** (embeddings multilingues partagĂ©s), les deux via le routeur *Inference Providers* de Hugging Face — **un seul jeton d'API** suffit pour tout le projet. --- ## Sommaire - [FonctionnalitĂ©s](#fonctionnalitĂ©s) - [Architecture](#architecture) - [Optimisations de performance](#optimisations-de-performance) - [DĂ©marrage rapide (local, sans Docker)](#dĂ©marrage-rapide-local-sans-docker) - [Docker](#docker) - [DĂ©ploiement sur Hugging Face Spaces](#dĂ©ploiement-sur-hugging-face-spaces) - [Structure du dĂ©pĂŽt](#structure-du-dĂ©pĂŽt) - [Configuration](#configuration) - [Ingestion de vos propres documents](#ingestion-de-vos-propres-documents) - [Tests](#tests) - [Choix d'architecture assumĂ©s](#choix-darchitecture-assumĂ©s) - [Évolutions possibles](#Ă©volutions-possibles) ## FonctionnalitĂ©s - 🔎 DĂ©tection automatique de la langue de la question (hors-ligne, `lingua`). - đŸ“„ Ingestion PDF, DOCX, Markdown, HTML, CSV, avec langue/fichier/page/titre conservĂ©s par chunk. - 🌐 Recherche **cross-lingue** dans un espace sĂ©mantique multilingue partagĂ© (BGE-M3), avec 3 modes : global, filtrĂ© par langue, prioritĂ© locale. - 🧠 GĂ©nĂ©ration strictement source-grounded (mode strict / abstention si le score de confiance est trop faible). - 🈯 Interface **RTL** correcte pour l'arabe. - 📚 Citations systĂ©matiques : fichier, langue, page, score. - 📊 Page **Admin** : mĂ©triques du RAG (volume, latence, langues, taux d'abstention, historique des requĂȘtes). - đŸ—ïž Page **Architecture** : schĂ©ma complet du pipeline. - 🔐 Stockage vectoriel dans un **dataset privĂ© Hugging Face** (aucun service tiers Ă  hĂ©berger). - ⚡ **Cache** rĂ©ponses + embeddings de requĂȘtes, **recherche approximative (ANN / FAISS-HNSW)** et **top-k final limitĂ© Ă  2** — voir [Optimisations de performance](#optimisations-de-performance). - 🐳 **Dockerfile** fourni (image de production, utilisateur non-root, healthcheck) — exĂ©cution locale ou Space Hugging Face en SDK Docker. ## Architecture Voir l'onglet **Architecture** de l'application pour le schĂ©ma interactif. RĂ©sumĂ© : ``` Documents multilingues (knowledge_base//*) │ â–Œ Extraction PDF / DOCX / MD / HTML / CSV │ â–Œ DĂ©tection langue + mĂ©tadonnĂ©es (fichier, page, titre, sens RTL/LTR) │ â–Œ Chunking adaptĂ© Ă  la langue (dĂ©coupage par phrases + recouvrement) │ â–Œ Embeddings multilingues partagĂ©s — BAAI/bge-m3 (HF Inference Providers) │ â–Œ Dataset privĂ© Hugging Face (Parquet) ──â–ș chargĂ© en FAISS au dĂ©marrage │ â–Œ Question utilisateur ──â–ș dĂ©tection de langue ──â–ș recherche ANN cross-lingue (top-15, FAISS-HNSW) │ â–Œ Bonus langue + reranking (top-2 final) ──â–ș mode strict (seuil de confiance) │ â–Œ DeepSeek-V4.1-Flash (routeur HF) ──â–ș rĂ©ponse + citations + score │ â–Œ Cache rĂ©ponse (TTL) ──â–ș une question identique reposĂ©e pendant la fenĂȘtre de cache ne refait ni la recherche, ni l'appel LLM ``` ## Optimisations de performance Trois optimisations sont actives par dĂ©faut (`config.py` / `.env.example`) : | Optimisation | OĂč | DĂ©tail | |---|---|---| | **Cache** | `core/optimization/cache.py`, `core/pipeline.py` | Cache Ă  expiration (TTL, 10 min par dĂ©faut) sur (1) les embeddings de questions dĂ©jĂ  posĂ©es et (2) les rĂ©ponses complĂštes pour une question strictement identique (mĂȘme langue de rĂ©ponse, mĂȘme filtre). DĂ©sactivable via `ENABLE_CACHE=false`. | | **Recherche approximative (ANN)** | `core/retrieval/vector_store.py` | Index `FAISS IndexHNSWFlat` par dĂ©faut au lieu d'une recherche exacte (`IndexFlatIP`) : bien plus rapide dĂšs que le corpus grossit, sans Ă©tape d'entraĂźnement. RĂ©glable via `ANN_INDEX_TYPE` (`hnsw`/`flat`), `ANN_HNSW_M`, `ANN_EF_SEARCH`. | | **Top-k final rĂ©duit** | `config.py` (`TOP_K_FINAL=2`) | Seuls les **2 meilleurs passages** (aprĂšs bonus de langue et reranking) sont envoyĂ©s au LLM — moins de tokens de contexte, rĂ©ponse plus rapide et moins coĂ»teuse. `TOP_K_RETRIEVE=15` reste le pool de candidats initial avant ce filtrage final. | L'onglet **Admin** affiche en direct l'Ă©tat du cache (taille/capacitĂ©) et le type d'index vectoriel actif, pour vĂ©rifier que ces optimisations tournent bien en production. ## DĂ©marrage rapide (local, sans Docker) ```bash git clone polyglot-rag cd polyglot-rag python -m venv .venv && source .venv/bin/activate # Windows : .venv\Scripts\activate pip install -r requirements.txt cp .env.example .env # Éditez .env : renseignez HF_TOKEN (https://huggingface.co/settings/tokens) # 1. Ingestion des documents d'exemple (ou des vĂŽtres) -> index local python scripts/ingest.py --no-push # 2. Lancement de l'application python app.py ``` L'application s'ouvre sur `http://localhost:7860` avec les 3 onglets Chat / Architecture / Admin. ## Docker Image de production fournie (utilisateur non-root UID 1000, healthcheck, compatible Hugging Face Spaces en SDK Docker). ```bash cp .env.example .env # renseignez HF_TOKEN au minimum # Construction + lancement docker compose up --build # ou, sans docker compose : docker build -t polyglot-rag . docker run --rm -p 7860:7860 --env-file .env -v "$(pwd)/data:/app/data" polyglot-rag ``` Pensez Ă  ingĂ©rer vos documents avant (ou aprĂšs) le premier dĂ©marrage : ```bash docker compose run --rm polyglot-rag python scripts/ingest.py --no-push ``` L'application est alors disponible sur `http://localhost:7860`. ## DĂ©ploiement sur Hugging Face Spaces Le Space est un **Space Docker** : `README.md` dĂ©clare `sdk: docker` et `app_port: 7860`, et Hugging Face construit directement le `Dockerfile` fourni Ă  la racine — aucune configuration supplĂ©mentaire n'est nĂ©cessaire cĂŽtĂ© Space. **Option recommandĂ©e : notebook Colab fourni** (`PolyglotRAG_Deploy_HuggingFace.ipynb`). Il automatise tout : 1. Installation des dĂ©pendances. 2. Saisie sĂ©curisĂ©e de votre `HF_TOKEN` (jamais affichĂ© en clair). 3. CrĂ©ation du dataset privĂ© + ingestion des documents. 4. Publication du dataset privĂ© sur le Hub. 5. CrĂ©ation du Space en **SDK Docker** + injection du token en secret. 6. Publication du code de l'application (dont le `Dockerfile`). 7. Affichage de l'URL finale du Space (build Docker dĂ©clenchĂ© automatiquement par Hugging Face). **Option manuelle**, en ligne de commande : ```bash python scripts/ingest.py # pousse l'index vers HF_DATASET_REPO hf repos create /polyglot-rag --repo-type space --space_sdk docker huggingface-cli upload /polyglot-rag . --repo-type space # Puis, dans les Settings du Space : ajoutez les secrets HF_TOKEN et HF_DATASET_REPO ``` ## Structure du dĂ©pĂŽt ``` polyglot-rag/ ├── app.py # Point d'entrĂ©e Gradio (Chat / Architecture / Admin) ├── config.py # Configuration centralisĂ©e (variables d'env) ├── Dockerfile # Image de production (Space Docker + usage local) ├── docker-compose.yml # Confort de dĂ©veloppement local ├── .dockerignore ├── requirements.txt ├── .env.example ├── knowledge_base/ # Documents d'exemple (6 langues) — Ă  remplacer par les vĂŽtres │ ├── en/ fr/ ru/ es/ ar/ pt/ ├── core/ │ ├── ingestion/ # loaders, dĂ©tection de langue, chunking, indexeur │ ├── retrieval/ # embeddings, FAISS (ANN), recherche cross-lingue │ ├── generation/ # prompts, appel LLM │ ├── optimization/ # cache rĂ©ponses + embeddings (TTL) │ ├── pipeline.py # orchestration retrieval + gĂ©nĂ©ration + cache + mĂ©triques │ ├── metrics/ # journalisation SQLite pour l'Admin │ ├── ui/ # onglets Gradio (Chat, Admin, Architecture) │ └── assets/architecture.svg # schĂ©ma d'architecture ├── scripts/ingest.py # CLI d'ingestion / publication du dataset ├── tests/ # pytest (aucun test ne fait d'appel rĂ©seau) ├── data/ # cache local (index, mĂ©triques) — gitignored └── PolyglotRAG_Deploy_HuggingFace.ipynb ``` ## Configuration Toutes les options sont documentĂ©es dans `.env.example`. Point clĂ© : **un seul jeton, `HF_TOKEN`**, avec le scope *"Make calls to Inference Providers"* (+ *"Write"* si le Space doit aussi pousser/rafraĂźchir le dataset). CrĂ©ez-le sur [huggingface.co/settings/tokens](https://huggingface.co/settings/tokens). | Variable | RĂŽle | DĂ©faut | |---|---|---| | `HF_TOKEN` | Authentification unique (LLM, embeddings, dataset) | — (obligatoire) | | `HF_DATASET_REPO` | Dataset privĂ© contenant l'index | — | | `LLM_MODEL` | ModĂšle gĂ©nĂ©ratif | `deepseek-ai/DeepSeek-V4.1-Flash:fastest` | | `EMBEDDING_MODEL` | ModĂšle d'embeddings | `BAAI/bge-m3` | | `TOP_K_FINAL` | Passages envoyĂ©s au LLM | `2` | | `ANN_INDEX_TYPE` | `hnsw` (approximatif) ou `flat` (exact) | `hnsw` | | `ENABLE_CACHE` | Cache rĂ©ponses + embeddings de requĂȘtes | `true` | | `CACHE_TTL_SECONDS` | DurĂ©e de vie du cache | `600` | | `MIN_CONFIDENCE_SCORE` | Seuil d'abstention (mode strict) | `0.28` | | `ADMIN_PASSWORD` | ProtĂšge l'onglet Admin | vide (accĂšs libre) | ## Ingestion de vos propres documents 1. Placez vos fichiers dans `knowledge_base//` (`en`, `fr`, `ru`, `es`, `ar`, `pt`) — formats supportĂ©s : `.pdf`, `.docx`, `.md`, `.html`, `.csv`. 2. Lancez `python scripts/ingest.py` (pousse automatiquement vers `HF_DATASET_REPO` si dĂ©fini). 3. RedĂ©marrez le Space (ou rechargez la page) : l'index est reconstruit au dĂ©marrage Ă  partir du dataset privĂ©. ⚠ Les PDF scannĂ©s sans couche texte ne sont pas encore ocĂ©risĂ©s automatiquement — le loader signale les pages concernĂ©es (`[PAGE SANS TEXTE EXTRACTIBLE — OCR REQUIS]`) plutĂŽt que d'indexer du vide. ## Tests ```bash pip install pytest pytest ``` Tous les tests s'exĂ©cutent **hors-ligne** (un garde-fou dans `tests/conftest.py` fait Ă©chouer volontairement tout test qui tenterait un appel rĂ©seau rĂ©el vers l'API d'embeddings). ## Choix d'architecture assumĂ©s - **Pas de traduction systĂ©matique du corpus.** Chaque chunk garde son texte et sa langue d'origine ; seule la recherche passe par un espace d'embeddings partagĂ©. La traduction n'intervient jamais cĂŽtĂ© indexation. - **FAISS en mĂ©moire plutĂŽt qu'un service Qdrant externe.** Le dataset privĂ© Hugging Face joue le rĂŽle de stockage persistant (Parquet) ; l'index est reconstruit en mĂ©moire au dĂ©marrage du Space. Pour un corpus de quelques dizaines de milliers de chunks, c'est largement suffisant, et cela Ă©vite une seconde dĂ©pendance opĂ©rationnelle (donc une seconde clĂ© d'API) — cohĂ©rent avec la contrainte « un seul jeton Hugging Face ». - **DeepSeek-V4.1-Flash via le routeur *Inference Providers*.** Le modĂšle n'est pas dĂ©ployĂ©/hĂ©bergĂ© par ce projet : il est appelĂ© via `https://router.huggingface.co`, qui route vers un provider tiers (Novita Ă  ce jour) tout en facturant sur votre compte Hugging Face. Le qualificatif `:fastest` sur `LLM_MODEL` s'adapte automatiquement si le provider change. ## Évolutions possibles - Reranking cross-encoder dĂ©diĂ© (au lieu du bonus de score actuel). - Snapshot pĂ©riodique de la base de mĂ©triques vers le dataset HF (persistance au-delĂ  du cycle de vie du Space). - Agents spĂ©cialisĂ©s (routeur de langue, agent de rĂ©cupĂ©ration cross-lingue, agent terminologie/glossaire mĂ©tier, agent qualitĂ©) pour une architecture de type Corrective RAG multi-agent, comme dĂ©crit dans le document de cadrage du projet. - OCR automatique pour les PDF scannĂ©s.