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: +

+ +

+ 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

+ +
+ +
+ +

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) +

+
+
+ + + +