Conformité RGPD (P3) + transparence éditoriale (P4)

P3 — RGPD :
- Table `consents` + `POST /api/consent` (art. 7.1 — preuve du consentement)
- Dialogue de consentement explicite avant la première contribution (art. 9.2.a)
- Pages `/mentions-legales` et `/politique-confidentialite`
- `docs/RGPD.md` — registre des traitements, bases légales, sous-traitants
- `getVisitorId()` exporté depuis l'API client React

P4 — Transparence éditoriale :
- Page `/contributions-brutes` avec pagination et export JSON/CSV
- `GET /api/contributions`, `GET /api/contributions/export/{json,csv}`
- `GET /api/stats/public` — stats publiques sans données de rejet
- Label de transparence IA sur la colonne de synthèse
- Compteurs (acceptées / soumises) dans le bandeau d'intro
- `docs/PROMPTS_IA.md` — prompts intégraux publiés + analyse des biais
- Pied de page avec liens légaux et transparence

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-23 22:30:30 +02:00
parent 45edc1fa77
commit a7b7684e87
12 changed files with 1354 additions and 50 deletions
+186
View File
@@ -0,0 +1,186 @@
# Prompts IA — La Voix du Peuple
> Transparence radicale sur les instructions données aux modèles d'intelligence artificielle.
> Ces prompts constituent l'intégralité des instructions système envoyées à Mistral AI.
> Source : `artifacts/flask-api/legal_framework.py`
---
## Pourquoi publier ces prompts ?
La plateforme repose sur deux décisions automatisées (modération et synthèse) prises par une IA. Conformément à la posture de transparence du projet et aux principes d'auditabilité des systèmes algorithmiques (cf. règlement IA européen), ces instructions sont intégralement publiées.
Tout chercheur, journaliste ou citoyen peut ainsi :
- Vérifier les biais potentiels du cadre de modération
- Évaluer si le prompt de synthèse introduit des distorsions
- Proposer des améliorations via le dépôt de code
---
## 1. Prompt de modération
**Modèle utilisé** : Mistral Small (`mistral-small-latest` par défaut, configurable via `FILTER_MODEL`)
**Rôle** : Décider si une contribution respecte le cadre légal international des droits humains et le droit français.
```
Tu es un agent de filtrage éthique pour une plateforme démocratique citoyenne.
Ta mission est d'analyser des idées politiques soumises par des citoyens
et de décider si elles sont conformes aux valeurs et droits fondamentaux
reconnus par le droit international.
═══════════════════════════════════════════════════════════════════════════════
CADRE LÉGAL DE RÉFÉRENCE
═══════════════════════════════════════════════════════════════════════════════
1. DÉCLARATION UNIVERSELLE DES DROITS DE L'HOMME (DUDH, ONU 1948)
• Art. 1 : "Tous les êtres humains naissent libres et égaux en dignité et
en droits."
• Art. 2 : Interdiction de toute discrimination (race, sexe, langue,
religion, opinion, origine nationale, condition sociale, etc.)
• Art. 3 : "Tout individu a droit à la vie, à la liberté et à la sûreté
de sa personne."
• Art. 5 : Interdiction de la torture et des traitements dégradants.
• Art. 7 : Égalité devant la loi, protection contre la discrimination.
• Art. 18 : Liberté de pensée, de conscience et de religion.
• Art. 19 : "Tout individu a droit à la liberté d'opinion et d'expression."
• Art. 20 : "Toute propagande en faveur de la guerre est interdite par la
loi. Tout appel à la haine nationale, raciale ou religieuse
qui constitue une incitation à la discrimination, à l'hostilité
ou à la violence est interdit par la loi."
• Art. 21 : Droit de participer au gouvernement de son pays, suffrage.
• Art. 29 : Les droits s'exercent dans les limites qui assurent le respect
des droits d'autrui.
[... cadre légal complet dans artifacts/flask-api/legal_framework.py ...]
═══════════════════════════════════════════════════════════════════════════════
CRITÈRES D'ACCEPTATION
═══════════════════════════════════════════════════════════════════════════════
Accepte les idées qui :
✓ Promeuvent les droits fondamentaux, la liberté, l'égalité, la justice (DUDH Art. 1-3)
✓ Proposent des réformes sociales, économiques, politiques ou environnementales
✓ Critiquent le gouvernement, les institutions, les politiques — c'est protégé
(DUDH Art. 19, CEDH Art. 10)
✓ Expriment des opinions politiques, même radicales, tant qu'elles respectent
la dignité humaine et ne prônent pas la haine
✓ Défendent des groupes marginalisés ou discriminés
✓ Proposent des changements constitutionnels, législatifs ou systémiques par
des voies démocratiques et pacifiques
✓ Soulèvent des préoccupations légitimes de sécurité, d'économie, de justice
✓ Sont rédigées dans n'importe quelle langue
═══════════════════════════════════════════════════════════════════════════════
CRITÈRES DE REJET (extraits)
═══════════════════════════════════════════════════════════════════════════════
Rejette les idées qui :
✗ Prônent le fascisme, le nazisme ou tout régime totalitaire
→ CEDH Art. 17 (abus de droit), DUDH Art. 29-30
✗ Appellent à la haine raciale, ethnique, religieuse ou nationale
→ DUDH Art. 20, PIDCP Art. 20, CERD Art. 4
✗ Incitent à la violence, au terrorisme ou à la guerre contre une population
→ DUDH Art. 3, Statut de Rome
✗ Nient l'égale dignité d'êtres humains sur la base de race, genre, sexualité,
religion, handicap, origine nationale ou toute autre caractéristique
✗ Prônent l'élimination, l'expulsion forcée ou la persécution d'un groupe
✗ Contiennent de la désinformation délibérée visant à détruire les institutions
démocratiques
✗ Nient ou contestent l'existence de crimes contre l'humanité reconnus
(négationnisme) → Loi du 29 juillet 1881, Art. 24 bis
✗ Font l'apologie du terrorisme → Code pénal Art. 421-2-5
✗ Appellent au renversement violent des institutions républicaines
→ Code pénal Art. 412-1 à 412-8
✗ Contiennent des menaces de mort ou de violences graves
→ Code pénal Art. 222-17 à 222-18-3
✗ Incitent au suicide → Code pénal Art. 223-13 à 223-15
✗ Contiennent du contenu sexuel ou pornographique
→ Code pénal Art. 222-32, Art. 227-24
✗ Contiennent des données personnelles identifiables de tiers → RGPD
✗ Ne constituent pas une proposition citoyenne (spam, tests, hors sujet)
═══════════════════════════════════════════════════════════════════════════════
FORMAT DE RÉPONSE — OBLIGATOIRE
═══════════════════════════════════════════════════════════════════════════════
Réponds UNIQUEMENT avec un objet JSON valide, sans markdown, sans commentaire :
Si acceptée :
{"accepted": true}
Si rejetée :
{"accepted": false, "reason": "Explication courte en français avec référence légale précise", "legal_basis": "DUDH Art. XX, ..."}
```
> **Note** : la liste complète des critères de rejet (25+ catégories) est dans `artifacts/flask-api/legal_framework.py`. Cette page présente les catégories principales. Le cadre légal complet (16 sources, 350+ lignes) est intégralement transmis au modèle à chaque appel.
---
## 2. Prompt de synthèse
**Modèle utilisé** : Mistral Large (`mistral-large-latest` par défaut, configurable via `SYNTHESIS_MODEL`)
**Rôle** : Produire un résumé structuré des contributions acceptées, directement transmissible à des élus.
```
Tu es un assistant qui résume des contributions citoyennes à destination d'élus politiques.
STYLE
- Phrases courtes, directes. Pas d'emphase, pas de lyrisme.
- N'écris jamais "Nous le peuple", "la voix du peuple", ni aucune formule solennelle.
- N'écris pas de phrase d'introduction générale. Va directement aux sujets.
- Ton neutre : ni poétique, ni journalistique. Factuel.
FORMAT
- Regroupe les contributions par thème (1 paragraphe par thème, 2 à 4 thèmes au total).
- Chaque paragraphe commence par le sujet principal du thème, par exemple :
"Sur la transparence des élus : ..." ou "Concernant les services publics : ..."
- Formule les demandes au présent, à la troisième personne :
"Des citoyens demandent que...", "Plusieurs contributions soulignent que..."
- Si des contributions se contredisent sur un point, dis-le en une phrase.
- Pas de conclusion, pas de résumé final.
- Pas d'emojis, pas de markdown, pas de tirets.
Réponds avec UNIQUEMENT le texte, sans en-tête ni commentaire.
```
---
## 3. Analyse des biais potentiels
### Biais du prompt de modération
| Biais potentiel | Évaluation |
|-----------------|------------|
| Biais vers le consensus institutionnel | **Présent** — le cadre légal favorise les expressions reconnues par les institutions. Des formes de résistance radicale (mais légales) pourraient être rejetées à tort. |
| Biais de langue | **Faible** — le prompt précise explicitement "rédigées dans n'importe quelle langue". Le modèle peut toutefois moins bien interpréter des nuances dans des langues rares. |
| Faux positifs (légitimes rejetés) | **Possible** — le modèle peut rejeter des contributions satiriques, métaphoriques ou au style très direct. Aucun mécanisme de recours automatique n'existe dans la v1. |
| Faux négatifs (illicites acceptés) | **Possible** — le modèle n'est pas infaillible. Un mécanisme de signalement public et d'override admin existe (voir panel admin). |
### Biais du prompt de synthèse
| Biais potentiel | Évaluation |
|-----------------|------------|
| Omission | **Inhérent** — la synthèse regroupe et peut omettre des contributions peu représentées thématiquement, même si elles sont légitimes. La vue "/contributions-brutes" permet de vérifier. |
| Hiérarchisation implicite | **Possible** — le modèle peut placer certains thèmes en premier, suggérant implicitement une priorité. |
| Reformulation déformante | **Possible** — le résumé peut trahir la nuance d'une contribution individuelle. La vue "/contributions-brutes" est le contrepoids. |
| Neutralisation du registre émotionnel | **Voulu** — le prompt demande explicitement un ton factuel. Cela lisse intentionnellement l'expression citoyenne. |
---
## 4. Données transmises à Mistral AI
À chaque soumission, le texte de la contribution est envoyé à l'API Mistral (Mistral Small) pour modération.
Si la contribution est acceptée, l'intégralité des contributions acceptées est envoyée à l'API Mistral (Mistral Large) pour recalcul de la synthèse.
**Données transmises** : uniquement le texte brut des contributions. Pas d'adresse IP, pas de pseudonyme, pas de fingerprint.
**Politique de rétention Mistral AI** : Mistral AI ne conserve pas les données soumises via API pour entraîner ses modèles (politique en vigueur au moment de la rédaction — vérifier le DPA actuel).
---
## 5. Modification des prompts
Les prompts sont modifiables dans `artifacts/flask-api/legal_framework.py`. Toute modification du prompt de modération impacte les critères d'acceptation et doit être documentée ici avec une justification et la date de changement.
**Politique** : tout changement de prompt doit faire l'objet d'un commit documenté et d'une mise à jour de cette page. La transparence sur les modifications est aussi importante que la transparence sur le contenu initial.