From b604e21f70bc55253b31a87fa57d0f58cec40d22 Mon Sep 17 00:00:00 2001 From: pironantoine <57062554-pironantoine@users.noreply.replit.com> Date: Sat, 4 Apr 2026 06:20:27 +0000 Subject: [PATCH] Add a page detailing the platform's technical workings and AI transparency Adds a new "Fonctionnement" page and integrates it into the app's routing and navigation to explain the AI's role, data handling, and limitations. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 923ae0e3-a363-4db8-b04a-e8baca2a1330 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: 26cc3ee2-cf8d-46e5-8c74-836cb5ae3a18 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/8af7d2ec-2cc3-4ece-8af3-9f071488d072/923ae0e3-a363-4db8-b04a-e8baca2a1330/qrVKaka Replit-Helium-Checkpoint-Created: true --- artifacts/voix-du-peuple/src/App.tsx | 3 + .../voix-du-peuple/src/pages/transparence.tsx | 295 ++++++++++++++++++ 2 files changed, 298 insertions(+) create mode 100644 artifacts/voix-du-peuple/src/pages/transparence.tsx diff --git a/artifacts/voix-du-peuple/src/App.tsx b/artifacts/voix-du-peuple/src/App.tsx index 9396c0d..31f5067 100644 --- a/artifacts/voix-du-peuple/src/App.tsx +++ b/artifacts/voix-du-peuple/src/App.tsx @@ -5,6 +5,7 @@ import { TooltipProvider } from "@/components/ui/tooltip"; import NotFound from "@/pages/not-found"; import Home from "@/pages/home"; import About from "@/pages/about"; +import Transparence from "@/pages/transparence"; const queryClient = new QueryClient({ defaultOptions: { @@ -25,6 +26,7 @@ function Navbar() { @@ -39,6 +41,7 @@ function Router() { + diff --git a/artifacts/voix-du-peuple/src/pages/transparence.tsx b/artifacts/voix-du-peuple/src/pages/transparence.tsx new file mode 100644 index 0000000..b97ddc8 --- /dev/null +++ b/artifacts/voix-du-peuple/src/pages/transparence.tsx @@ -0,0 +1,295 @@ +import React from "react"; +import { Link } from "wouter"; +import { ArrowLeft, Bot, Filter, FileText, Database, AlertTriangle, CheckCircle, XCircle, ArrowRight } from "lucide-react"; +import { Button } from "@/components/ui/button"; + +export default function Transparence() { + return ( +
+
+ + + + + +
+

+ Comment ça fonctionne +

+

+ Cette page décrit précisément le rôle de l'intelligence artificielle dans cette plateforme, les données collectées et les limites du système. +

+
+ +
+ + {/* Flux général */} +
+
+ +

Le parcours d'une contribution

+
+

+ Quand vous soumettez une proposition, elle suit quatre étapes automatiques avant d'être visible et intégrée à la synthèse. +

+
    + {[ + { + num: "1", + titre: "Réception", + desc: "Votre texte est enregistré en base de données avec la date et l'heure. Le pseudonyme est facultatif. Aucune donnée d'identification (adresse IP, compte utilisateur) n'est associée à la contribution.", + }, + { + num: "2", + titre: "Filtre de modération (IA)", + desc: "Un modèle de langage (GPT) analyse le texte pour vérifier sa conformité avec les droits fondamentaux reconnus par le droit international. Voir la section dédiée ci-dessous.", + }, + { + num: "3", + titre: "Mise à jour de la synthèse (IA)", + desc: "Si la contribution est acceptée, un second modèle relit l'ensemble des contributions retenues et produit un résumé structuré, destiné à être transmis à des représentants politiques.", + }, + { + num: "4", + titre: "Affichage", + desc: "La contribution apparaît dans le fil des contributions récentes. La synthèse mise à jour s'affiche immédiatement dans la colonne de droite.", + }, + ].map((step) => ( +
  1. + + {step.num} + +
    +

    {step.titre}

    +

    {step.desc}

    +
    +
  2. + ))} +
+
+ + {/* Filtre IA */} +
+
+ +

L'IA de modération

+
+ +
+
+

Modèle utilisé

+

+ OpenAI GPT-4o mini par défaut (configurable via la variable d'environnement OPENAI_FILTER_MODEL). Le modèle est interrogé via l'API OpenAI — aucun fine-tuning ni entraînement n'est effectué sur les contributions des utilisateurs. +

+
+ +
+

Ce que le filtre vérifie

+

+ Le modèle reçoit le texte de la contribution et une liste de critères fondés sur les textes internationaux suivants : +

+
    + {[ + "DUDH (ONU, 1948) — Art. 1, 2, 7, 19, 20", + "PIDCP (ONU, 1966) — Art. 20, 25, 26", + "CEDH (Conseil de l'Europe, 1950) — Art. 10, 14, 17", + "Charte des droits fondamentaux de l'UE (2000)", + "Convention internationale sur l'élimination de la discrimination raciale — CERD (ONU, 1965)", + "Statut de Rome (CPI, 1998) — incitation au génocide", + "Convention contre la torture (ONU, 1984)", + ].map((t) => ( +
  • + + {t} +
  • + ))} +
+
+ +
+

Ce qui est refusé

+
    + {[ + "Appels à la haine ou à la discrimination (raciale, religieuse, sexuelle, etc.)", + "Incitation à la violence ou à la persécution d'un groupe", + "Apologie du génocide, de crimes contre l'humanité ou de crimes de guerre", + "Désinformation délibérée visant à nuire à un groupe protégé", + "Contenus portant atteinte à la dignité humaine au sens de l'Art. 1 de la DUDH", + ].map((r) => ( +
  • + + {r} +
  • + ))} +
+
+ +
+

Ce qui est accepté

+

+ Toute proposition qui exprime une opinion politique, sociale, économique ou environnementale — même controversée — dans le respect des droits fondamentaux. Le désaccord, la critique des institutions, la revendication et la protestation sont acceptés et bienvenus. +

+
+ +
+

En cas de refus

+

+ Le motif du refus vous est communiqué avec la référence légale précise. La contribution n'est jamais rendue publique. Elle est conservée en base de données avec son statut (refusée) pour des raisons de traçabilité interne. +

+
+
+
+ + {/* Synthèse IA */} +
+
+ +

L'IA de synthèse

+
+ +
+
+

Modèle utilisé

+

+ OpenAI GPT-4o par défaut (configurable via OPENAI_SYNTHESIS_MODEL). Un modèle plus puissant est utilisé ici pour produire un résumé de meilleure qualité. +

+
+ +
+

Ce que l'IA produit

+

+ Le modèle reçoit l'intégralité des contributions acceptées et produit un résumé structuré par thèmes. L'objectif est de rendre le texte directement lisible et utilisable par un élu ou un service public : les idées sont regroupées, les priorités dégagées, les contradictions éventuelles mentionnées. +

+
+ +
+

Ce que l'IA ne fait pas

+
    + {[ + "Elle n'invente pas d'idées qui ne sont pas dans les contributions", + "Elle n'écarte pas une contribution selon ses propres préférences", + "Elle ne hiérarchise pas les contributions par leur auteur", + "Elle ne produit pas de recommandations politiques de son propre chef", + ].map((r) => ( +
  • + + {r} +
  • + ))} +
+
+
+
+ + {/* Données */} +
+
+ +

Données collectées

+
+ +
+ + + + + + + + + + {[ + { donnee: "Texte de la contribution", oui: true, detail: "Conservé en base de données" }, + { donnee: "Pseudonyme", oui: true, detail: "Facultatif, librement choisi par l'utilisateur" }, + { donnee: "Date et heure", oui: true, detail: "Horodatage de la soumission" }, + { donnee: "Résultat du filtre", oui: true, detail: "Acceptée / refusée + motif" }, + { donnee: "Adresse IP", oui: false, detail: "Non conservée" }, + { donnee: "Compte utilisateur", oui: false, detail: "Aucune inscription requise" }, + { donnee: "Cookie de suivi", oui: false, detail: "Aucun tracker, aucune publicité" }, + { donnee: "Données de navigation", oui: false, detail: "Non collectées" }, + ].map((row) => ( + + + + + + ))} + +
DonnéeCollectée ?Précisions
{row.donnee} + {row.oui + ? Oui + : Non + } + {row.detail}
+
+
+ + {/* Limites */} +
+
+ +

Limites du système

+
+
+ {[ + { + titre: "L'IA peut se tromper", + desc: "Le filtre automatique n'est pas infaillible. Une contribution légitime peut être refusée par erreur ; une contribution limite peut passer. Aucun système automatique ne remplace un jugement humain. Si vous estimez qu'un refus est injustifié, vous pouvez reformuler votre contribution.", + }, + { + titre: "La synthèse est une interprétation", + desc: "Le résumé produit par l'IA reflète les contributions telles qu'elle les a comprises. Des nuances peuvent être perdues dans l'agrégation. Le texte synthétisé ne doit pas être présenté comme une décision collective formelle, mais comme un aperçu des préoccupations exprimées.", + }, + { + titre: "Aucun recours automatique", + desc: "Il n'existe pas encore de mécanisme de contestation d'un refus. Si cette plateforme est déployée dans un cadre institutionnel, il est recommandé d'ajouter un contact humain de recours.", + }, + { + titre: "Dépendance à OpenAI", + desc: "Le filtrage et la synthèse dépendent de l'API OpenAI. En cas d'indisponibilité, les soumissions sont refusées par précaution et le service affiche un message d'erreur.", + }, + ].map((item) => ( +
+

{item.titre}

+

{item.desc}

+
+ ))} +
+
+ + {/* Modèles */} +
+
+ +

Récapitulatif technique

+
+
+ + + {[ + { label: "Backend", val: "Python / Flask" }, + { label: "Base de données", val: "PostgreSQL" }, + { label: "Frontend", val: "React + Vite" }, + { label: "IA de modération", val: "OpenAI GPT-4o mini (défaut)" }, + { label: "IA de synthèse", val: "OpenAI GPT-4o (défaut)" }, + { label: "Données personnelles", val: "Aucune (pseudonyme facultatif uniquement)" }, + { label: "Trackers / publicité", val: "Aucun" }, + { label: "Inscription requise", val: "Non" }, + ].map((row) => ( + + + + + ))} + +
{row.label}{row.val}
+
+
+ +
+
+
+ ); +}