Aller au contenu principal
Droit du travail RAG · IA générative Recherche hybride Corpus juridique En production

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.

395
Articles indexés
11 titres · 39 chapitres
30
Tests d'intégration
0 échec
768
Dimensions vectorielles
pgvector · cosine similarity
Live
Statut
Supabase · Render · Vercel
01

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.

02

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.

03

Analyse

Trois problèmes distincts ont été décomposés pour structurer la solution :

A

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.

B

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.

C

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é.

04

Solution conçue

Une plateforme documentaire en cinq modules complémentaires : navigation arborescente du corpus, recherche hybride texte + sémantique, assistant IA avec RAG et citations obligatoires, calculateur IRSA 2026, et back-office avec journal d'audit.
Module 1 — Navigation arborescente du corpus

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.

Module 2 — Recherche hybride (texte + sémantique)

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.

Module 3 — Assistant IA avec RAG sourcé

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.

Module 4 — Calculateur IRSA 2026

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.

05

Architecture système

Entrée

Navigateur
HTTPS

Frontend · Vercel

SvelteKit 5 + TypeScript

SSR · Tailwind CSS v4 · 12 routes

API REST · JSON

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

PDF

officiel

→

PyMuPDF

extraction

→

Chunking

80–400 tokens

→

Embeddings

768 dim

→

pgvector

indexé

06

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é.

1

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.

2

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.

3

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.

4

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.

5

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.

6

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.

7

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.

07

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.

Moteur 1

Full-text Search

PostgreSQL tsvector + unaccent. Idéal pour les requêtes exactes : "Article 39", "préavis", "licenciement abusif".

FTS · langue française
Score final

α × FTS + (1-α) × vec

α = 0,5 par défaut

configurable via env
Moteur 2

Recherche vectorielle

pgvector (cosine) sur embeddings 768 dim. Idéal pour les paraphrases : "comment quitter son emploi" → article sur la démission.

ivfflat · gemini-embedding-001

Filtres structurés disponibles

Par titre (1 à 11) Par chapitre Par numéro d'article exact Par thème transversal
08

Stack technique

Décisions techniques — choix retenus

LLM
Gemini 2.5 Flash vs Claude, Mistral

API gratuite, grand contexte, excellent français, même clé que les embeddings

Embeddings
gemini-embedding-001 vs sentence-transformers local

Même clé API, 768 dim, pas de modèle local à maintenir

Vecteurs
pgvector dans PostgreSQL vs Pinecone, Weaviate

Un seul service, même base pour FTS + vecteurs, pas de service externe supplémentaire

Frontend
SvelteKit 5 vs Next.js, Nuxt

SSR natif, bundle léger, TypeScript strict, DX supérieure pour ce type d'application

Python

Backend

API

FastAPI

Backend async

PostgreSQL

+ pgvector

LLM

Gemini 2.5

Flash · Google

Sv

SvelteKit

Frontend

TypeScript

Strict

Tailwind v4

CSS

SA

SQLAlchemy

async ORM

Docker

Dev local

PDF

PyMuPDF

Ingestion

09

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.