CLAIR DocsCLAIR Docs
  • clair.vote
  • GitHub
  • Nous soutenir
Nous soutenir
  • Accueil
  • Plateforme & Guide
  • Données & Base de Données
  • Explorateur API
CLAIR

Plateforme citoyenne de transparence politique. Données 100% publiques, 0% d'opinion.

Explorer

  • Députés
  • Sénateurs
  • Groupes politiques
  • Sujets
  • Dossiers législatifs
  • Scrutins
  • Agenda
  • Lobbying

Ressources

  • Nous soutenir
  • À propos
  • Méthodologie
  • Contact
  • Comprendre
  • Guide pratique
  • API ouverte

Légal

  • Mentions légales
  • Confidentialité
  • CGU

© 2026 CLAIR. Sources : Assemblée nationale · Sénat · HATVP · Ministère de l'Intérieur · DILA

Vue d'ensembleCommandes CLIEnrichissement IAModèle PrismaOrchestrateur d'IngestionQualité des DonnéesSchémas ERDSources Open DataSuivi des Modifications
Données & Base de Données

Enrichissement par IA

CLAIR utilise l'API Mistral pour rédiger, à partir des données parlementaires brutes, des textes lisibles par un public non spécialiste : résumés de scrutins, de dossiers et de sujets, fiches de parlementaires. Tout texte généré est signalé sur le site (« Résumé généré par IA »), avec un lien vers la page de méthodologie.

Code : services/ingestion/src/workers/ia-enrichment.ts, workers/parlementaire-enrichment.ts, llm/prompts.ts, llm/mistral-client.ts.


🧩 Entités enrichies

EntitéColonnes écritesContenuDonnées fournies au modèle
Scrutinscrutins.resume_ia1 à 3 phrases : ce qui a été voté et ce que cela impliqueTitre, résultat, type de vote, objet, tags, titre du dossier, jusqu'à 3 amendements (exposé sommaire et dispositif), texte de l'article visé lorsqu'il est connu
Dossier législatifdossiers_legislatifs.resume_iaRésumé (3 à 5 phrases) puis positions des groupesTitre, procédure, état, scrutins clés, votes des groupes sur l'ensemble et article par article, amendements clés
Sujetsujets.label, sujets.resume, sujets.enjeuxTitre court sans sigle, résumé (3 à 5 phrases), enjeux et positions des groupesDossiers AN et Sénat du sujet avec leur état, votes des groupes sur l'ensemble et par article, présentés chambre par chambre quand les deux chambres ont voté, divergences entre les deux chambres
Sujet, par groupesujets.groupe_amendement_descriptions (JSON)1 à 2 phrases par groupe sur ce qu'il propose par ses amendementsAmendements déposés par chaque groupe
Parlementaireparlementaires.resume_ia, parcours_ia, positions_cles_ia, faits_notables_iaRésumé, parcours, positions clés, faits notablesIdentité, groupe, circonscription, statistiques d'activité, mandats et fonctions, actions de lobbying le ciblant, déclarations HATVP, biographie Wikipedia, faits datés Wikidata

Chaque entité porte aussi ia_content_hash (empreinte des données d'entrée) et ia_generated_at (date de génération). Les fiches parlementaires enregistrent en plus la provenance de leurs sources web dans ia_sources (URL et date de lecture de Wikipedia et Wikidata).

Positions des groupes. Lorsque les seuls votes disponibles portent sur des amendements, les prompts des dossiers et des sujets interdisent au modèle de décrire une position de groupe : un vote sur un amendement ne dit pas ce qu'un groupe pense du texte.


⚙️ Paramètres

ParamètreValeur
Modèle de générationmistral-small-latest
Température0,3
Tokens de sortie maximum512 (scrutins), 1 024 (dossiers, sujets), 1 500 (descriptions par groupe, parlementaires)
Nouvelles tentatives3, sur les erreurs 429 et 5xx, avec un délai de 2 s doublé à chaque essai
Concurrence dans le batch nocturne3 (scrutins), 2 (dossiers, sujets, descriptions par groupe, parlementaires)
Modèle d'embeddingsmistral-embed, pour classer les pages vie-publique.fr candidates d'un sujet

Sans MISTRAL_API_KEY, chaque étape d'enrichissement est sautée avec un avertissement ; le reste de la synchronisation fonctionne.


🛡️ Règles communes des prompts

  • Factuel et neutre, sans opinion.
  • Texte brut, sans markdown ni listes.
  • S'appuyer sur les données fournies, sans extrapoler ; si une information manque, ne rien inventer.
  • Dossiers et sujets : classer les groupes d'après l'orientation politique fournie entre crochets, jamais d'après une connaissance propre du modèle.
  • Les votes d'un groupe sont comptés sous le groupe du mandat à la date du scrutin, jamais sous le groupe actuel de la personne.

🔁 Quand un texte est régénéré

Scrutins, dossiers et sujets. Chaque entité reçoit une empreinte SHA-256 de ses données d'entrée (llm/content-hash.ts). À chaque passage, le batch balaie tout le corpus et ne rappelle Mistral que pour les entités dont l'empreinte a changé. L'empreinte ne contient que des données source : un texte produit par le modèle (le libellé d'un sujet, le résumé d'un scrutin cité par un dossier) n'y entre jamais, sans quoi chaque génération invaliderait la suivante. Les dossiers et les sujets intègrent donc l'empreinte de leurs scrutins et dossiers, pas leur texte.

L'empreinte de ces entités ne couvre pas le prompt : modifier un prompt de scrutin, de dossier ou de sujet ne déclenche aucune régénération. Il faut alors relancer avec --force (tout) ou --only (entités ciblées).

Fiches parlementaires. Leur empreinte porte sur ce que la fiche affirme de la personne (statut, chambre, groupe, commission, circonscription, mandats en années) et sur la version du prompt (PROMPT_PARLEMENTAIRE_VERSION) : un mandat terminé ou une consigne corrigée rend la fiche périmée. Chaque nuit, le batch génère les fiches encore absentes des parlementaires en exercice, régénère jusqu'à 200 fiches périmées (les plus anciennes d'abord), puis 25 fiches tirées au hasard parmi celles non rafraîchies depuis 25 jours, anciens parlementaires compris.


🔗 Liens « contexte » des sujets (Tavily)

Tavily n'intervient dans aucun texte généré. Il sert uniquement à trouver, pour chaque sujet, la page vie-publique.fr correspondante : recherche restreinte à ce domaine, puis classement des candidates par embeddings Mistral. Le résultat est stocké dans sujet_liens (famille contexte).

La résolution est incrémentale : un sujet n'est réinterrogé que si son slug ou son statut change, ou s'il est resté sans lien plus de 30 jours. Le libellé n'en fait pas partie, puisque l'IA le réécrit. Chaque nuit ne dépense qu'une part du crédit Tavily restant du mois, au prorata des jours restants ; les sujets en attente passent à la nuit suivante.


💻 Commandes

TerminalCode
pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia # cascade complète pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --scrutins pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --dossiers pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --sujets pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --groupe-amendements pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --parlementaires pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --parlementaires --only <slug> pnpm --filter @clair/ingestion exec tsx src/cli.ts enrich-ia --sujets --force

Toutes les options sont décrites sur la page Commandes CLI.


✅ Contrôle qualité

check-ia-quality confronte les textes des dossiers et des sujets aux votes réels : inversions pour/contre, abstentions décrites comme des votes, positions prêtées à des groupes absents des données. Seuils et détails : Qualité des données.

Après toute modification d'un prompt ou du code d'enrichissement, relancer check-ia-quality avant de fusionner. Si la modification change les empreintes, le batch de la nuit qui suit le déploiement régénère les entités concernées en production : le contrôle doit donc avoir lieu avant le déploiement, pas après.

Commandes CLIModèle Prisma
On this page
  • 🧩 Entités enrichies
  • ⚙️ Paramètres
  • 🛡️ Règles communes des prompts
  • 🔁 Quand un texte est régénéré
  • 🔗 Liens « contexte » des sujets (Tavily)
  • 💻 Commandes
  • ✅ Contrôle qualité