Code du travail malgache Plateforme IA documentaire — Loi n°2024-014
Rendre un corpus juridique de 395 articles réellement interrogeable : recherche hybride texte + sémantique, assistant IA qui cite systématiquement ses sources, et refus explicite de toute question hors périmètre.
Contexte
En 2024, Madagascar adopte la Loi n°2024-014 portant nouveau Code du travail — une refonte majeure du cadre normatif qui régit l'ensemble des relations employeurs-salariés dans le pays. Le texte compte 395 articles, structurés en 11 titres et 39 chapitres.
Pour les DRH, juristes d'entreprise, responsables conformité et employeurs, ce corpus est une référence quotidienne : rupture de contrat, calcul du préavis, congés, licenciement abusif, droits syndicaux. Pourtant, le seul format disponible est un PDF officiel dense, sans structure navigable, sans moteur de recherche sémantique.
La consultation se résumait à une recherche Ctrl+F dans un document de 200 pages — et une connaissance préalable du vocabulaire exact du législateur malgache, ce qui n'est précisément pas ce que l'on peut attendre d'un manager ou d'un chef d'entreprise.
Problème identifié
Comment permettre à un non-juriste d'interroger un corpus de droit du travail en langage naturel, avec des réponses fiables et des sources vérifiables ?
Un LLM seul hallucine sur du droit : il invente des articles, cite des numéros inexistants, confond des législations. Une recherche plein texte seule rate les questions sémantiques. Et un PDF statique est simplement inutilisable à grande échelle.
Analyse
Trois problèmes distincts ont été décomposés pour structurer la solution :
Navigabilité — corpus non structuré
Le PDF officiel ne propose pas d'arborescence navigable. Retrouver un article sur le préavis en cas de démission suppose de connaître à l'avance dans quel titre et chapitre il se trouve — ce que personne ne sait par défaut.
Recherche lexicale — manque de compréhension sémantique
La recherche plein texte (FTS) trouve "licenciement" mais rate "rupture du contrat à l'initiative de l'employeur". Une requête en langage naturel — "combien de temps de préavis ?" — exige une compréhension de l'intention, pas une correspondance de mots-clés.
Fiabilité IA — hallucinations sur corpus juridique
Un LLM non ancré invente des articles, confond des législations, produit des réponses plausibles mais fausses. Dans un contexte juridique, une réponse non sourcée est pire qu'une absence de réponse.
La solution découle directement de cette décomposition : arborescence structurée pour la navigabilité, recherche hybride FTS + vectorielle pour la couverture sémantique, RAG avec citations obligatoires pour la fiabilité.
Solution conçue
L'intégralité du Code est accessible via une arborescence à trois niveaux : 11 titres → 39 chapitres → 395 articles. Chaque article dispose de sa propre page avec contexte structurel (titre, chapitre, article précédent/suivant) et un fil d'Ariane complet.
L'extraction du PDF officiel (PyMuPDF) a requis la normalisation de trois patterns d'articles différents (Article X, Article premier, Art. X) et la déduplication des titres détectés sur plusieurs pages.
La recherche combine deux moteurs : PostgreSQL FTS avec tsvector (accents normalisés via unaccent) pour la précision lexicale, et pgvector avec similarité cosine pour la compréhension sémantique. Un score final pondéré (α = 0,5 par défaut, configurable) fusionne les deux classements.
Filtres structurés disponibles par titre, chapitre ou numéro d'article exact. La palette de recherche rapide est accessible par raccourci clavier depuis n'importe quelle page.
L'assistant est fondé exclusivement sur la Loi n°2024-014 — aucune autre source normative. Chaque réponse cite les articles utilisés avec leur numéro et leur intitulé. Si la réponse n'est pas dans le corpus, le système le dit explicitement.
13 mots-clés hors périmètre (divorce, code civil, fiscalité, succession…) déclenchent un refus explicite avant même d'interroger le LLM. Les salutations sont détectées et traitées sans déclencher le pipeline RAG complet.
Outil fiscal distinct du corpus du Code du travail, fondé sur la Loi de Finances 2026. Barème progressif à 6 tranches (0 % → 25 % au-delà de 4 000 000 Ar/mois), cotisations CNAPS + OSTIE plafonnées, réduction par personne à charge.
Interface avec slider interactif, décomposition visuelle brut/IRSA/net, count-up animé, et comparaison automatique 2025 vs 2026 pour le salaire saisi.
Architecture système
Entrée
Frontend · Vercel
SvelteKit 5 + TypeScript
SSR · Tailwind CSS v4 · 12 routes
Backend · Render
FastAPI + SQLAlchemy async
8 routes · Pydantic v2 · Prometheus /metrics
Base de données · Supabase
PostgreSQL 16 + pgvector
tsvector FTS · ivfflat cosine · 11 tables
LLM · Google AI Studio
Gemini 2.5 Flash
Température 0,1 · 1 024 tokens max
Pipeline d'ingestion — one-shot
officiel
PyMuPDF
extraction
Chunking
80–400 tokens
Embeddings
768 dim
pgvector
indexé
Pipeline RAG — assistant sourcé
L'assistant IA est le module le plus exigeant techniquement. Chaque question traverse un pipeline de sept étapes avant qu'une réponse soit générée — pour garantir la pertinence et la fiabilité.
Détection salutations / chitchat
Si la question est un message conversationnel ("bonjour", "merci"), une réponse d'accueil est retournée directement — sans déclencher le pipeline RAG coûteux.
Détection hors périmètre
13 mots-clés identifient les questions hors scope (divorce, code civil, succession, fiscalité…). Un refus explicite est retourné immédiatement, sans appel LLM.
Recherche hybride — top K articles
La question est vectorisée et soumise simultanément à PostgreSQL FTS et pgvector. Les scores sont fusionnés (α-pondérés) pour retenir les K articles les plus pertinents.
Seuil de pertinence (RAG_THRESHOLD = 0,15)
Si le score maximal des résultats est inférieur au seuil, le système reconnaît que la question n'est pas couverte par le corpus et le dit explicitement — plutôt que d'inventer une réponse.
Construction du prompt avec contexte
Les articles récupérés sont injectés dans le prompt system. L'historique de la conversation (6 messages max) est inclus pour maintenir la cohérence du dialogue.
Génération — Gemini 2.5 Flash (t° 0,1)
La faible température garantit des réponses factuelle et stables. La consigne système interdit toute information non présente dans les articles fournis.
Réponse + sources + questions de suivi
Le retour inclut la réponse, les articles sources (numéro + intitulé), un score de confiance, et 3 questions de suivi générées automatiquement par Gemini pour approfondir.
Recherche hybride — deux moteurs, un score
La recherche hybride est le cœur technique de la plateforme. Elle combine deux approches complémentaires pour couvrir à la fois les requêtes exactes et les questions en langage naturel.
Full-text Search
PostgreSQL tsvector + unaccent. Idéal pour les requêtes exactes : "Article 39", "préavis", "licenciement abusif".
α × FTS + (1-α) × vec
α = 0,5 par défaut
Recherche vectorielle
pgvector (cosine) sur embeddings 768 dim. Idéal pour les paraphrases : "comment quitter son emploi" → article sur la démission.
Filtres structurés disponibles
Stack technique
Décisions techniques — choix retenus
API gratuite, grand contexte, excellent français, même clé que les embeddings
Même clé API, 768 dim, pas de modèle local à maintenir
Un seul service, même base pour FTS + vecteurs, pas de service externe supplémentaire
SSR natif, bundle léger, TypeScript strict, DX supérieure pour ce type d'application
Python
Backend
FastAPI
Backend async
PostgreSQL
+ pgvector
Gemini 2.5
Flash · Google
SvelteKit
Frontend
TypeScript
Strict
Tailwind v4
CSS
SQLAlchemy
async ORM
Docker
Dev local
PyMuPDF
Ingestion
Résultats
Corpus intégral navigable — 395 articles accessibles via arborescence interactive, chaque article dans son contexte structurel complet (titre, chapitre, article précédent/suivant).
Recherche hybride opérationnelle — FTS + vectorielle avec score α-pondéré. Couvre à la fois les requêtes exactes et les questions en langage naturel sur des paraphrases.
Assistant IA à sources citées — aucune réponse sans citation d'article. Refus explicite hors périmètre. 3 questions de suivi générées automatiquement. Zéro hallucination sur le corpus testé.
30 tests d'intégration — 0 échec — couverture des routes critiques : recherche, articles, assistant, analytics, admin, health.
Déploiement production à coût zéro — Supabase (PostgreSQL 16 + pgvector) + Render (API FastAPI) + Vercel (SvelteKit). Infrastructure scalable et maintenable.
Calculateur IRSA 2026 — barème progressif complet, cotisations CNAPS + OSTIE, comparaison 2025 vs 2026, utilisable indépendamment du corpus juridique.
Leçon de conception
Ce projet illustre une contrainte fondamentale de l'IA appliquée au droit : la confiance ne se construit pas avec un LLM puissant — elle se construit avec un LLM ancré, à source unique, avec un périmètre explicitement borné. L'architecture RAG n'est pas ici un choix de performance : c'est un choix d'intégrité. Un système qui dit "je ne sais pas" ou "hors périmètre" est plus utile qu'un système qui invente une réponse plausible.
Le défi technique le plus significatif n'a pas été le LLM — c'est l'extraction et la normalisation du corpus PDF officiel, qui présentait trois formats d'articles différents et des structures de titres dupliquées entre les pages. C'est souvent ainsi : la qualité du corpus détermine la qualité du système.