Semantischer Topic-Filter gegen off-topic Keyword-Zufallstreffer
Neue Artikel passieren jetzt vor DB-Speicherung einen Haiku-Relevanzfilter
(AnalyzerAgent.filter_relevant_articles), der Artikel verwirft, die nur
auf generische Keywords matchen, aber das Kernthema der Lage nicht
inhaltlich behandeln. Bei Parsing-/API-Fehler oder 100%-Rejection: Fallback
auf unveraenderte Kandidatenliste.
Orchestrator trennt DB-Dedup und INSERT, damit der Filter nur auf neue
Kandidaten laeuft (Kostenoptimierung). LATEST_DEVELOPMENTS-Prompt erhaelt
zusaetzliche Relevanz-Gate-Regel als zweite Sicherung.
Hintergrund: Incident 'Russische Militaerblogger' sammelte bisher Iran-,
Nahost- und allgemeine Ukraine-Artikel ein, weil Keyword-Match ab 2 von 8
Begriffen ('iran', 'russland', 'drohne', ...) genuegt. Der semantische
Filter verwirft solche Zufallstreffer.
Dieser Commit ist enthalten in:
@@ -933,18 +933,15 @@ class AgentOrchestrator:
|
||||
|
||||
logger.info(f"DB-Dedup: {len(existing_urls)} URLs, {len(existing_headlines)} Headlines im Bestand")
|
||||
|
||||
# Neue Artikel speichern und für Analyse tracken
|
||||
new_count = 0
|
||||
new_articles_for_analysis = []
|
||||
# --- Dedup gegen Bestand: nur neue (noch nicht gespeicherte) Kandidaten behalten ---
|
||||
new_candidates = []
|
||||
for article in unique_results:
|
||||
# URL-Duplikat gegen DB
|
||||
if article.get("source_url"):
|
||||
norm_url = _normalize_url(article["source_url"])
|
||||
if norm_url in existing_urls:
|
||||
continue
|
||||
existing_urls.add(norm_url)
|
||||
|
||||
# Headline-Duplikat gegen DB
|
||||
headline = article.get("headline", "")
|
||||
if headline and len(headline) > 20:
|
||||
norm_h = _normalize_headline(headline)
|
||||
@@ -953,6 +950,23 @@ class AgentOrchestrator:
|
||||
if norm_h:
|
||||
existing_headlines.add(norm_h)
|
||||
|
||||
new_candidates.append(article)
|
||||
|
||||
# --- Semantischer Topic-Filter (Haiku) ---
|
||||
# Wirft Artikel raus, die zwar Keyword-Treffer hatten, aber das Kernthema
|
||||
# der Lage nicht inhaltlich behandeln. Bei Fehler Fallback auf alle Kandidaten.
|
||||
if new_candidates:
|
||||
_tf_agent = AnalyzerAgent()
|
||||
new_candidates, _tf_usage = await _tf_agent.filter_relevant_articles(
|
||||
title, description, new_candidates,
|
||||
)
|
||||
if _tf_usage:
|
||||
usage_acc.add(_tf_usage)
|
||||
|
||||
# --- Neue (thematisch gefilterte) Artikel speichern und für Analyse tracken ---
|
||||
new_count = 0
|
||||
new_articles_for_analysis = []
|
||||
for article in new_candidates:
|
||||
cursor = await db.execute(
|
||||
"""INSERT INTO articles (incident_id, headline, headline_de, source,
|
||||
source_url, content_original, content_de, language, published_at, tenant_id)
|
||||
@@ -971,7 +985,6 @@ class AgentOrchestrator:
|
||||
),
|
||||
)
|
||||
new_count += 1
|
||||
# Artikel mit DB-ID für die Analyse tracken
|
||||
article_with_id = dict(article)
|
||||
article_with_id["id"] = cursor.lastrowid
|
||||
new_articles_for_analysis.append(article_with_id)
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren