From 07507de24a9f7b66883be2eeda6bbdefd4c2b638 Mon Sep 17 00:00:00 2001 From: Dotty Dotter Date: Fri, 10 Apr 2026 16:14:38 +0200 Subject: [PATCH] #96 Methodik-/Transparenz-Seite unter /methodik MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neue Seite für Endnutzer-Transparenz über die Bewertungsmethodik: - GWÖ-Matrix 2.0 Erklärung mit interaktivem 5×5-Grid - Analyse-Pipeline als 5-Schritt-Visualisierung (Download → Embedding → LLM → Verifikation → Darstellung) - Wahlprogramm-Vergleich: Erklärung des Retrieval + Top-K + Verifikation - Qualitätssicherung: Sub-D Property-Tests, server-seitige Quellen- Rekonstruktion, automatische Neu-Analyse - Einschränkungen: KI-Bias, keine juristische Bewertung, nur indexierte Programme, kein Abstimmungsverhalten - Datenquellen: dynamische Tabelle aller angebundenen Parlamente aus ADAPTERS + bundeslaender.py - Technische Details aufklappbar (details/summary) für Interessierte, Haupttext verständlich für Nicht-Techniker - Links zu Quellen-Seite, Adapter-Matrix, ADRs In Hauptnavigation verlinkt (neben Quellen + Auswertungen). Template-Variablen: adapter_count, model_name, programme_count, chunk_count, bundeslaender — alles dynamisch aus dem Backend. Tests: 194/194 grün. Refs: #96 --- app/main.py | 27 +++ app/templates/index.html | 1 + app/templates/methodik.html | 363 ++++++++++++++++++++++++++++++++++++ 3 files changed, 391 insertions(+) create mode 100644 app/templates/methodik.html diff --git a/app/main.py b/app/main.py index ed47418..64d3c3a 100644 --- a/app/main.py +++ b/app/main.py @@ -633,6 +633,33 @@ async def list_bundeslaender(): # === Quellen / Programme === +@app.get("/methodik", response_class=HTMLResponse) +async def methodik_page(request: Request): + """Transparenz-/Methodik-Seite (#96).""" + from .bundeslaender import aktive_bundeslaender, BUNDESLAENDER + from .embeddings import get_indexing_status + + bl_list = [] + for bl in aktive_bundeslaender(): + bl_list.append({ + "code": bl.code, + "name": bl.name, + "doku_system": bl.doku_system, + }) + + status = get_indexing_status() + + return templates.TemplateResponse("methodik.html", { + "request": request, + "app_name": settings.app_name, + "adapter_count": len(ADAPTERS), + "model_name": settings.llm_model_default, + "programme_count": status.get("total", 0), + "chunk_count": sum(p.get("chunks", 0) for p in status.get("programmes", [])), + "bundeslaender": sorted(bl_list, key=lambda x: x["name"]), + }) + + @app.get("/quellen", response_class=HTMLResponse) async def quellen_page(request: Request): """Quellen-Seite mit allen Wahl- und Parteiprogrammen.""" diff --git a/app/templates/index.html b/app/templates/index.html index 13d733d..1d55a1d 100644 --- a/app/templates/index.html +++ b/app/templates/index.html @@ -700,6 +700,7 @@ 📚 Quellen + 🔍 Methodik 📈 Auswertungen diff --git a/app/templates/methodik.html b/app/templates/methodik.html new file mode 100644 index 0000000..c9d60f2 --- /dev/null +++ b/app/templates/methodik.html @@ -0,0 +1,363 @@ + + + + + + Methodik — {{ app_name }} + + + +
+

{{ app_name }}

+ Bewertungen + Auswertungen + Quellen + Methodik +
+ +
+

Wie funktioniert der GWÖ-Antragsprüfer?

+ +
+

+ Der GWÖ-Antragsprüfer bewertet Parlamentsanträge automatisch nach der + Gemeinwohl-Ökonomie Matrix 2.0 für Gemeinden. Jede Bewertung + analysiert drei Dimensionen: GWÖ-Treue, Übereinstimmung mit Wahlprogrammen + und Übereinstimmung mit Grundsatzprogrammen der Parteien. +

+

+ Alle Bewertungen werden durch ein KI-Sprachmodell erzeugt und anschließend + automatisch verifiziert — Zitate werden gegen die Originaltexte + der Wahlprogramme geprüft, nicht-verifizierbare Zitate werden verworfen. +

+
+ +

Die GWÖ-Matrix 2.0

+ +
+

Die Matrix besteht aus 5 Berührungsgruppen (Zeilen) und + 5 Werten (Spalten) = 25 Themenfelder:

+ +
+
+
Menschen­würde
+
Solidarität
+
Ökologische Nachhaltig­keit
+
Soziale Gerechtig­keit
+
Transparenz & Demokratie
+ +
A · Lieferanten
+
A1
A2
A3
A4
A5
+ +
B · Finanzen
+
B1
B2
B3
B4
B5
+ +
C · Verwaltung
+
C1
C2
C3
C4
C5
+ +
D · Bürger
+
D1
D2
D3
D4
D5
+ +
E · Gesellschaft
+
E1
E2
E3
E4
E5
+
+ +

Jedes Feld wird auf einer Skala von -5 (fundamental widersprechend) + bis +5 (stark fördernd) bewertet. Der Gesamtscore (0-10) gewichtet + die Matrix-Bewertungen und berücksichtigt Ausschlusskriterien:

+ + + + + + + + +
SymbolRatingBedeutung
+++4 bis +5Stark fördernd, vorbildlich
++1 bis +3Fördernd
0Neutral / nicht berührt
-1 bis -3Widersprechend
−−-4 bis -5Stark widersprechend
+ +
+ Mehr zur GWÖ-Matrix +

+ Die Matrix basiert auf dem + Arbeitsbuch der Gemeinwohl-Ökonomie. + Die Adaption für Gemeinden fokussiert auf kommunale Handlungsfelder: + Beschaffung, Haushalt, Verwaltung, Daseinsvorsorge und überregionale Wirkung. +

+
+
+ +

Analyse-Pipeline

+ +
+

Jede Bewertung durchläuft fünf Schritte:

+ +
+
1
+
+ Antrags-Text herunterladen
+ Der Volltext wird automatisch aus dem jeweiligen Landtags-Portal geholt + ({{ adapter_count }} Parlamente angebunden). Der PDF-Text wird via PyMuPDF extrahiert. +
+
+ +
+
2
+
+ Relevante Wahlprogramm-Passagen suchen
+ Für alle Fraktionen der Wahlperiode werden per Embedding-Suche + (Qwen text-embedding-v3) die thematisch relevantesten Passagen aus Wahl- und + Grundsatzprogrammen gesucht (Top-5 pro Partei, Cosinus-Ähnlichkeit ≥ 0.45). +
+
+ +
+
3
+
+ KI-Bewertung
+ Ein Sprachmodell ({{ model_name }}) bewertet den Antrag anhand der GWÖ-Matrix + und vergleicht ihn mit den gefundenen Programm-Passagen. Der Prompt enthält + strikte Regeln für die Quellenangabe (nur wörtliche Zitate aus den vorgelegten Passagen). +
+
+ +
+
4
+
+ Zitat-Verifikation
+ Jedes vom Modell genannte Zitat wird server-seitig verifiziert: + Der zitierte Text muss als Substring (oder 5-Wort-Sequenz) in einem der + vorgelegten Chunks auffindbar sein. Nicht-verifizierbare Zitate werden + verworfen — Quellenangabe und Seitenzahl werden aus dem echten Treffer + rekonstruiert, nicht aus der Modell-Ausgabe übernommen. +
+
+ +
+
5
+
+ Persistierung & Darstellung
+ Die verifizierte Bewertung wird gespeichert. Klick auf ein Zitat öffnet + das Original-Wahlprogramm-PDF mit gelb markierter Fundstelle. +
+
+ +
+ Technische Details zum Sprachmodell +
+ + + + + + + +
EigenschaftWert
Modell{{ model_name }}
AnbieterDashScope (Alibaba Cloud)
Retry bei Parse-Fehlern3 Versuche mit steigender Temperatur
Embedding-Modelltext-embedding-v3 (1024 Dimensionen)
Chunk-Größe400 Wörter, 50 Wörter Overlap
+
+
+
+ +

Wahlprogramm-Vergleich

+ +
+

+ Für jede Fraktion der aktuellen Wahlperiode wird die Passung + des Antrags zu zwei Programmen bewertet: +

+
    +
  • Wahlprogramm — das Landtags-Wahlprogramm der jeweiligen Legislaturperiode
  • +
  • Grundsatzprogramm — das aktuelle Bundespartei-Grundsatzprogramm
  • +
+

+ Aktuell sind {{ programme_count }} Programme indexiert + ({{ chunk_count }} Textabschnitte). Die vollständige Liste ist auf der + Quellen-Seite einsehbar. +

+ +
+ Wichtig: Wenn für eine Fraktion kein Programm im Index vorhanden ist, + wird kein Score vergeben — stattdessen erscheint ein Hinweis. Bewertungen + basieren ausschließlich auf verifizierbaren Quellen, nicht auf dem Trainingswissen + des Sprachmodells. +
+
+ +

Qualitätssicherung

+ +
+

Zitat-Verifikation (Sub-D)

+

+ Ein automatisierter Property-Test prüft für jedes in der Datenbank gespeicherte + Zitat, ob der zitierte Text tatsächlich auf der angegebenen Seite des + Wahlprogramm-PDFs vorkommt (Substring- oder 5-Wort-Anker-Match). Dieses + Verfahren hat im April 2026 drei halluzinierte Zitate aufgedeckt und zur + Implementierung der server-seitigen Verifikation geführt. +

+ +

Server-seitige Quellen-Rekonstruktion

+

+ Das Sprachmodell darf keine Quellenangaben (Programmname, Seitenzahl) frei + erfinden. Nach jeder Analyse wird jedes Zitat gegen die tatsächlich vorgelegten + Textabschnitte abgeglichen. Quellenangabe und URL werden aus dem gefundenen + Treffer server-seitig konstruiert — die Modell-Ausgabe für + diese Felder wird verworfen. +

+ +

Automatische Neu-Analyse

+

+ Wenn ein Nutzer auf ein Zitat klickt und die Textstelle im PDF nicht auffindbar + ist (z.B. bei älteren Bewertungen vor der Verifikations-Einführung), wird der + Antrag automatisch mit der aktuellen Pipeline neu analysiert. +

+
+ +

Einschränkungen

+ +
+
    +
  • Keine juristische Bewertung — die GWÖ-Analyse ist eine + wertebasierte Einordnung, keine Rechtsprüfung.
  • +
  • KI-Bias — Sprachmodelle können systematische Verzerrungen + aufweisen. Die Bewertungen sollten als Orientierung verstanden werden, + nicht als objektive Wahrheit.
  • +
  • Nur indexierte Programme — Parteien ohne hinterlegtes + Programm können nicht zuverlässig bewertet werden.
  • +
  • Keine Analyse des Abstimmungsverhaltens — bewertet wird + der Antragstext, nicht ob oder wie darüber abgestimmt wurde.
  • +
  • Aktualität — Wahlprogramme werden einmalig zur Wahl + indexiert und nicht automatisch aktualisiert.
  • +
+
+ +

Datenquellen

+ +
+

{{ adapter_count }} Parlamente sind angebunden:

+ + + {% for bl in bundeslaender %} + + + + + {% endfor %} +
ParlamentDoku-System
{{ bl.name }} ({{ bl.code }}){{ bl.doku_system }}
+

+ Vollständige Programm-Liste · + Technische Adapter-Vergleichsmatrix · + Architektur-Entscheidungen (ADRs) +

+
+
+ + + +