fix(fimi): Verifizierer-Prompt schaerfen gegen thematische False Positives

Embedding-Naehe verleitet das LLM, blosse Faktum-Erwaehnung als Verbreitung
zu werten (ukr. Generalstab berichtet ueber Ausbilder -> faelschlich als
Marionetten-Narrativ markiert). Prompt trennt jetzt strikt HALTUNG von
thematischer Naehe und nennt vier konkrete Negativbeispiele. Reduziert die
Treffer in Lage 35 von 21 auf 13 Artikel, FPs (Generalstab, Meduza,
OSINTdefender) entfernt, echte Verbreiter (Medvedev u.a.) bleiben.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
Claude Code
2026-06-14 09:51:14 +00:00
Ursprung acac401034
Commit f32b8a8ec6

Datei anzeigen

@@ -151,27 +151,37 @@ async def match_query_texts(
# Stufe 2: LLM-Verifikation
# ──────────────────────────────────────────────────────────────────
_VERIFY_PROMPT = """Bewerte ausschliesslich den unten stehenden Artikeltext. Du hast KEINEN Internetzugang und darfst KEINE Werkzeuge benutzen (kein WebFetch, keine Suche, kein Oeffnen von Links). Falls der Text gekuerzt ist, bewerte nur das Vorhandene. Antworte sofort mit JSON.
_VERIFY_PROMPT = """Bewerte ausschließlich den unten stehenden Artikeltext. Du hast KEINEN Internetzugang und darfst KEINE Werkzeuge benutzen (kein WebFetch, keine Suche, kein Öffnen von Links). Falls der Text gekürzt ist, bewerte nur das Vorhandene. Antworte sofort mit JSON.
Du pruefst, ob ein Nachrichtenartikel bekannte Falschbehauptungen VERBREITET.
Du prüfst, ob ein Nachrichtenartikel eine bekannte Falschbehauptung VERBREITET.
Unterscheide streng:
- VERBREITET (spreads=true): Der Artikel stellt die Behauptung als Tatsache auf, uebernimmt sie zustimmend, gibt sie unwidersprochen als wahr wieder oder legt sie dem Leser als zutreffend nahe.
- VERBREITET NICHT (spreads=false): Der Artikel berichtet nur neutral darueber, widerlegt die Behauptung, ordnet sie als Desinformation ein, zitiert sie distanziert/kritisch, oder sagt inhaltlich das Gegenteil.
VERBREITET (spreads=true): Der Artikel übernimmt die SPEZIFISCHE, irreführende Kernaussage der Behauptung zustimmend, stellt sie als Tatsache hin oder legt sie dem Leser als wahr nahe.
Beispiel: Ein Artikel, der Russlands Angriff einen "Angriffskrieg" nennt, VERBREITET NICHT die Behauptung "Russland wurde zum Angriff gezwungen" — er sagt das Gegenteil.
VERBREITET NICHT (spreads=false), wenn eines zutrifft:
- Der Artikel berichtet neutral über das Thema.
- Der Artikel widerlegt die Behauptung, ordnet sie als Desinformation ein oder zitiert sie distanziert/kritisch.
- Der Artikel sagt inhaltlich das Gegenteil.
- Der Artikel erwähnt nur ein thematisch verwandtes Faktum, OHNE die irreführende Kernaussage zu übernehmen.
Im Zweifel spreads=false. Nur eindeutige Verbreitung zaehlt.
Entscheidend ist die HALTUNG zur konkreten Kernaussage, nicht die thematische Nähe. Ein gemeinsames Stichwort, Ereignis oder Faktum reicht NICHT.
Beispiele für spreads=false (häufige Verwechslung):
- Behauptung "Russland wurde zum Angriff gezwungen": Artikel nennt den Einmarsch einen "Angriffskrieg" -> false (Gegenteil).
- Behauptung "Die Ukraine ist eine westliche Marionette ohne Souveränität": Artikel berichtet, dass ausländische Ausbilder ukrainische Soldaten trainieren -> false (bloßes Faktum, keine Marionetten-Aussage).
- Behauptung "Russlands Wirtschaft boomt trotz Sanktionen": Artikel berichtet konkrete Öleinnahmen -> false (Einzelfaktum, kein Boom-Narrativ).
- Behauptung "Die Ukraine kann den Krieg nicht gewinnen": Artikel analysiert, dass militärisch keine Seite gewinnen kann -> false (symmetrische Analyse, nicht die einseitige Behauptung).
Im Zweifel spreads=false. Nur die eindeutige Übernahme der irreführenden Kernaussage zählt.
ARTIKEL
Titel: {headline}
Text: {content}
ZU PRUEFENDE BEHAUPTUNGEN
ZU PRÜFENDE BEHAUPTUNGEN
{claims}
Antworte AUSSCHLIESSLICH als JSON:
{{"results": [{{"claim_id": <id>, "spreads": <true|false>, "passage": "<woertliches Zitat aus dem Artikel, das die Behauptung verbreitet; leer wenn spreads=false>"}}]}}"""
{{"results": [{{"claim_id": <id>, "spreads": <true|false>, "passage": "<wörtliches Zitat aus dem Artikel, das die Behauptung verbreitet; leer wenn spreads=false>"}}]}}"""
async def _verify_article(