From f32b8a8ec6206253d08b1d4f8c6583fb3c5d2dda Mon Sep 17 00:00:00 2001 From: Claude Code Date: Sun, 14 Jun 2026 09:51:14 +0000 Subject: [PATCH] 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) --- src/services/fimi_matcher.py | 28 +++++++++++++++++++--------- 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/src/services/fimi_matcher.py b/src/services/fimi_matcher.py index ab833bf..2352f71 100644 --- a/src/services/fimi_matcher.py +++ b/src/services/fimi_matcher.py @@ -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": , "spreads": , "passage": ""}}]}}""" +{{"results": [{{"claim_id": , "spreads": , "passage": ""}}]}}""" async def _verify_article(