Wenn du dir einen eigenen Nachrichtenmonitor, einen Krypto-Ticker oder einen Branchen-Alert baust, sind die ersten 24 Stunden Euphorie – und die zweite Woche Frust. Aus zwei Gründen:
- Das Duplikat-Problem: Dieselbe Nachricht wird über verschiedene Feeds oder bei jedem Skript-Durchlauf wiederholt erfasst. Dein Telegram-Bot spammt dich mit denselben Infos zu.
- Das KI-Kosten-Problem: Schickt man jede rohe Meldung stumpf an ein Large Language Model (LLM) wie OpenAI, glüht die Kreditkarte.
In diesem Artikel zeigen wir dir, wie du mit einer cleveren Filter-Pipeline aus einer SQLite-Datenbank und gezieltem Prompt-Design ein robustes, produktionsreifes Alert-System baust, das nur relevante Treffer liefert und deine API-Kosten minimal hält.
1Das Gedächtnis – Duplikate blocken mit SQLite
Bevor überhaupt ein LLM ins Spiel kommt, müssen wir bereits bekannte Meldungen aussortieren. Eine einfache In-Memory-Liste reicht nicht, da unser Skript als Cron-Job oder systemd-Timer regelmäßig neu startet. SQLite ist hierfür perfekt: leichtgewichtig, dateibasiert und ohne Server-Setup einsatzbereit.
Wir erstellen eine Tabelle, die den eindeutigen Hash oder die URL einer Meldung speichert:
import sqlite3
def init_db(db_path="alerts.db"):
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute("""
CREATE TABLE IF NOT EXISTS processed_articles (
id TEXT PRIMARY KEY,
title TEXT,
fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
conn.commit()
conn.close()
Bei jedem Durchlauf prüfen wir, ob die article_id (z. B. die URL
des RSS-Eintrags) bereits existiert. Falls ja, wird die Meldung sofort
übersprungen. Das spart im ersten Schritt bis zu 90 % der unnötigen
Datenverarbeitung.
2Der Vorfilter (Stichworte statt teurer KI)
Ein LLM sollte niemals die erste Verteidigungslinie sein. Wenn du dich für das Thema „Börsengänge (IPOs)" interessierst, jagst du nicht jeden Artikel über das Wetter oder Sport durch die OpenAI-API.
Nutze eine kontextsensitive Stichwortliste als Vorfilter (Regex oder einfache
if keyword in text-Abfragen). Erst wenn ein Artikel diesen groben
Filter passiert, qualifiziert er sich für die teurere KI-Analyse.
3Die LLM-Pipeline mit strukturiertem Output
Jetzt folgt das Herzstück: Das LLM soll entscheiden, ob der Artikel wirklich die Kriterien erfüllt. Damit das System automatisiert arbeiten kann, darf das LLM keinen Fließtext antworten, sondern muss eine klare, maschinenlesbare Entscheidung treffen (z. B. im JSON-Format).
Hier ist ein bewährtes Prompt-Design für diesen Einsatzzweck:
import openai
def evaluate_article_with_llm(title, summary, target_topic):
prompt = f"""
Analysiere den folgenden Artikel und bestimme, ob er eine relevante Neuigkeit zum Thema "{target_topic}" enthält.
Antworte AUSSCHLIESSLICH im folgenden JSON-Format:
{{
"relevant": true oder false,
"reason": "Kurze Begründung in einem Satz"
}}
Artikel-Titel: {title}
Zusammenfassung: {summary}
"""
# Beispielhafter Aufruf (z. B. mit OpenAI oder einem lokalen Ollama-Modell)
response = openai.chat.completions.create(
model="gpt-4o-mini", # Kosteneffizientes Modell wählen!
messages=[{"role": "user", "content": prompt}],
response_format={ "type": "json_object" }
)
return response.choices[0].message.content
timeout beim API-Aufruf und baue einen try-except-Block
ein. Wenn die API streikt, sollte dein System nicht abstürzen, sondern die
Meldung für den nächsten Durchlauf zwischenspeichern.
Fazit & der Weg zum produktionsreifen Bot
Mit dieser dreistufigen Pipeline (SQLite-Vorfilter → Stichwort-Check → LLM-Klassifikation) baust du ein System, das extrem präzise filtert, ohne deine API-Kosten in die Höhe zu treiben.
Möchtest du sehen, wie man diese Komponenten in eine saubere, objektorientierte Python-Architektur gießt, Fehler-Backoffs für fehlschlagende Feeds implementiert und das Ganze als Docker-Container fehlerfrei auf einem Server betreibt?
Im vollständigen Fachbuch „Watch & Alert – Automatisierte Nachrichten- und Marktüberwachung mit Python" erfährst du Schritt für Schritt, wie du dieses System produktionsreif aufbaust – inklusive fertigem Open-Source-Code auf GitHub.