Aller au contenu
Paul Azeufack

Tous les projets

Assistant RAG sur la loi n° 2024/016 (état civil)

Un assistant qui répond aux questions sur la loi camerounaise du 23 décembre 2024 sur l'état civil, en citant les articles utilisés, et qui refuse quand la réponse n'est pas dans le texte.

Statut
démonstrateur
Contexte
Projet personnel
Stack
Python · Flask · HTMX · fastembed · NumPy · Gemini · pytest
Tags
RAGÉvaluationPython

Démonstrateur · open source (MIT) · à installer en local

Contexte

La loi n° 2024/016 du 23 décembre 2024 organise l’enregistrement des faits d’état civil au Cameroun. Pour répondre à une question précise, un délai par exemple, il faut souvent suivre la réponse d’article en article (délai normal, délais supplémentaires, jugement déclaratif). Je voulais un assistant qui réponde à partir du seul texte public de la loi, cite ses sources et refuse plutôt que d’inventer.

Ce que j’ai construit

  • Recherche des passages exécutée en local : embeddings multilingual-e5-large, un BM25 écrit à la main avec racinisation française, et un accès direct aux articles cités par leur numéro (« article 36 » renvoie toujours l’article 36). Les rangs sont fusionnés par RRF.
  • Génération avec Gemini à partir des 8 passages retenus : la réponse doit citer au moins un article, et seulement des articles présents dans ces passages. Sinon, l’assistant redemande une fois en expliquant le problème, puis refuse.
  • Refus sans appel au modèle quand aucun passage n’est assez proche de la question (similarité inférieure à 0,80), sauf si un article est cité par son numéro. Le seuil et le nombre de passages viennent de l’évaluation de la recherche.
  • Interface web Flask et HTMX, et API JSON. Chaque article cité ouvre son texte exact et sa page dans le PDF officiel.
  • Embeddings, index vectoriel et modèle de langage derrière des interfaces : un autre fournisseur s’ajoute avec une classe.
  • Évaluation sur 21 questions de référence : recherche directe d’un article, questions en cascade, formulation familière, questions hors sujet ou hors de la loi, consigne cachée dans la question.

Choix mesurés

8 passages plutôt que 5 (avec 5, la question sur le délai de déclaration d’une naissance perd l’article 13). Seuil à 0,80 (la question légitime la plus éloignée est à 0,852, la question hors sujet la plus proche à 0,793). BM25 écrit à la main, car la bibliothèque n’est plus maintenue.

Évaluation

  • Sur les 21 questions, avec gemini-3.5-flash-lite (le plus petit modèle de la gamme) : 12 réponses correctes, 6 partielles, 2 à relire, 1 tolérée, aucun échec. L’assistant n’a inventé aucune réponse.
  • Les trois questions hors sujet, dont une consigne cachée dans la question, sont refusées par le seuil, sans appel au modèle. La question dont la réponse n’est pas dans la loi est refusée par le modèle.
  • Les 6 réponses partielles portent sur des questions en cascade : le modèle donne la première partie de la réponse et oublie la suite, alors que l’information était dans les passages fournis. Les articles cités restent affichés pour lire la suite.
Réponse de l'assistant à la question « Qu'est-ce que le NIPU ? », avec les articles 3 et 81 de la loi cités