Nachrichtenansprüche mit KI prüfen: Ein Python-Leitfaden (2026)

Erick Horn

Erick Horn

·

22 minuten Lesen

Nachrichtenansprüche mit KI prüfen: Ein Python-Leitfaden (2026)

Nachrichtenansprüche mit KI prüfen: Ein Python-Leitfaden (2026)

Die meisten Faktencheck-Schreibarbeiten enden bei "verwenden Sie eine LLM, um den Anspruch zu überprüfen". Das funktioniert in einer Demo und bricht zusammen, wenn ein echter Nachrichtenzyklus eintritt – Ansprüche sind mehrdeutig, Beweise sind über Tausende von Quellen verstreut, und das Modell halluziniert zuversichtlich Zitate, die nicht existieren.

Dieser Faktencheck-Workflow hat fünf Stufen: Anspruch extrahieren, Artikel finden, Beweise ranken, mit dem Anspruch vergleichen und das Urteil mit Quelllinks erklären. Er liefert Unterstützung, Widerlegung, Nicht genügend Informationen oder Gemischt. Separate Schritte ermöglichen es Ihnen, Modelle zu ändern, Antwortzeit und Kosten zu messen und Fehler zu verfolgen.

Diese Anleitung führt durch Python-Code für jede Stufe. Sie verwendet den APITube-Endpunkt von /v1/news/everything, um Beweise zu finden, erklärt fünf häufige Fehlerarten und vergleicht einen mehrstufigen Workflow mit einem einzelnen Modellaufruf.

APITube veröffentlicht diesen Leitfaden. Seine API wird für die Beweissuche verwendet. NewsAPI.org, NewsData.io oder Ihre eigene Nachrichtenquelle können die gleiche Rolle spielen.

5 Pipeline-Stufen im Überblick

  1. Claim Extraction—konvertieren Sie Freitexteingaben in atomare, überprüfbare Ansprüche mit strukturiertem Schema (Subjekt, Prädikat, Objekt, Zeitanker).
  2. Evidenz-Abruf—fragen Sie einen Live-News-Index nach Dokumenten ab, die die Entitäten der Behauptung und das Zeitfenster erwähnen.
  3. Evidenz-Ranking—bewerten Sie abgerufene Dokumente nach Relevanz, Glaubwürdigkeit der Quelle und zeitlicher Nähe; behalten Sie die Top-k bei.
  4. NLI Urteil – Führen Sie ein Entailment-Modell über die Behauptung und die bewerteten Beweise aus; Ausgabe Unterstützung / Widerlegung / NEI / Gemischt mit einem Konfidenzscore.
  5. Begründung – Erzeugen Sie eine menschenlesbare Erklärung mit Inline-Zitaten zu den verwendeten Beweisen.

Jede Stufe hat messbare Eingaben, Ausgaben und Fehlerfälle.

Stufe 1 – Extraktion von Behauptungen

Ziel: Eine unscharfe Eingabe („Apples Umsatz fiel im letzten Quartal“) in eine oder mehrere atomare Behauptungen mit strukturierten Slots umwandeln, auf die nachgelagerte Stufen reagieren können.

Eine atomare Behauptung hat eine Subjektentität, ein Prädikat, ein Objekt/Wert und einen Zeitanker. „Apples Umsatz sank im letzten Quartal“ zerfällt in: Subjekt Apple Inc. (Wikidata Q312), Prädikat revenue change, Objekt decrease, Zeit Q1 2026. Vage Einschränkungen und Meinungen werden in dieser Phase herausgefiltert; sie führen zu einem Kurzschluss im Rest der Pipeline.

from openai import OpenAI

client = OpenAI()

EXTRACT_PROMPT = """Extract atomic factual claims from the input.
Return JSON: a list of {subject, predicate, object, time_anchor, check_worthy}.
Set check_worthy=false for opinions, predictions, vague hedges.
Input: {input}"""

def extract_claims(text: str) -> list[dict]:
    r = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": EXTRACT_PROMPT.format(input=text)}],
        response_format={"type": "json_object"},
        temperature=0,
    )
    import json
    return [c for c in json.loads(r.choices[0].message.content)["claims"] if c["check_worthy"]]

Haken: Die Extraktionsqualität dominiert die nachgelagerte Genauigkeit. Wenn die Subjekt-Entität mehrdeutig ist („Apple“ das Obst vs. das Unternehmen), verbrennt die Abrufphase Budget, indem irrelevante Artikel abgerufen werden. Lösen Sie Subjekte in kanonische Entitäten in dieser Phase auf, anstatt rohe Zeichenketten weiterzugeben — ordnen Sie jedes Subjekt der numerischen entity.id von APITube zu (Auflösung über /v1/news/entity oder das entities[]-Array), damit sich die Auflösungsbemühung hier in Stufe 2 auszahlt.

Stufe 2 – Abruf von Beweisen (Live-Nachrichten API)

Ziel: Einen Kandidaten-Evidenzpool abrufen, der breit genug ist, um widerlegende Artikel zu enthalten, und schmal genug, um nach dem Ranking in das Kontextfenster des Modells zu passen.

Die meisten akademischen Pipelines rufen Daten aus einem statischen Wikipedia-Dump ab (FEVER, AVeriTeC). Das ist in Ordnung für Benchmarking, aber falsch für Nachrichten, wo die Beweise der Live-Pressezyklus sind. Verwenden Sie stattdessen eine Nachrichten-API. Unten wird die APITube-/v1/news/everything mit der aufgelösten Entität, dem Zeitfenster vom Zeitanker des Anspruchs und einem Glaubwürdigkeitsfilter abgefragt.

import os, requests

APITUBE = "https://api.apitube.io/v1/news/everything"
HEADERS = {"X-API-Key": os.environ["APITUBE_KEY"]}

def retrieve_evidence(claim: dict, k: int = 50) -> list[dict]:
    params = {
        "entity.id": claim["subject_entity_id"],  # numeric APITube entity id (resolve via /v1/news/entity)
        "published_at.start": claim["time_anchor_start"],
        "published_at.end": claim["time_anchor_end"],
        "language.code": "en",
        "per_page": k,
        "sort.by": "published_at",
        "sort.order": "desc",
    }
    r = requests.get(APITUBE, params=params, headers=HEADERS, timeout=10)
    r.raise_for_status()
    articles = r.json().get("results", [])
    return [a for a in articles if not a.get("is_duplicate", False)]

Wiederholte Kopien mithilfe des is_duplicate-Feldes der Antwort filtern, bevor Sie ranken. Verwenden Sie entity.id, um nach einer bestimmten Person oder Organisation zu suchen, anstatt nach einem mehrdeutigen Schlagwort wie title=apple.

Haken 1: Kostenloser Tier gibt nur die erste Seite zurück und begrenzt auf 30 Anfragen / 30 Minuten. Für Benchmark-Läufe über 200 Behauptungen hinweg, stapeln Sie nach Entität (eine Entität kann viele Behauptungen bedienen) oder rüsten Sie auf.

Haken 2: Zeitliche Behauptungen benötigen ein großzügiges Zeitfenster. „Letztes Quartal“ → erweitern Sie auf ein 4-Monats-Fenster (das Quartal plus der Monat davor und danach), da Gewinn-Diskussionen die umliegenden Wochen umfassen. Enge Fenster töten den Recall.

Stufe 3 – Bewertung von Beweisen

Ziel: aus dem Kandidatenpool von 30-50 Artikeln die 3-7 Dokumente hervorheben, die am wahrscheinlichsten die Behauptung implizieren oder widerlegen, gewichtet nach der Glaubwürdigkeit der Quelle.

Ein einfacher, verteidigungsfähiger Ranker ist eine gewichtete Summe von drei Signalen: semantische Ähnlichkeit zwischen Anspruch und Artikel (Kosinus auf Satz-Transformer-Embeddings), Glaubwürdigkeit der Quelle (APITube gibt source.rankings.opr zurück – ein objektiver Page-Rank-Score) und zeitliche Nähe (näher am Zeitanker des Anspruchs gewinnt).

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer("all-MiniLM-L6-v2")

def rank_evidence(claim_text: str, articles: list[dict], k: int = 5) -> list[dict]:
    claim_emb = model.encode(claim_text, convert_to_tensor=True)
    scored = []
    for a in articles:
        body = (a.get("title", "") + ". " + a.get("description", ""))[:1000]
        sim = util.cos_sim(claim_emb, model.encode(body, convert_to_tensor=True)).item()
        opr = a.get("source", {}).get("rankings", {}).get("opr", 50) / 100  # 0-1
        bias_penalty = 0.85 if a.get("source", {}).get("bias") in ("far_left", "far_right") else 1.0
        score = 0.6 * sim + 0.3 * opr + 0.1 * 1.0  # (recency handled by query sort)
        score *= bias_penalty
        scored.append((score, a))
    scored.sort(key=lambda x: x[0], reverse=True)
    return [a for _, a in scored[:k]]

Die source.bias-Strafe ist eine leichte Herabstufung, kein harter Filter – Rand-Bias-Quellen erscheinen immer noch, wenn sie die einzigen sind, die berichten, aber sie dominieren nicht die Top-K. Halten Sie die Gewichtungen einstellbar und überprüfen Sie sie nach der Benchmark-Phase erneut; die richtige Mischung unterscheidet sich für politische, finanzielle oder wissenschaftliche Behauptungen.

Stufe 4 – NLI Urteil

Ziel: Ausgehend von der Behauptung und der gerankten Evidenz, eine von SUPPORT, REFUTE, NEI (Nicht genügend Informationen) oder MIXED mit kalibrierter Konfidenz ausgeben.

Es gibt zwei produktionsrelevante Ansätze: ein feinabgestimmter NLI-Kopf (DeBERTa-v3-large feinabgestimmt auf FEVER + AVeriTeC) oder ein Zero-Shot-Prompt gegen ein instruktionsabgestimmtes LLM. Unten ist die LLM-Version, da sie günstiger im Unterhalt ist und sich ohne erneutes Training an neue Domänen anpasst.

NLI_PROMPT = """You are a fact-checker. Given a claim and {n} evidence excerpts,
output ONE of: SUPPORT, REFUTE, NEI, MIXED.
Rules:
- SUPPORT only if at least one evidence excerpt directly entails the claim.
- REFUTE only if at least one evidence excerpt directly contradicts the claim.
- MIXED if evidence both supports and refutes.
- NEI if no evidence is decisive.
- Cite which evidence indices (1-based) drove the verdict.

Claim: {claim}
Evidence:
{evidence_block}

Output JSON: {{"verdict": str, "confidence": 0-1, "citations": [int]}}"""

def nli_verdict(claim_text: str, evidence: list[dict]) -> dict:
    block = "\n".join(
        f"[{i+1}] {a['title']}. {a.get('description','')[:300]}"
        for i, a in enumerate(evidence)
    )
    r = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user",
                   "content": NLI_PROMPT.format(n=len(evidence), claim=claim_text, evidence_block=block)}],
        response_format={"type": "json_object"},
        temperature=0,
    )
    import json
    return json.loads(r.choices[0].message.content)

Verwenden Sie eine Temperatur von 0 beim Vergleichen von Urteilen. Selbst bei 0 kann ein Modell einen fehlenden Beweis zitieren. Überprüfen Sie jeden Zitationsindex gegen [1, len(evidence)]. Wenn ein Index ungültig ist, versuchen Sie es erneut oder stufen Sie das Ergebnis auf NEI herab.

Stufe 5 – Begründung

Ziel: Einen für Menschen lesbaren Absatz erstellen, der das Urteil erklärt, mit Inline-Zitaten zu den Evidenz-URLs.

Eine gute Begründung beantwortet drei Fragen: wie das Urteil lautet, welche Quellen es untermauern und welche Restunsicherheit verbleibt. Die Struktur ist wichtiger als der Text – nachgelagerte Verbraucher (Redakteure, Endbenutzer, Audit-Protokolle) analysieren das Zitationsmuster.

def justify(claim_text: str, evidence: list[dict], verdict: dict) -> str:
    cited = [evidence[i-1] for i in verdict["citations"] if 1 <= i <= len(evidence)]
    prompt = f"""Claim: {claim_text}
Verdict: {verdict['verdict']} (confidence {verdict['confidence']:.2f})
Sources used:
{chr(10).join(f"- {a['title']} ({a['href']})" for a in cited)}
Write a 2-sentence justification with inline [1], [2] citations to the sources."""
    r = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[{"role": "user", "content": prompt}],
        temperature=0,
    )
    return r.choices[0].message.content

Für Audit-fähige Anwendungen (Nachrichtenraum-Integration, Compliance) heften Sie die zitierten URLs in dieser Phase an und schreiben Sie sie zusammen mit dem Zeitstempel und den verwendeten Modellversionen in Ihr Audit-Protokoll. Begründungen ohne gespeicherte Quell-URLs sind später nicht überprüfbar.

End-to-End-Verbindung

def fact_check(text: str) -> list[dict]:
    results = []
    for claim in extract_claims(text):
        evidence = retrieve_evidence(claim)
        ranked = rank_evidence(claim["claim_text"], evidence, k=5)
        verdict = nli_verdict(claim["claim_text"], ranked)
        verdict["justification"] = justify(claim["claim_text"], ranked, verdict)
        verdict["sources"] = [a["href"] for a in ranked]
        results.append({"claim": claim, **verdict})
    return results

Bewerten Sie Ihren eigenen Anspruchssatz

Testen Sie den Workflow anhand von Behauptungen mit menschlich zugewiesenen Urteilen. Messen Sie Präzision, Recall, Zitationsgenauigkeit, Antwortzeit und Kosten. Verwenden Sie Behauptungen aus dem Bereich, den Ihre Anwendung abdecken wird.

Prüfen Sie, welche Fehler zu falschen Urteilen oder fehlenden Beweisen führen. Vergleichen Sie Modellwahl und Einstellungen für denselben Datensatz, bevor Sie sich auf die Ergebnisse verlassen.

Taxonomie der Fehlerarten

Jede Faktenprüfungs-Pipeline scheitert auf charakteristische Weise. Die Benennung der Modi ist die halbe Miete.

1. Numerische Drift

Claim: "Die Inflation erreichte 9.1% im Juni 2022."

Die Pipeline ruft Artikel ab, die 9.1% zitieren, verifiziert jedoch nicht die Einheit (jährlich vs. monatlich), die Geografie (US-CPI vs. EU-HICP) oder den genauen Monat. Das Urteil lautet SUPPORT für eine ähnliche Zahl, die tatsächlich unterschiedlich ist. Korrektur: Erweitern Sie die Extraktion, um Einheiten und geografischen Umfang als erforderliche Felder zu erfassen; lehnen Sie Beweise ab, die nicht übereinstimmen.

2. Temporale Behauptungen (war vs. ist)

Behauptung: "Tesla ist der größte Elektroautohersteller nach Marktkapitalisierung."

Ein Artikel von 2021 kann eine andere Situation beschreiben als einer, der in 2026 veröffentlicht wurde. Das Mischen kann zu einem MIXED-Urteil führen, wenn der Benutzer die aktuelle Antwort benötigt. Stellen Sie zur Extraktionszeit time_anchor auf „jetzt“ für gegenwärtige Behauptungen ein und beschränken Sie die Abfrage auf die letzten 30 Tage.

3. Zuschreibungsansprüche

Claim: "Sam Altman sagte GPT-5 wird in 2026 ankommen."

Beweis ist ein Tweet von jemandem, der Altman zitiert – nicht Altman direkt. Die Pipeline kann das an der Oberfläche nicht erkennen. Korrektur: Der NLI-Prompt muss Beweise verlangen, um die Aussage dem genannten Subjekt zuzuschreiben, nicht nur sie zu erwähnen; indirekte Zuschreibungen als NEI kennzeichnen.

4. Meinung fälschlicherweise als Tatsache dargestellt

Claim: "Bitcoin wird bis Jahresende $200k erreichen."

Dies ist eine Vorhersage, keine überprüfbare Tatsache. Der check_worthy=false-Filter der Extraktionsstufe behandelt dies – überprüfen Sie, ob er aktiviert ist. Behebung: Protokollieren Sie verworfene Behauptungen und überprüfen Sie die Rate der falsch-negativen Ergebnisse; passen Sie den Prompt an, wenn Vorhersagen durchrutschen.

5. Vage Absicherungen

Claim: "Viele Experten glauben..."

Die Absicherung ist allein nicht überprüfbar. NLI gibt NEI zurück, aber nachgelagerte Verbraucher können NEI als „wir wissen es noch nicht“ interpretieren, anstatt als „dies ist per Design nicht überprüfbar“. Lösung: Fügen Sie eine fünfte Urteilsklasse UNCHECKABLE hinzu, die sich von NEI unterscheidet, oder zeigen Sie ein is_checkable-Flag an.

Wenn Sie die vollständige Pipeline nicht benötigen

Unter etwa 10K Behauptungen/Tag mit nicht-gegnerischen Eingaben gewinnt ein einzelner LLM-Aufruf mit Werkzeugnutzung normalerweise aufgrund seiner Einfachheit und ist bei der Genauigkeit wettbewerbsfähig.

TOOLS = [{
    "type": "function",
    "function": {
        "name": "search_news",
        "description": "Search live news for evidence. Args: query, start_date, end_date.",
        "parameters": {"type": "object", "properties": {
            "query": {"type": "string"},
            "start_date": {"type": "string"},
            "end_date": {"type": "string"},
        }}
    }
}]

def fact_check_oneshot(claim: str) -> dict:
    r = client.chat.completions.create(
        model="gpt-4o",
        messages=[{"role": "user", "content": f"Fact-check: {claim}. Use the tool to gather evidence, cite sources."}],
        tools=TOOLS,
    )
    # ...handle tool calls, loop until final response...

Vergleichen Sie einen einzelnen Modellaufruf und einen mehrstufigen Workflow mit denselben gekennzeichneten Ansprüchen. Messen Sie Genauigkeit, Antwortzeit und Kosten, bevor Sie sich entscheiden. Die folgende Tabelle vergleicht, wie die Ansätze funktionieren.

FaktorEinmalige LLM-AnfrageVollständige Pipeline
AuditierbarkeitSchwach – Zitate innerhalb der ModellausgabeStark – angepinnte Protokolle pro Stufe
Adversarielle RobustheitNiedrig – das Modell kann durch irreführende Beweise gekapert werdenHöher – Filter grenzwertige Quellen
DurchsatzgrenzeRatenbegrenzungen für LLM-AnbieterHorizontale Skalierbarkeit pro Stufe

Wählen Sie One-Shot, wenn: Sie unter 1K Ansprüchen/Tag liegen, Ihre Eingabedomäne unbedenklich ist (keine bösartigen Fehlinformationskampagnen) und Ihre Prüfer keine angehefteten Protokolle für jede Stufe benötigen. Wählen Sie die vollständige Pipeline, wenn: der Durchsatz 10K Ansprüche/Tag übersteigt, Sie bösartigen Eingaben ausgesetzt sind oder Sie in einen regulierten Kontext liefern, in dem jede Entscheidung eine Spur hinterlassen muss.

Häufig gestellte Fragen

Wie funktioniert KI-Faktenprüfung?

KI-Faktenprüfung funktioniert, indem ein Anspruch in strukturierte atomare Fakten zerlegt, relevante Beweise aus einem Korpus (Wikipedia oder Live-Nachrichten) abgerufen, diese Beweise nach semantischer Relevanz und Quellen glaubwürdigkeit bewertet, ein Inferenzmodell für natürliche Sprache ausgeführt wird, um festzustellen, ob die Beweise den Anspruch stützen oder widerlegen, und eine Begründung mit Zitaten generiert wird. Die Genauigkeit hängt von jeder Stufe ab; ein schwacher Abrufschritt lässt den Rest der Pipeline zusammenbrechen.

Was ist eine Faktencheck-Pipeline?

Eine Pipeline zur Faktenprüfung ist eine Abfolge von NLP-Komponenten – typischerweise Anspruchsextraktion, Beweismittelabruf, Beweismittelrangfolge, Inferenz natürlicher Sprache und Begründungsgenerierung –, die gemeinsam einen Freitextanspruch anhand eines Korpus vertrauenswürdiger Quellen verifizieren. Jede Stufe hat messbare Ein- und Ausgaben, was es Ingenieuren ermöglicht, Modelle auszutauschen, Fehlerbehebungsmodi zu debuggen und Urteile unabhängig zu überprüfen.

Können LLMs Nachrichtenartikel auf Fakten prüfen?

Ein Sprachmodell kann bei der Überprüfung von Nachrichtenansprüchen helfen, wenn es über relevante Beweise verfügt. Allein kann es Zitate erfinden und keine Ereignisse über seinen Trainingsstichtag hinaus verifizieren. Geben Sie ihm aktuelle Artikel und überprüfen Sie das Urteil anhand der zitierten Quellen.

Was ist Claim-Extraktion in NLP?

Anspruchsextraktion ist die NLP-Aufgabe, überprüfbare faktische Aussagen innerhalb eines längeren Textes zu identifizieren und jede in eine atomare, überprüfbare Form mit strukturierten Feldern umzuwandeln: Subjektentität, Prädikat, Objekt oder Wert und Zeitanker. Moderne Systeme verwenden instruktionsgestimmte LLMs mit eingeschränkter JSON-Ausgabe, die Meinungen, Vorhersagen und vage Absicherungen herausfiltern, die nicht überprüfbar sind.

Wie werden Beweise für die Faktenprüfung abgerufen?

Beweise werden durch Abfragen eines Korpus – normalerweise Wikipedia für akademische Benchmarks oder eine Live-Nachrichten-API für die Produktions-Faktenprüfung – unter Verwendung der aufgelösten Entitäten und des Zeitfensters des Anspruchs als Filter abgerufen. APITube und ähnliche APIs stellen entity.id-, published_at- und Quellenglaubwürdigkeitsfilter bereit, die es dem Abrufsystem ermöglichen, einen kleinen, hochpräzisen Kandidatenpool zurückzugeben, den ein nachgeschalteter Ranker dann auf 3-7 Beweisauszüge für die NLI-Phase eingrenzt.

Kostenlos APITube testen

Die obige Pipeline verwendet APITube als Live-Nachrichten-Beweisquelle. Die kostenlose Stufe gibt 30 Anfragen pro 30 Minuten gegen /v1/news/everything zurück – genug, um den Abruf gegen Ihren eigenen Anspruchssatz zu validieren, bevor Sie sich festlegen. Probieren Sie APITube kostenlos unter apitube.io aus; numerische Entitäts-IDs (mit Wikidata Links unter entities[].links.wikidata), Quell-Bias-Labels und Quell-Glaubwürdigkeitsbewertungen werden für jeden Artikel ohne separate Anreicherung abgefragt.

Ressourcen

APITube - News API

Verwandte Artikel

How to Detect Misinformation by Cross-Referencing Sources
Developer Guides

How to Detect Misinformation by Cross-Referencing Sources

Detect misinformation by cross-referencing sources: score corroboration breadth, source authority, and bias diversity over a news API. Code included.

AI fake news detection: Signals, scoring, and limits (2026)
Insights

AI fake news detection: Signals, scoring, and limits (2026)

Use 4 types of signals to flag news for review. Includes API JSON, a Python risk score, and the limits of a reported 93% benchmark accuracy.

News Sentiment Analysis in Python: VADER vs FinBERT (2026)
Developer Guides

News Sentiment Analysis in Python: VADER vs FinBERT (2026)

News sentiment analysis in Python: VADER vs FinBERT vs TextBlob on 200 real articles — agreement rates, title-vs-body flip, and a streaming loop.

Nachrichten API Sentiment 2026: 5 NLP Anbieter im Vergleich
Insights

Nachrichten API Sentiment 2026: 5 NLP Anbieter im Vergleich

Nachrichten API Sentiment-Analyse in 2026: Feldvergleich über 5 NLP Anbieter, echte JSON Unterschiede, DIY-vs-API-Kompromiss und Hinweise zur Zuverlässigkeit des Sentiments.

Wir verwenden Cookies

Durch Klicken auf "Akzeptieren" stimmen Sie der Verwendung von Cookies auf Ihrem Gerät zu, damit die Website funktioniert und für Analysen.