feat(recall): dynamische Google-News-Volltext-Suchfeeds pro Lage
Recall-Problem: Die Pipeline durchsuchte nur ~28 feste site:-RSS-Feeds plus Claude-WebSearch. Japanische Security-Vendor-Blogs, Fachportale und Regionalmedien (Cybertrust, ITmedia, INTERNET Watch, Reuters Japan ...) tauchten in keinem festen Feed auf. Bei der Test-Lage "Qilin Ransomware Japan" fand die Pipeline 20 Kandidaten — eine generische Google-News-JP- Suche zum selben Thema liefert 49. Fix: researcher.build_news_search_feeds baut pro Refresh einen Google-News- Volltext-Suchfeed je Sprache (news.google.com/rss/search?q=keywords&hl=..&gl=..). Query = Top-4-Keywords der jeweiligen Sprache aus der Keyword-Extraktion. Der Orchestrator haengt diese Feeds an die selektierten site:-Feeds an; sie laufen durch dieselbe Pipeline (Keyword-Match, Pre-Topic-Translate, Topic-Filter). Precision bleibt, Recall steigt. - researcher.py: build_news_search_feeds + _GNEWS_LOCALE-Tabelle. - orchestrator._rss_pipeline: Suchfeeds aus source_language_whitelist (jp_demo: ['ja']) bzw. output+research_language (normale Orgs) gebaut und an selected_feeds angehaengt. - rss_parser._apply_domain_cap: Suchfeeds (domain 'google-news-search-<lang>') bekommen Cap 25 statt 10 — sie sind der Recall-Treiber, Topic-Filter uebernimmt die Precision. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Dieser Commit ist enthalten in:
@@ -922,7 +922,22 @@ class AgentOrchestrator:
|
||||
# Feed-Selektion-Keywords nur als Fallback wenn dynamische fehlen
|
||||
if not keywords:
|
||||
keywords = feed_sel_keywords
|
||||
articles = await rss_parser.search_feeds_selective(title, selected_feeds, keywords=keywords)
|
||||
# --- Recall-Boost: dynamische Google-News-Volltext-Suchfeeds ---
|
||||
# Statt nur feste site:-Feeds zu durchsuchen, baut die Pipeline
|
||||
# pro Sprache einen Google-News-Suchfeed aus den Keywords. Damit
|
||||
# erreichen wir Quellen, die in keinem festen Feed stehen
|
||||
# (Vendor-Blogs, Fachportale, Regionalmedien).
|
||||
from agents.researcher import build_news_search_feeds
|
||||
if source_lang_whitelist:
|
||||
_gnews_langs = list(source_lang_whitelist)
|
||||
else:
|
||||
_gnews_langs = list({output_language_iso, research_language_iso})
|
||||
_gnews_feeds = build_news_search_feeds(keywords, _gnews_langs)
|
||||
if _gnews_feeds:
|
||||
logger.info(f"Google-News-Suchfeeds ergaenzt: {len(_gnews_feeds)}")
|
||||
articles = await rss_parser.search_feeds_selective(
|
||||
title, selected_feeds + _gnews_feeds, keywords=keywords,
|
||||
)
|
||||
else:
|
||||
articles = await rss_parser.search_feeds(title, international=international, tenant_id=tenant_id, keywords=keywords, user_id=user_id)
|
||||
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren