gwoe-antragspruefer/app/templates/v2/screens/methodik.html

533 lines
35 KiB
HTML
Raw Normal View History

{% extends "v2/base.html" %}
{% block title %}Methodik — GWÖ-Antragsprüfer{% endblock %}
{% set v2_active_nav = "" %}
{% block head_extra %}
<style>
.meth-layout {
display: grid;
grid-template-columns: 220px 1fr;
gap: 2rem;
align-items: start;
}
@media (max-width: 720px) {
.meth-layout { grid-template-columns: 1fr; }
.meth-toc { display: none; }
}
.meth-toc {
position: sticky;
top: 72px;
font-size: 12px;
font-family: var(--font-mono);
line-height: 1.8;
border-left: 2px solid var(--ecg-green);
padding-left: 12px;
color: var(--ecg-dark);
opacity: 0.75;
}
.meth-toc a {
display: block;
color: inherit;
text-decoration: none;
opacity: 0.75;
transition: opacity 0.1s;
}
.meth-toc a:hover { opacity: 1; color: var(--ecg-green); }
.meth-toc .toc-section { font-weight: 700; margin-top: 8px; opacity: 1; }
.meth-body h2 {
font-family: var(--font-display);
font-size: 18px;
color: var(--ecg-teal);
margin: 2rem 0 0.75rem;
padding-bottom: 4px;
border-bottom: 2px solid var(--ecg-teal);
}
.meth-body h3 {
font-family: var(--font-display);
font-size: 14px;
color: var(--ecg-green);
margin: 1.25rem 0 0.4rem;
text-transform: uppercase;
letter-spacing: 0.06em;
}
.meth-body p { margin-bottom: 0.6rem; }
.meth-body ul { margin: 0.4rem 0 0.8rem 1.4rem; }
.meth-body li { margin: 0.25rem 0; }
.meth-body a { color: var(--ecg-teal); }
.meth-body table {
border-collapse: collapse;
width: 100%;
font-size: 12px;
margin: 0.5rem 0 1rem;
}
.meth-body th, .meth-body td {
border: 1px solid var(--ecg-border);
padding: 6px 8px;
text-align: left;
}
.meth-body th { background: var(--ecg-bg-subtle); font-weight: 700; font-size: 11px; }
.meth-note {
background: rgba(136,158,51,0.1);
border-left: 3px solid var(--ecg-green);
padding: 10px 14px;
margin: 1rem 0;
font-size: 13px;
border-radius: 0 4px 4px 0;
}
/* Interactive matrix grid */
.gwoe-matrix-grid {
display: grid;
grid-template-columns: 150px repeat(5, 1fr);
gap: 2px;
font-size: 11px;
margin: 1rem 0;
}
.gwoe-matrix-grid .gc { padding: 5px 4px; text-align: center; background: var(--ecg-bg-subtle); border: 1px solid var(--ecg-border); display: flex; align-items: center; justify-content: center; line-height: 1.25; min-height: 36px; }
.gwoe-matrix-grid .gh { background: var(--ecg-teal); color: #fff; font-weight: 700; cursor: help; }
.gwoe-matrix-grid .gr { background: var(--ecg-green); color: #fff; font-weight: 700; justify-content: flex-start; padding-left: 6px; text-align: left; cursor: help; }
.gwoe-matrix-grid .gc.clickable { cursor: pointer; transition: background 0.1s; }
.gwoe-matrix-grid .gc.clickable:hover { background: rgba(0,157,165,0.12); }
#field-explain {
display: none;
background: var(--ecg-bg-subtle);
border-left: 3px solid var(--ecg-green);
padding: 12px 16px;
margin: 0.5rem 0 1rem;
border-radius: 0 4px 4px 0;
font-size: 13px;
}
#field-explain strong { font-family: var(--font-display); }
.pipeline-step {
display: flex;
gap: 12px;
align-items: flex-start;
margin: 10px 0;
padding: 10px 12px;
background: var(--ecg-bg-subtle);
border-radius: 4px;
border-left: 3px solid var(--ecg-teal);
}
.step-num {
background: var(--ecg-teal);
color: #fff;
width: 26px; height: 26px;
border-radius: 50%;
display: flex; align-items: center; justify-content: center;
font-weight: 700; font-size: 12px; flex-shrink: 0;
font-family: var(--font-mono);
}
</style>
{% endblock %}
{% block main %}
<div style="padding:0 0 2rem;">
<h1 style="font-family:var(--font-display);font-size:22px;color:var(--ecg-teal);margin:0 0 4px;">Methodik</h1>
<p style="font-size:12px;font-family:var(--font-mono);color:var(--ecg-dark);opacity:0.6;">
GWÖ-Matrix 2.0 · Gemeinden · Transparenz-Dokumentation
</p>
</div>
<div class="meth-layout">
<!-- TOC -->
<nav class="meth-toc" aria-label="Inhaltsverzeichnis">
<div class="toc-section">Inhalt</div>
<a href="#gwoe">Was ist die GWÖ?</a>
<a href="#was-macht">Was macht der Prüfer?</a>
<a href="#matrix">Die Matrix 2.0</a>
<a href="#pipeline">Analyse-Pipeline</a>
<a href="#prompts">LLM-Prompts</a>
<a href="#qualitaet">Qualitätssicherung</a>
<a href="#einschraenkungen">Einschränkungen</a>
<a href="#datenquellen">Datenquellen</a>
</nav>
<!-- Content -->
<div class="meth-body">
<section id="gwoe">
<h2>Was ist die Gemeinwohl-Ökonomie?</h2>
<div class="v2-kasten outline-blue">
<p>
Die <strong>Gemeinwohl-Ökonomie (GWÖ)</strong> ist ein Wirtschaftsmodell, das den
Erfolg wirtschaftlichen Handelns nicht am Gewinn, sondern am <strong>Beitrag zum
Gemeinwohl</strong> misst. Entwickelt von Christian Felber (2010), trägt die GWÖ
eine internationale Bewegung mit über 11.000 Unterstützer:innen,
4.500 Mitgliedern und 1.000 bilanzierten Organisationen.
</p>
<h3>Das Bewertungsmodell: die Gemeinwohl-Bilanz</h3>
<p>
Das Kernstück ist die <strong>Gemeinwohl-Bilanz</strong>: ein standardisiertes
Bewertungsverfahren nach einer Matrix aus fünf Werten
(Menschenwürde, Solidarität, ökologische Nachhaltigkeit, soziale Gerechtigkeit,
Transparenz &amp; Demokratie) und fünf Berührungsgruppen.
Die aktuelle <strong>Unternehmens-Matrix (Version 5.1)</strong> ist in über 35 Ländern erprobt.
</p>
<p style="font-size:11px;">
<a href="https://germany.econgood.org/wp-content/uploads/sites/8/2025/02/ECOnGOOD_Arbeitsbuch_5_1.pdf" target="_blank">Arbeitsbuch Unternehmen 5.1 (PDF)</a> ·
<a href="https://germany.econgood.org/tools/gemeinwohl-matrix/" target="_blank">Matrix-Übersicht</a>
</p>
<h3>Adaption für die öffentliche Hand</h3>
<p>
Für <strong>Gemeinden</strong> gibt es seit 2017 das <strong>Arbeitsbuch für Gemeinden Version 2.0</strong>.
Es überträgt die Unternehmens-Matrix auf kommunale Handlungsfelder:
statt „Kund:innen" stehen <em>Bürger:innen</em> im Fokus, statt „Lieferkette"
geht es um <em>öffentliche Beschaffung</em>.
Eine aktualisierte Version 2.1.A läuft seit 2023 im Pilotbetrieb.
</p>
<p style="font-size:11px;">
<a href="https://germany.econgood.org/wp-content/uploads/sites/8/2022/05/Arbeitsbuch-Gemeinden_2.pdf" target="_blank">Arbeitsbuch Gemeinden 2.0 (PDF)</a> ·
<a href="https://germany.econgood.org/wp-content/uploads/sites/8/2024/04/20231103_Arbeitsbuch-2_1_A-final.pdf" target="_blank">Version 2.1.A Pilotfassung (PDF)</a>
</p>
<h3>Anwendung auf Parlamentsanträge</h3>
<p>
<strong>Dieser Antragsprüfer</strong> nutzt die Gemeinde-Matrix 2.0 als
Bewertungsrahmen und wendet sie systematisch auf Parlamentsanträge aller
deutschen Landtage und des Bundestags an. Parlamentsanträge gestalten die
Rahmenbedingungen, unter denen Gemeinden handeln — ihre Gemeinwohl-Wirkung
zu messen macht sie vergleichbar und transparent.
</p>
</div>
</section>
<section id="was-macht">
<h2>Was macht der GWÖ-Antragsprüfer?</h2>
<div class="v2-kasten outline-green">
<p>Jeder Antrag wird automatisch analysiert und erhält:</p>
<ul>
<li><strong>GWÖ-Score (010)</strong> — wie stark fördert oder widerspricht der Antrag den fünf Gemeinwohl-Werten?</li>
<li><strong>25-Felder-Matrix</strong> — detaillierte Bewertung für jede Kombination aus Berührungsgruppe und Wert</li>
<li><strong>Wahlprogramm-Treue</strong> — wie gut passt der Antrag zu den Wahl- und Grundsatzprogrammen der Fraktionen, belegt mit verifizierten Zitaten?</li>
<li><strong>Verbesserungsvorschläge</strong> — konkrete Textänderungen im Redline-Format</li>
</ul>
<p style="margin-top:0.5rem;">
Ziel ist <strong>Transparenz</strong>: Bürger:innen können nachvollziehen, welche
Anträge dem Gemeinwohl dienen — und welche dagegen arbeiten.
Die Bewertungen sind öffentlich, maschinenlesbar (JSON/CSV/Atom-Feed) und unter CC BY 4.0 lizenziert.
</p>
</div>
</section>
<section id="matrix">
<h2>Die GWÖ-Matrix 2.0 für Gemeinden</h2>
<div class="v2-kasten outline-blue">
<p><strong>5 Berührungsgruppen</strong> (Zeilen) × <strong>5 Werte</strong> (Spalten) = 25 Bewertungsfelder.
Jedes Feld wird von <strong>5</strong> (fundamental widersprechend) bis <strong>+5</strong>
(stark fördernd) bewertet. Der GWÖ-Score (010) ist ein gewichteter Durchschnitt.</p>
</div>
<h3>Die fünf Werte (Spalten)</h3>
<table>
<tr><th style="width:30%;">Wert</th><th>Leitfrage</th></tr>
<tr><td><strong>1. Menschenwürde</strong></td><td>Werden Grundrechte geschützt? Rechtliche Gleichstellung? Schutz vor Diskriminierung?</td></tr>
<tr><td><strong>2. Solidarität</strong></td><td>Wird das Gemeinwohl gefördert? Mehrwert für die Gemeinschaft? Kooperation statt Konkurrenz?</td></tr>
<tr><td><strong>3. Ökologische Nachhaltigkeit</strong></td><td>Klimaschutz? Ressourcenschonung? Biodiversität? Kreislaufwirtschaft?</td></tr>
<tr><td><strong>4. Soziale Gerechtigkeit</strong></td><td>Gerechte Verteilung? Daseinsvorsorge? Soziale Absicherung? Chancengleichheit?</td></tr>
<tr><td><strong>5. Transparenz &amp; Demokratie</strong></td><td>Bürgerbeteiligung? Offenlegung? Demokratische Prozesse? Rechenschaftspflicht?</td></tr>
</table>
<h3>Die fünf Berührungsgruppen (Zeilen)</h3>
<table>
<tr><th style="width:30%;">Gruppe</th><th>Wer ist gemeint?</th></tr>
<tr><td><strong>A · Lieferant:innen</strong></td><td>Externe Beschaffung, Lieferketten, Dienstleister:innen</td></tr>
<tr><td><strong>B · Finanzen</strong></td><td>Umgang mit öffentlichen Mitteln, Haushalt, Steuerzahler:innen</td></tr>
<tr><td><strong>C · Verwaltung</strong></td><td>Mandatsträger:innen, Mitarbeitende, Ehrenamtliche</td></tr>
<tr><td><strong>D · Bürger:innen</strong></td><td>Wirkung innerhalb der Grenzen, Daseinsvorsorge</td></tr>
<tr><td><strong>E · Gesellschaft &amp; Natur</strong></td><td>Wirkung über die Grenzen hinaus, Zukunft</td></tr>
</table>
<h3>Alle 25 Felder</h3>
<p style="font-size:11px;opacity:0.7;margin-bottom:8px;">Klick auf ein Feld für Details.</p>
<div id="field-explain">
<div style="display:flex;justify-content:space-between;align-items:center;">
<strong id="field-explain-title"></strong>
<button onclick="document.getElementById('field-explain').style.display='none'"
style="background:none;border:none;cursor:pointer;color:var(--ecg-dark);opacity:0.5;font-size:14px;">✕</button>
</div>
<div id="field-explain-text" style="margin-top:8px;line-height:1.6;"></div>
</div>
<div class="gwoe-matrix-grid">
<div class="gc"></div>
<div class="gc gh" title="Wert 1 — Menschenwürde (Rechtsstaatsprinzip): Werden Grundrechte geschützt? Rechtliche Gleichstellung, Schutz vor Diskriminierung.">Menschenwürde</div>
<div class="gc gh" title="Wert 2 — Solidarität (Gemeinnutz): Wird das Gemeinwohl gefördert? Mehrwert für die Gemeinschaft, Kooperation statt Konkurrenz.">Solidarität</div>
<div class="gc gh" title="Wert 3 — Ökologische Nachhaltigkeit (Umwelt-Verantwortung): Klimaschutz, Ressourcenschonung, Biodiversität, Kreislaufwirtschaft.">Ökologische Nachhaltigkeit</div>
<div class="gc gh" title="Wert 4 — Soziale Gerechtigkeit (Sozialstaatsprinzip): Gerechte Verteilung, Daseinsvorsorge, soziale Absicherung, Chancengleichheit.">Soziale Gerechtigkeit</div>
<div class="gc gh" title="Wert 5 — Transparenz & Mitbestimmung (Demokratie): Bürgerbeteiligung, Offenlegung, demokratische Prozesse, Rechenschaftspflicht.">Transparenz & Mitbestimmung</div>
<div class="gc gr" title="Berührungsgruppe A — Lieferant:innen, ausgelagerte Betriebe, Dienstleister:innen. Externe Beschaffung und Lieferketten der Kommune.">A · Lieferant:innen</div>
<div class="gc clickable" onclick="showField('A1')" title="A1 — Grundrechtsschutz in der Lieferkette"><strong>A1</strong><br><small>Grundrechte Lieferkette</small></div>
<div class="gc clickable" onclick="showField('A2')" title="A2 — Nutzen für die Gemeinde"><strong>A2</strong><br><small>Nutzen Gemeinde</small></div>
<div class="gc clickable" onclick="showField('A3')" title="A3 — Ökologische Verantwortung in der Lieferkette"><strong>A3</strong><br><small>Ökol. Verantwortung</small></div>
<div class="gc clickable" onclick="showField('A4')" title="A4 — Soziale Verantwortung in der Lieferkette"><strong>A4</strong><br><small>Soziale Verantwortung</small></div>
<div class="gc clickable" onclick="showField('A5')" title="A5 — Rechenschaft und Mitsprache bei Beschaffung"><strong>A5</strong><br><small>Rechenschaft</small></div>
<div class="gc gr" title="Berührungsgruppe B — Finanzpartner:innen, Geldgeber:innen, Steuerzahler:innen. Umgang mit öffentlichen Mitteln und Haushalt.">B · Finanzen</div>
<div class="gc clickable" onclick="showField('B1')" title="B1 — Ethisches Finanzgebaren"><strong>B1</strong><br><small>Eth. Finanzgebaren</small></div>
<div class="gc clickable" onclick="showField('B2')" title="B2 — Gemeinnutz im Finanzgebaren"><strong>B2</strong><br><small>Gemeinnutz</small></div>
<div class="gc clickable" onclick="showField('B3')" title="B3 — Ökologische Verantwortung der Finanzpolitik"><strong>B3</strong><br><small>Ökol. Finanzpolitik</small></div>
<div class="gc clickable" onclick="showField('B4')" title="B4 — Soziale Verantwortung der Finanzpolitik"><strong>B4</strong><br><small>Soz. Finanzpolitik</small></div>
<div class="gc clickable" onclick="showField('B5')" title="B5 — Partizipation in der Finanzpolitik"><strong>B5</strong><br><small>Partizipation</small></div>
<div class="gc gr" title="Berührungsgruppe C — Politische Führung, Verwaltung, Ehrenamtliche. Mandatsträger:innen und Mitarbeitende der Kommune.">C · Verwaltung</div>
<div class="gc clickable" onclick="showField('C1')" title="C1 — Individuelle Rechts- und Gleichstellung"><strong>C1</strong><br><small>Gleichstellung</small></div>
<div class="gc clickable" onclick="showField('C2')" title="C2 — Gemeinsame Zielvereinbarung für das Gemeinwohl"><strong>C2</strong><br><small>Gemeinsame Ziele</small></div>
<div class="gc clickable" onclick="showField('C3')" title="C3 — Förderung ökologischen Verhaltens intern"><strong>C3</strong><br><small>Ökol. Verhalten</small></div>
<div class="gc clickable" onclick="showField('C4')" title="C4 — Gerechte Verteilung von Arbeit"><strong>C4</strong><br><small>Gerechte Arbeit</small></div>
<div class="gc clickable" onclick="showField('C5')" title="C5 — Transparente Kommunikation intern"><strong>C5</strong><br><small>Transparenz intern</small></div>
<div class="gc gr" title="Berührungsgruppe D — Bürger:innen und Wirtschaft. Wirkung innerhalb der Gemeindegrenzen, Daseinsvorsorge.">D · Bürger:innen</div>
<div class="gc clickable" onclick="showField('D1')" title="D1 — Schutz des Individuums, Rechtsgleichheit"><strong>D1</strong><br><small>Rechtsgleichheit</small></div>
<div class="gc clickable" onclick="showField('D2')" title="D2 — Gesamtwohl in der Gemeinde"><strong>D2</strong><br><small>Gesamtwohl</small></div>
<div class="gc clickable" onclick="showField('D3')" title="D3 — Ökologische Gestaltung der öffentlichen Leistung"><strong>D3</strong><br><small>Ökol. Leistung</small></div>
<div class="gc clickable" onclick="showField('D4')" title="D4 — Soziale Gestaltung der öffentlichen Leistung"><strong>D4</strong><br><small>Soz. Leistung</small></div>
<div class="gc clickable" onclick="showField('D5')" title="D5 — Transparente Kommunikation und demokratische Einbindung"><strong>D5</strong><br><small>Demokratie</small></div>
<div class="gc gr" title="Berührungsgruppe E — Staat, Gesellschaft und Natur. Wirkung über die Gemeindegrenzen hinaus, Zukunft.">E · Gesellschaft & Natur</div>
<div class="gc clickable" onclick="showField('E1')" title="E1 — Menschenwürdiges Leben für zukünftige Generationen"><strong>E1</strong><br><small>Zukunft</small></div>
<div class="gc clickable" onclick="showField('E2')" title="E2 — Beitrag zum Gesamtwohl über die Gemeindegrenzen hinaus"><strong>E2</strong><br><small>Beitrag Gesamtwohl</small></div>
<div class="gc clickable" onclick="showField('E3')" title="E3 — Verantwortung für ökologische Auswirkungen jenseits der Gemeinde"><strong>E3</strong><br><small>Ökol. Auswirkungen</small></div>
<div class="gc clickable" onclick="showField('E4')" title="E4 — Beitrag zum sozialen Ausgleich"><strong>E4</strong><br><small>Sozialer Ausgleich</small></div>
<div class="gc clickable" onclick="showField('E5')" title="E5 — Transparente und demokratische Mitbestimmung auf übergeordneter Ebene"><strong>E5</strong><br><small>Demokratie global</small></div>
</div>
<details style="font-size:12px;margin-top:8px;">
<summary style="cursor:pointer;color:var(--ecg-teal);font-weight:600;padding:4px 0;">Bewertungsskala</summary>
<table style="margin-top:6px;font-size:11px;">
<tr><th>Symbol</th><th>Rating</th><th>Bedeutung</th></tr>
<tr><td>++</td><td>+4 bis +5</td><td>Stark fördernd, vorbildlich</td></tr>
<tr><td>+</td><td>+1 bis +3</td><td>Fördernd</td></tr>
<tr><td></td><td>0</td><td>Neutral / nicht berührt</td></tr>
<tr><td></td><td>1 bis 3</td><td>Widersprechend</td></tr>
<tr><td></td><td>4 bis 5</td><td>Stark widersprechend</td></tr>
</table>
</details>
</section>
<section id="pipeline">
<h2>Analyse-Pipeline</h2>
<div class="v2-kasten outline-blue">
<div class="pipeline-step">
<div class="step-num">1</div>
<div>
<strong>Antragstext laden</strong><br>
Der PDF-Volltext wird aus dem Landtags-Portal geholt
({{ adapter_count }} Parlamente angebunden). Nur echte Anträge und
Gesetzentwürfe werden analysiert — Kleine Anfragen werden übersprungen.
</div>
</div>
<div class="pipeline-step">
<div class="step-num">2</div>
<div>
<strong>Wahlprogramm-Passagen suchen</strong><br>
Per semantischer Suche ({{ embedding_model }}, 1024 Dimensionen) werden für
<strong>jede Fraktion</strong> die thematisch relevantesten Passagen aus
Wahl- und Grundsatzprogrammen gefunden. Aktuell {{ programme_count }} Programme
mit {{ chunk_count }} Textabschnitten indexiert.
</div>
</div>
<div class="pipeline-step">
<div class="step-num">3</div>
<div>
<strong>KI-Bewertung</strong><br>
Ein Sprachmodell ({{ model_name }}) bewertet den Antrag anhand der
GWÖ-Matrix und vergleicht ihn mit den gefundenen Programmpassagen.
Der Prompt erzwingt die Verwendung wörtlicher Zitate.
</div>
</div>
<div class="pipeline-step">
<div class="step-num">4</div>
<div>
<strong>Zitat-Verifikation</strong><br>
Jedes Zitat wird <strong>server-seitig verifiziert</strong>: der Text muss
als Substring im Original-PDF auffindbar sein. Quellenangabe und Seitenzahl
werden aus dem echten Treffer rekonstruiert — die Modell-Ausgabe wird für diese
Felder verworfen.
</div>
</div>
<details style="font-size:12px;margin-top:8px;">
<summary style="cursor:pointer;color:var(--ecg-teal);font-weight:600;padding:4px 0;">Technische Details</summary>
<table style="margin-top:6px;font-size:11px;">
<tr><th>Eigenschaft</th><th>Wert</th></tr>
<tr><td>Sprachmodell</td><td>{{ model_name }} (DashScope / Alibaba Cloud)</td></tr>
<tr><td>Embedding-Modell</td><td>{{ embedding_model }} (1024 Dimensionen)</td></tr>
<tr><td>Chunk-Größe</td><td>400 Wörter, 50 Wörter Overlap</td></tr>
<tr><td>Retry bei Parse-Fehlern</td><td>3 Versuche mit steigender Temperatur</td></tr>
<tr><td>Zitat-Verifikation</td><td>Substring- oder 5-Wort-Anker-Match gegen Original-PDF</td></tr>
</table>
</details>
</div>
</section>
<section id="prompts">
<h2>LLM-Prompts</h2>
<div class="v2-kasten outline-blue">
<p>
Volle Transparenz: hier liegen die exakten Anweisungen, mit denen das
Sprachmodell ({{ model_name }}) jeden Antrag bewertet.
</p>
<h3 style="margin-top:0.75rem;">Wie System- und User-Prompt zusammenwirken</h3>
<p>
Beide Prompts werden in <strong>einem einzigen API-Call</strong>
gesendet — nicht getrennt ausgeführt. Sie fließen gemeinsam ins
Modell-Kontextfenster und werden zusammen bewertet.
</p>
<table style="margin-top:0.5rem;">
<tr>
<th style="width:30%;">System-Prompt (statisch, ~5 KB)</th>
<th>User-Prompt (dynamisch, pro Antrag)</th>
</tr>
<tr>
<td><strong>Wer und wie</strong> bewertet wird: GWÖ-Matrix-Definition, 25 Felder, Bewertungs-Skala, Empfehlungs-Kategorien, Ausgabe-JSON-Schema, strenge Regeln (max. 3 Verbesserungs­vorschläge, wörtliche Zitate, …).</td>
<td><strong>Was</strong> bewertet wird: BL-Spezifika, semantisch gefundene Wahlprogramm-Chunks, der Antragstext selbst, Pflicht-Fraktionen-Liste.</td>
</tr>
</table>
<p>
Das Modell wendet die Matrix-Definition aus dem System-Prompt auf
den Antragstext aus dem User-Prompt an. Ohne System-Prompt wüsste
es nicht <em>wonach</em> es bewerten soll; ohne User-Prompt
hätte es nichts zu bewerten.
</p>
<p style="font-size:12px;opacity:0.85;">
<strong>Warum die Trennung?</strong>
</p>
<ul style="font-size:12px;opacity:0.85;">
<li><strong>Caching:</strong> Der API-Anbieter cached den System-Prompt — pro neuem Antrag werden nur die User-Tokens verrechnet.</li>
<li><strong>Modell-Compliance:</strong> Sprachmodelle behandeln System-Anweisungen mit höherem Vertrauen, was robuster gegen Prompt-Injection aus dem Antragstext ist.</li>
<li><strong>Wartbarkeit:</strong> statische Bewertungs-Regeln getrennt vom dynamischen Inhalt — leichter zu pflegen, leichter zu auditieren.</li>
</ul>
<p style="font-size:11px;opacity:0.7;">
Quelle: <a href="https://repo.toppyr.de/tobias/gwoe-antragspruefer/src/branch/main/app/analyzer.py" target="_blank"><code>app/analyzer.py</code></a>
(<code>get_system_prompt()</code> und <code>get_user_prompt_template()</code>);
API-Aufruf in <a href="https://repo.toppyr.de/tobias/gwoe-antragspruefer/src/branch/main/app/adapters/qwen_bewerter.py" target="_blank"><code>app/adapters/qwen_bewerter.py</code></a>
(Zeilen 8385, <code>messages=[{"role":"system",…}, {"role":"user",…}]</code>).
</p>
<h3 style="margin-top:1rem;">Die Prompts im Wortlaut</h3>
<p style="font-size:12px;">
Der User-Prompt unten ist als <em>Template</em> abgebildet — die
Platzhalter <code>{kontext}</code>, <code>{wahlprogramm_zitate}</code>,
<code>{antrag}</code> und <code>{pflicht_fraktionen}</code> werden
pro Antrag mit den konkreten Inhalten gefüllt.
</p>
<details style="margin-top:1rem;">
<summary style="cursor:pointer;color:var(--ecg-teal);font-weight:700;padding:6px 0;font-family:var(--font-display);">
System-Prompt anzeigen
<span style="font-family:var(--font-mono);font-size:11px;opacity:0.6;font-weight:400;">({{ system_prompt|length }} Zeichen)</span>
</summary>
<pre style="background:var(--ecg-bg-subtle);border:1px solid var(--ecg-border);border-radius:4px;padding:14px 16px;margin-top:8px;font-family:var(--font-mono);font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--ecg-dark);overflow-x:auto;">{{ system_prompt }}</pre>
</details>
<details style="margin-top:0.75rem;">
<summary style="cursor:pointer;color:var(--ecg-teal);font-weight:700;padding:6px 0;font-family:var(--font-display);">
User-Prompt-Template anzeigen
<span style="font-family:var(--font-mono);font-size:11px;opacity:0.6;font-weight:400;">({{ user_prompt_template|length }} Zeichen)</span>
</summary>
<pre style="background:var(--ecg-bg-subtle);border:1px solid var(--ecg-border);border-radius:4px;padding:14px 16px;margin-top:8px;font-family:var(--font-mono);font-size:11px;line-height:1.5;white-space:pre-wrap;word-break:break-word;color:var(--ecg-dark);overflow-x:auto;">{{ user_prompt_template }}</pre>
</details>
</div>
</section>
<section id="qualitaet">
<h2>Qualitätssicherung</h2>
<div class="v2-kasten outline-green">
<ul>
<li><strong>Automatische Zitat-Verifikation</strong> — jedes Zitat wird gegen das
Original-PDF geprüft. Nicht-verifizierbare Zitate werden verworfen.</li>
<li><strong>Typ-Filterung</strong> — nur abstimmbare Drucksachen (Anträge,
Gesetzentwürfe) werden bewertet.</li>
<li><strong>Automatische Neu-Analyse</strong> — wenn ein Zitat nicht auffindbar ist,
wird der Antrag mit der aktuellen Pipeline neu analysiert.</li>
<li><strong>Open Data</strong> — alle Bewertungen sind als JSON und CSV exportierbar
(CC BY 4.0).</li>
</ul>
</div>
</section>
<section id="einschraenkungen">
<h2>Einschränkungen</h2>
<div class="v2-kasten outline-blue">
<ul>
<li><strong>Wertebasierte Einordnung, keine Rechtsprüfung</strong></li>
<li><strong>KI-Bias</strong> — Sprachmodelle können systematische Verzerrungen aufweisen. Bewertungen sind Orientierung, nicht objektive Wahrheit.</li>
<li><strong>Programmabhängig</strong> — Fraktionen ohne hinterlegtes Wahlprogramm erhalten keinen Programm-Vergleich.</li>
<li><strong>Antragstext, nicht Umsetzung</strong> — bewertet wird was im Antrag steht, nicht ob es umgesetzt wird.</li>
</ul>
</div>
</section>
<section id="datenquellen">
<h2>Datenquellen</h2>
<div class="v2-kasten outline-green">
<p><strong>{{ adapter_count }} Parlamente</strong> angebunden:</p>
<table>
<tr><th>Parlament</th><th>System</th></tr>
{% for bl in bundeslaender %}
<tr><td>{{ bl.name }} ({{ bl.code }})</td><td>{{ bl.doku_system }}</td></tr>
{% endfor %}
</table>
<p style="margin-top:0.75rem;font-size:11px;">
<a href="/quellen">Programme &amp; Quellen</a> ·
<a href="/api/auswertungen/export.json" download>Open Data (JSON)</a> ·
<a href="/api/feed.xml">Atom-Feed</a> ·
<a href="https://repo.toppyr.de/tobias/gwoe-antragspruefer" target="_blank">Quellcode</a>
</p>
</div>
</section>
</div>{# .meth-body #}
</div>{# .meth-layout #}
{% endblock %}
{% block body_scripts %}
<script>
const fieldInfo = {
"A1": { label: "Grundrechtsschutz in der Lieferkette", text: "<p><strong>Praxis:</strong> Wenn die öffentliche Hand Büromöbel, IT-Geräte oder Dienstkleidung beschafft: Unter welchen Bedingungen wurden diese hergestellt? Werden Lieferant:innen verpflichtet, Arbeitsschutzstandards und Menschenrechte einzuhalten?</p><p><strong>Theorie:</strong> Die GWÖ versteht Menschenwürde als unteilbar und kettenübergreifend. Das Feld A1 operationalisiert den Zusammenhang zwischen kommunaler Beschaffung und globalem Menschenrechtsschutz.</p>" },
"A2": { label: "Nutzen für die Gemeinde", text: "<p><strong>Praxis:</strong> Beauftragt die Kommune den Betrieb aus dem Ort — oder den billigsten Konzern aus dem Ausland? Bleiben Steuergelder in der Region?</p><p><strong>Theorie:</strong> Solidarität beginnt in der Nachbarschaft. Die GWÖ misst, ob die Beschaffungspolitik aktiv zur regionalen Wertschöpfung beiträgt.</p>" },
"A3": { label: "Ökologische Verantwortung in der Lieferkette", text: "<p><strong>Praxis:</strong> Werden bei öffentlichen Aufträgen Klimastandards verlangt? Kommt das Schulessen von regionalen Bauernhöfen?</p><p><strong>Theorie:</strong> Die ökologische Säule der GWÖ fordert, dass Umweltkosten nicht externalisiert werden.</p>" },
"A4": { label: "Soziale Verantwortung in der Lieferkette", text: "<p><strong>Praxis:</strong> Verdienen die Reinigungskräfte im Rathaus einen fairen Lohn? Werden Mindestlöhne kontrolliert?</p><p><strong>Theorie:</strong> Soziale Gerechtigkeit endet nicht am Werkstor.</p>" },
"A5": { label: "Rechenschaft und Mitsprache bei Beschaffung", text: "<p><strong>Praxis:</strong> Können Bürger:innen nachschauen, welche Firma den Auftrag bekommen hat — und warum? Gibt es ein öffentliches Vergaberegister?</p><p><strong>Theorie:</strong> Transparenz ist das Immunsystem der Demokratie. A5 misst, ob Beschaffungsprozesse nachvollziehbar sind.</p>" },
"B1": { label: "Ethisches Finanzgebaren", text: "<p><strong>Praxis:</strong> Liegt das Geld bei einer ethischen Bank — oder bei einer, die Waffengeschäfte finanziert? Gibt es ethische Anlagerichtlinien?</p><p><strong>Theorie:</strong> Die GWÖ betrachtet Geld als Mittel zum Zweck, nicht als Selbstzweck.</p>" },
"B2": { label: "Gemeinnutz im Finanzgebaren", text: "<p><strong>Praxis:</strong> Fließen Steuergelder in einen Radweg für alle — oder in eine Umgehungsstraße nur fürs Gewerbegebiet?</p><p><strong>Theorie:</strong> Solidarität in der Finanzpolitik heißt: öffentliches Geld dient öffentlichen Zwecken.</p>" },
"B3": { label: "Ökologische Verantwortung der Finanzpolitik", text: "<p><strong>Praxis:</strong> Investiert die Kommune in Solaranlagen? Werden Folgekosten des Klimawandels berücksichtigt?</p><p><strong>Theorie:</strong> Ökologische Nachhaltigkeit muss sich im Haushalt widerspiegeln.</p>" },
"B4": { label: "Soziale Verantwortung der Finanzpolitik", text: "<p><strong>Praxis:</strong> Bekommen ärmere Stadtteile genauso viel für Spielplätze wie reiche?</p><p><strong>Theorie:</strong> Soziale Gerechtigkeit erfordert bewusste Verteilungsentscheidungen.</p>" },
"B5": { label: "Partizipation in der Finanzpolitik", text: "<p><strong>Praxis:</strong> Gibt es einen Bürgerhaushalt? Werden Haushaltsentwürfe verständlich aufbereitet?</p><p><strong>Theorie:</strong> Demokratie braucht finanzielle Transparenz.</p>" },
"C1": { label: "Individuelle Rechts- und Gleichstellung", text: "<p><strong>Praxis:</strong> Werden Frauen gleich bezahlt? Gibt es Schutz vor Mobbing? Anonymisierte Bewerbungsverfahren?</p><p><strong>Theorie:</strong> Die Menschenwürde der Mitarbeitenden ist die Grundlage jeder guten Verwaltung.</p>" },
"C2": { label: "Gemeinsame Zielvereinbarung für das Gemeinwohl", text: "<p><strong>Praxis:</strong> Hat die Stadt ein Klimaschutzkonzept, das alle Ämter gemeinsam umsetzen?</p><p><strong>Theorie:</strong> Solidarität innerhalb der Verwaltung bedeutet: alle ziehen am selben Strang.</p>" },
"C3": { label: "Förderung ökologischen Verhaltens intern", text: "<p><strong>Praxis:</strong> Fahren Mitarbeitende mit dem Dienstrad oder dem SUV? Gibt es vegetarisches Essen in der Kantine?</p><p><strong>Theorie:</strong> Die Kommune hat eine Vorbildfunktion.</p>" },
"C4": { label: "Gerechte Verteilung von Arbeit", text: "<p><strong>Praxis:</strong> Können Eltern in der Verwaltung Teilzeit arbeiten ohne Karrierenachteile?</p><p><strong>Theorie:</strong> Soziale Gerechtigkeit beginnt beim eigenen Personal.</p>" },
"C5": { label: "Transparente Kommunikation intern", text: "<p><strong>Praxis:</strong> Können Bürger:innen die Sitzungsprotokolle online lesen?</p><p><strong>Theorie:</strong> Transparenz nach innen und außen ist die Voraussetzung für Vertrauen.</p>" },
"D1": { label: "Schutz des Individuums, Rechtsgleichheit", text: "<p><strong>Praxis:</strong> Werden Bürger:innen auf dem Amt fair behandelt — egal welchen Namen sie tragen?</p><p><strong>Theorie:</strong> Menschenwürde bedeutet: jeder Mensch hat den gleichen Wert.</p>" },
"D2": { label: "Gesamtwohl in der Gemeinde", text: "<p><strong>Praxis:</strong> Profitiert die ganze Stadt — oder nur ein Stadtteil, eine Altersgruppe?</p><p><strong>Theorie:</strong> Solidarität auf kommunaler Ebene heißt: das Gesamtwohl geht vor Partikularinteressen.</p>" },
"D3": { label: "Ökologische Gestaltung der öffentlichen Leistung", text: "<p><strong>Praxis:</strong> Kommt der Strom für die Straßenbeleuchtung aus Erneuerbaren?</p><p><strong>Theorie:</strong> Jede kommunale Dienstleistung hat einen ökologischen Fußabdruck.</p>" },
"D4": { label: "Soziale Gestaltung der öffentlichen Leistung", text: "<p><strong>Praxis:</strong> Kann sich die alleinerziehende Mutter den Kitaplatz leisten?</p><p><strong>Theorie:</strong> Soziale Gerechtigkeit in der Daseinsvorsorge ist der Kern kommunaler Politik.</p>" },
"D5": { label: "Transparente Kommunikation und demokratische Einbindung", text: "<p><strong>Praxis:</strong> Werden Bürger:innen gefragt, bevor die Straße vor ihrem Haus umgebaut wird?</p><p><strong>Theorie:</strong> Demokratie ist mehr als Wahlen alle vier Jahre.</p>" },
"E1": { label: "Menschenwürdiges Leben für zukünftige Generationen", text: "<p><strong>Praxis:</strong> Hinterlassen wir unseren Enkeln einen Schuldenberg — oder investieren wir heute so, dass auch 2050 gute Lebensbedingungen herrschen?</p><p><strong>Theorie:</strong> Die Menschenwürde hat eine zeitliche Dimension.</p>" },
"E2": { label: "Beitrag zum Gesamtwohl über die Gemeindegrenzen hinaus", text: "<p><strong>Praxis:</strong> Hilft der Antrag nur der eigenen Stadt — oder auch den Nachbargemeinden?</p><p><strong>Theorie:</strong> Solidarität endet nicht an der Gemeindegrenze.</p>" },
"E3": { label: "Verantwortung für ökologische Auswirkungen jenseits der Gemeinde", text: "<p><strong>Praxis:</strong> Denkt die Kommune beim Einkauf an den CO₂-Fußabdruck jenseits der eigenen Grenzen?</p><p><strong>Theorie:</strong> Die ökologische Krise ist global, aber die Verursachung ist lokal.</p>" },
"E4": { label: "Beitrag zum sozialen Ausgleich", text: "<p><strong>Praxis:</strong> Unterstützt die Stadt strukturschwache Regionen? Gibt es Fairtrade-Beschaffung?</p><p><strong>Theorie:</strong> Soziale Gerechtigkeit im globalen Maßstab ist die anspruchsvollste Dimension der GWÖ.</p>" },
"E5": { label: "Transparente und demokratische Mitbestimmung auf übergeordneter Ebene", text: "<p><strong>Praxis:</strong> Setzt sich die Kommune für mehr Demokratie ein — auch auf Landes- und Bundesebene?</p><p><strong>Theorie:</strong> Demokratie braucht Fürsprecher auf allen Ebenen.</p>" },
};
function showField(code) {
const info = fieldInfo[code];
if (!info) return;
const el = document.getElementById('field-explain');
document.getElementById('field-explain-title').textContent = code + ': ' + info.label;
document.getElementById('field-explain-text').innerHTML = info.text;
el.style.display = 'block';
el.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
}
</script>
{% endblock %}