Projet personnel · Mai 2026 — Aujourd'hui

Comprendre la politique. Mode pedagogique.

Politist est un assistant conversationnel IA pour comprendre la politique belge. Trois modes commutables (Generation Engagee, Les Engages, Comparateur neutre par defaut), trois audiences (citoyen, militant, cadre), bilingue FR/NL. Conception design system, UX, architecture, developpement, deploiement — bout en bout.

Design system UX conversationnel RAG / LLM EU AI Act FR / NL

Acces pilote derriere Cloudflare Access (code PIN par email). Sur demande.

12 Partis indexes FR + NL
5 Niveaux UE -> commune
10 References design (designers + philosophes)
3 Modes commutables
0 Framework UI (vanilla JS pur)
I

Rendre la politique lisible.

Un programme de parti fait 200+ pages. Peu de gens le lisent. Les militants doivent repondre a des questions precises sur des themes qu'ils ne maitrisent pas tous. Les journalistes confondent programme de parti et accord de coalition. La desinformation prospere quand l'information officielle est illisible.

Politist repond a ces quatre problemes par un assistant IA qui cite ou se tait. Toute affirmation factuelle est ancree dans un extrait du corpus officiel, avec source cliquable. Aucun chiffre invente. Aucune position attribuee. Aucune recommandation de vote.

Projet porte d'abord par Generation Engagee (mouvement jeunesse), puis Les Engages — par et pour eux, mais a fonctionnement operationnellement neutre : le mode par defaut est le Comparateur.

II

Aligne sur Les Engages, verifie au pixel.

Charte extraite du theme WordPress officiel gblmaster et de la feuille Adobe Typekit ozc0ygx. Palette, typographie, espacements, animations — tout est verifie contre lesengages.be plutot que reinvente.

turquoise #00e6d2 Signature, accents, CTA
navy #2d3047 Texte, fond contraste
paper #f7f7f6 Fond pages, sections
coral #ff675a CTA humain, alerte douce
Sans-serif Plus Jakarta Sans Substitut open-source de sofia-pro (Adobe Typekit du parti).

Decider demain.

Mode pedagogique.

Un assistant qui cite ses sources, distingue ce que le parti promet de ce qu'il fait, refuse de recommander un vote.

PROGRAMME · 2024 · P.142

III

Trois modes. Trois audiences. Une posture.

Chaque conversation est routee par un orchestrator qui detecte le mode (Generation Engagee, Les Engages, Comparateur neutre), l'audience (citoyen, militant, cadre), la langue (FR/NL), le theme et l'intention. Un prompt persona dedie genere la reponse, avec garde-fous regex. Le mode Comparateur est celui par defaut — la posture neutre prime.

Mode

Generation Engagee

Voix socio-educative du mouvement jeunesse. Corpus etanche dedie. Le porteur principal du projet.

Mode

Les Engages

Assistant pedagogique partisan. Repond depuis le programme, peut contre-argumenter en restant factuel. ADN centre humaniste, Renew Europe.

Mode · defaut

Comparateur

Voix la plus neutre possible, multi-partis. Met cote a cote les positions sur un meme theme. Distingue programme de parti et accord de coalition. Pas de recommandation de vote.

Citoyen

150 — 300 mots

Vulgarise, sans jargon. Pour comprendre rapidement, sans bagage politique requis.

Militant

300 — 500 mots

Argumentaire structure, contre-arguments anticipes. Pour preparer un debat ou une reunion.

Cadre

500 — 800 mots

Synthese dense, references chiffrees, articulation programme/coalition/agenda parlementaire.

Fonctionnalite · live

Confronter un texte au corpus

On soumet un document (PDF, DOCX, texte, URL, ≤ 10 Mo) et l'assistant le confronte aux sources officielles, passage par passage. Chaque affirmation ressort avec un statut : Confirme, Contredit, Complete ou Hors corpus. Ephemere — rien n'est stocke. Garde-fous SSRF + anti-denigrement inclus.

IV

10 boussoles. Pas 10 imitations.

Pour ancrer le design dans une lignee plutot que de l'inventer ex nihilo, j'ai pioche 5 designers et 5 philosophes dans DesignersAtlas. Chaque reference apporte une regle concrete. Ces 10 noms ne servent pas a copier (on n'imite pas la NYC Subway Map). Ils servent de boussole quand une decision est ambigue.

Designer

Massimo Vignelli

Grilles strictes, typographie noble. "Less is more" applique a une interface politique : marges genereuses, hierarchie claire pour rendre lisible la complexite.

Designer

Wim Crouwel

Sources affichees comme dans un appareil scientifique. Badges PROGRAMME · 2024 · P.142 mono uppercase. Confiance par la precision.

Designer

Charlotte Perriand

Modernisme humaniste, design pour tous. Aucune dependance lourde, vanilla JS pur, code accessible — coherent avec l'economie sociale du parti.

Designer

Otl Aicher

Pictogrammes JO Munich 1972. Iconographie en mode service public. Le mode Comparateur s'inspire de cette neutralite bienveillante.

Designer

Hara Kenya

"Emptiness as design" — l'espace n'est pas absence de contenu, c'est respect du destinataire. Vide spacieux. Le citoyen doit pouvoir penser dans l'interface.

Philosophe

Hannah Arendt

Honorer la pluralite des positions politiques. Le mode Comparateur traite chaque parti avec le meme soin, sans hierarchie visuelle implicite.

Philosophe

Montaigne

"Que sais-je ?" Honnetete quand on ne sait pas. Les reponses sans source disent "je n'ai pas de position officielle verifiee" plutot que d'inventer.

Philosophe

Spinoza

Democratie de la raison, joie active. Ton positif sans naivete dans le copywriting des erreurs, suggestions, refus de garde-fous. Pas de moralisation.

Philosophe

Confucius

Rectification du sens (zhèng míng). On dit "Les Engages" (post-2022), pas "cdH". On dit "Renew Europe" (post-juin 2024), pas "PPE". Lexique = acte civique.

Philosophe

Seneque

Stoicisme applique. Calme dans les animations : pas d'effet ressort, pas de bounce. Toute transition est cubic-bezier(0.4, 0, 0.2, 1), jamais "spring".

V

Quatre regles non negociables.

01

Cite ou se tait

Toute affirmation factuelle ancree dans une source du corpus, avec extrait cliquable. Pas de chiffre invente.

02

Pas de smearing

Les autres partis sont decrits avec leurs propres mots. Insultes, doxxing, attaques personnelles bloques par garde-fous regex FR/NL.

03

Programme ≠ coalition

Distinction systematique entre position du parti et compromis d'accord gouvernemental (4 niveaux : federal, wallon, FWB, bruxellois).

04

EU AI Act & RGPD

Disclaimer IA permanent, sources transparentes, pas de profilage par opinion. Conversations locales par defaut, cloud opt-in.

05

Cordon sanitaire

Le Vlaams Belang est indexe pour la comparaison factuelle, mais jamais cite verbatim sur les passages sensibles, toujours contextualise, et sa charte graphique n'est pas reproduite (chip grise, pas leur jaune).

VI

Custom — pas de framework lourd.

Choix volontaire : zero LangChain, zero LlamaIndex, zero React. RAG ecrit a la main, vanilla JS pur cote front. Moins de surface d'attaque, controle total, deployable sur un mini-PC.

Backend

Le moteur cote serveur : il recoit la question, orchestre la recherche et la redaction, et renvoie la reponse.

  • FastAPI 0.115 + Uvicorn Le framework web Python qui expose l'API. Rapide, moderne, leger — pas d'usine a gaz.
  • Qdrant (vector DB) La base qui stocke les extraits sous forme de vecteurs et retrouve les plus proches d'une question en un clin d'oeil.
  • Ollama local + cloud Sert les modeles IA : en local pour les embeddings (prive, gratuit), dans le cloud pour la redaction (plus puissant).
  • SQLite WAL Une base locale legere pour garder conversations et retours. Le mode WAL encaisse plusieurs ecritures sans se bloquer.
  • Routage par tache + fallback Chaque tache va au modele le mieux adapte ; si un service tombe, un autre prend le relais automatiquement.

Frontend

L'interface visible : ecrite sans framework, elle reste legere, rapide a charger et facile a maintenir.

  • Vanilla JS — 0 build step Du JavaScript natif, sans React ni outil de compilation. Le code livre est celui ecrit — simple a auditer, rien de cache.
  • CSS custom properties Les couleurs et espacements sont des variables (les tokens du design system) : on change une valeur a un endroit, tout suit.
  • PWA installable L'app peut s'installer comme une application native (icone, plein ecran) et fonctionner meme hors ligne, grace au service worker.
  • Plus Jakarta Sans + JetBrains Mono Les polices : une sans-serif chaleureuse pour le texte, une monospace pour les donnees techniques et les sources.
  • ~6 s par reponse La reponse s'affiche d'un bloc apres ~6 s. L'affichage au fil de l'eau (streaming) est prevu pour la suite.

Ingestion

La chaine qui transforme un document brut (PDF, page web) en extraits propres, decoupes et etiquetes, prets pour la recherche.

  • PyMuPDF (extraction PDF) Extrait le texte des PDF officiels — le format le plus courant des programmes et accords.
  • BeautifulSoup + lxml Recupere proprement le contenu des pages web (communiques, sites de partis) en ecartant menus et publicites.
  • Chunking phrase par phrase Decoupe le texte en morceaux de ~600 mots sans casser une phrase, pour que chaque extrait garde du sens.
  • Metadata : parti, theme, niveau… Chaque extrait est etiquete (parti, langue, theme, niveau de pouvoir) — c'est ce qui permet les recherches filtrees et l'etancheite des modes.
  • IDs deterministes Chaque morceau a un identifiant calcule sur son contenu : re-ingerer un document ne cree pas de doublon.

Ops

La mise en production et le maintien en service : comment l'app reste accessible, protegee et fiable au quotidien.

  • Cloudflare Tunnel + Access Expose le mini-PC sur internet sans ouvrir de port, et filtre l'acces par code a usage unique (pilote sur invitation).
  • Self-host Ryzen 9 7940HS, 128 GB Tout tourne sur un mini-PC personnel — controle total, cout maitrise, aucune donnee confiee a un cloud tiers.
  • systemd auto-restart Le service redemarre tout seul au boot ou apres un plantage — l'app reste dispo sans intervention manuelle.
  • Plausible analytics Des statistiques de frequentation respectueuses de la vie privee : pas de cookies, pas de pistage individuel.
  • Backups horodates Une sauvegarde datee avant chaque deploiement — on peut revenir en arriere en cas de probleme.
VII

Comment une reponse se construit. Cite ou se tait.

Aucune reponse n'est generee « de tete ». Chaque message passe par un pipeline de recuperation (RAG — Retrieval-Augmented Generation) ecrit a la main, sans LangChain ni LlamaIndex. Le modele ne voit que des extraits reels du corpus, et doit citer ses sources.

  1. 01

    Orchestrator — routage

    Un premier passage detecte le mode (Engages / Comparateur), les partis cibles, l'audience (citoyen / militant / cadre), la langue (FR/NL) et le theme. Tout le reste en decoule.

  2. 02

    Embedding — la question devient un vecteur

    Ollama (local sur le mini-PC, modele nomic-embed-text:v1.5) transforme la question en un vecteur de 768 dimensions qui capture le sens, pas les mots.

  3. 03

    Recherche Qdrant — 2 passes filtrees

    Sur 5 299 chunks indexes, similarite cosinus. Passe 1 stricte (parti + langue + theme, seuil 0.30) ; passe 2 relachee si vide (parti + langue, seuil 0.20). Les filtres expliquent pourquoi le mode Engages ne renvoie pas de chunks d'un autre parti.

  4. 04

    Selection — les 6 meilleurs extraits

    On garde le top-6. Un reranker cross-encoder (bge-reranker-v2-m3) a ete mesure : gain reel de +10% (MRR 0.66 → 0.725), mais latence de 80 ms a ~20 s sur CPU. Desactive en prod, reserve aux benchmarks offline / futur GPU. Mesure, pas intuition.

  5. 05

    Generation — le LLM redige en citant

    Les 6 extraits + le persona + la question partent vers glm-5.2:cloud (Ollama Cloud, routage par tache). Regle d'or imposee par le prompt : si l'info n'est pas dans les extraits, l'assistant le dit plutot que d'inventer.

Lire le score (similarite cosinus)

  • ≥ 0.70 — pertinent, sujet proche
  • 0.60 — 0.70 — vaguement lie
  • < 0.60 — hors sujet probable

Chaque source est cliquable : metadata complete (parti, type, date, langue, score) + le chunk integral, pas juste l'extrait.

VIII

Une voix par contexte. Une meme rigueur.

Chaque mode croise a chaque audience donne un prompt persona distinct. L'orchestrator en choisit un par conversation. La longueur, le ton et la structure changent — jamais l'exigence de citation.

Engages

Citoyen

150 — 300 mots

Vulgarise depuis le programme, sans jargon. Comprendre vite.

Engages

Militant

300 — 500 mots

Argumentaire structure, contre-arguments anticipes. Preparer un debat.

Engages

Cadre

500 — 800 mots

Synthese dense, articulation programme / coalition / agenda parlementaire.

Comparateur

Citoyen

150 — 300 mots

Voix neutre. Met les positions cote a cote, sans pencher.

Comparateur

Militant

300 — 500 mots

Comparaison multi-partis structuree sur un meme theme.

Comparateur

Cadre

500 — 800 mots

Analyse dense. Distingue programme de parti et accord de coalition.

Comment ces personas sont fabriques

Plutot qu'un prompt fige par case, chaque persona est compose a la volee a partir de deux briques independantes — on change un reglage a un seul endroit, jamais 9.

ADN de mode × Brique audience + Directives de surete = Persona

ADN de mode — la voix & le perimetre

Identite, posture et corpus interroge. Le mode Engages parle programme ; le Comparateur reste neutre. Ajouter un mode = ajouter une brique, pas reecrire trois prompts.

Brique audience — la forme

Longueur et registre uniquement : Citoyen (vulgarise, 150–300 mots), Militant (argumente, 300–500), Cadre (dense, 500–800). Independante du mode.

IX

Les chiffres, sans enrobage.

Etat reel de l'instance live au moment de la redaction — pas des estimations.

Corpus

La matiere premiere : les documents officiels decoupes en petits morceaux (chunks) que l'IA peut retrouver. Chaque mode a son propre lot etanche, pour ne jamais melanger les voix.

  • 5 299 chunks live (Qdrant, status green) Le corpus decoupe en 5 299 morceaux interrogeables, stockes dans une base vectorielle (Qdrant) en bonne sante.
  • Etancheite : GE 72 · LE 790 · Comparateur 4 437 Chaque mode a son propre lot de documents, jamais melange — le mode Generation Engagee ne peut pas repondre avec le corpus d'un autre.
  • 12 partis FR / NL, UE → commune Les principaux partis belges des deux familles linguistiques, sur tous les niveaux de pouvoir (europeen jusqu'a communal).
  • FR 3 940 / NL 1 359, sources officielles Programmes, accords de gouvernement et statuts — uniquement des documents publics et officiels, dans les deux langues.
  • 600 mots / chunk, overlap 100 Taille de chaque morceau : assez grand pour garder le sens, avec un chevauchement pour ne pas couper une idee en deux.

Retrieval

Comment on retrouve les bons extraits. La question est traduite en vecteur (une empreinte de sens), puis comparee aux morceaux du corpus pour ne garder que les six plus proches.

  • nomic-embed-text:v1.5 — 768 dim Le modele qui transforme un texte en 768 nombres (un vecteur) capturant son sens. Tourne en local, gratuit et prive.
  • Distance cosinus La mesure qui compare deux vecteurs : plus l'angle entre eux est petit, plus les sens sont proches.
  • 2 passes (seuils 0.30 / 0.20) Une 1re recherche stricte (parti + langue + theme) ; si elle ne trouve rien, une 2e plus large. Evite les reponses vides.
  • Top-6 extraits par reponse On ne garde que les six morceaux les plus pertinents — assez pour repondre, pas trop pour ne pas noyer le modele.
  • Reranker +10% MRR (off en prod) Un 2e tri affine la pertinence (+10% mesure), mais ajoute ~20 s sur CPU : desactive en prod, garde pour les tests / futur GPU.

Generation

La redaction de la reponse. Le modele ne voit que les six extraits retrouves — jamais « de tete » — et des garde-fous filtrent l'entree comme la sortie.

  • glm-5.2:cloud responder (Ollama Cloud) Le grand modele de langage qui redige la reponse finale, a partir des seuls extraits fournis. Servi via Ollama Cloud.
  • Routage par tache + fallback Chaque tache (rediger, trier, resumer) va au modele le plus adapte ; si l'un est indisponible, un autre prend le relais.
  • ~6 s par reponse (non streamee) La reponse arrive d'un bloc apres environ six secondes. L'affichage progressif (streaming) est prevu.
  • Garde-fous regex FR / NL Des filtres verifient l'entree (haine, doxxing) et la sortie (diffamation, consigne de vote) avant d'afficher quoi que ce soit.

Qualite & ops

Ce qui prouve que ca marche et que ca tient. Des tests automatises, une evaluation chiffree de la pertinence, et un hebergement maison controle de bout en bout.

  • Eval 16/20 (80%) Sur 20 questions-types, la recherche ramene le bon extrait 16 fois — une mesure objective de la pertinence, pas une impression.
  • 63 tests pytest au vert Des tests automatises verifient a chaque modification que rien n'est casse — filet de securite du developpement.
  • Ryzen 9 7940HS, 128 GB Heberge maison sur un mini-PC personnel — aucune dependance a un cloud tiers pour le coeur du systeme.
  • Cloudflare Access (PIN email) L'acces pilote est protege : un code a usage unique par email, sans mot de passe a gerer.
  • SQLite WAL Une base de donnees legere et locale garde les conversations et les retours — simple, robuste, sans serveur externe.
X

La suite. Etiquetee comme telle.

Ces chantiers ne sont pas encore live — ils sont en cours ou planifies. Ils figurent ici pour montrer la trajectoire, pas pour la faire passer pour l'existant.

En cours

Scission des corpus GE / LE

Deux corpus distincts — Generation Engagee et Les Engages — jamais melanges au retrieval ni a la restitution, chacun avec sa propre hierarchie de sources.

En cours

Qualite des sources

Graduation primaire / secondaire / tertiaire visible dans chaque citation, plus la datation de chaque source pour situer la fraicheur d'une position.

Planifie

Votes parlementaires

Ingestion des votes nominatifs federaux sur 24 mois — la donnee la plus irrefutable : « le parti X a vote oui/non le Z ».

Planifie

Multilingue DE

Extension a la Communaute germanophone apres le pilote, pour couvrir les trois langues nationales belges.

Voir Politist en action.

L'app est derriere Cloudflare Access (acces pilote sur invitation).

Acces pilote ou demo sur demande : [email protected]