- Extended import_relational_radar.py to include a 'Products' database. - Implemented full dual-way relations for Companies <-> Landmines, References, Products. - Updated documentation to reflect the 4-database architecture.
6.3 KiB
Migration Report: Competitor Analysis Agent
Status: Jan 11, 2026 - ✅ ROBUSTNESS UPGRADE COMPLETE
Die App ist unter /ca/ voll funktionsfähig und verfügt nun über eine "Grounded Truth" Engine (Scraping + SerpAPI) sowie eine skalierbare Map-Reduce Architektur.
🚨 Vollständige Chronik der Fehler & Lösungen
-
Problem: 404 auf
/ca/- Ursache: Der Container startete aufgrund von Syntaxfehlern nicht, was Nginx mit einem 404 (später 502) quittierte.
-
Problem:
SyntaxError: unterminated string literal(Runde 1)- Ursache: Verwendung von
f"""..."""für komplexe Prompts. - Lösung: Umstellung auf
.format(). Wichtig: Docker-Volumes synchronisierten nicht zuverlässig, was zu "Phantom-Fehlern" führte. Einbuild --no-cachewar nötig.
- Ursache: Verwendung von
-
Problem:
ImportError: cannot import name 'Schema'- Ursache: Uralte SDK-Version
google-generativeai==0.3.0inrequirements.txt. - Lösung: Umstellung auf Dictionaries, später komplettes SDK-Upgrade.
- Ursache: Uralte SDK-Version
-
Problem:
404 models/gemini-1.5-pro ... for API version v1beta- Ursache: Das alte SDK nutzte veraltete Endpunkte.
- Lösung: Migration auf das moderne
google-genaiPaket (v1.x) und Nutzung des neuengenai.Client.
-
Problem:
TypeError: unexpected keyword argument 'client_options'- Analyse: Obwohl das SDK in
requirements.txtaktualisiert wurde, installierte Docker auf der Diskstation hartnäckig eine alte Version. - Lösung: Erzwingen der Version
google-genai>=1.2.0.
- Analyse: Obwohl das SDK in
-
Problem: Das "Grounding Upgrade" & Die Syntax-Hölle (Runde 2)
- Aufgabe: Einbau von echtem Web-Scraping und SerpAPI zur Qualitätssteigerung.
- Fehler:
SyntaxError: f-string: expecting '}'in komplexen Listen-Generatoren (z.B.c_sum). - Ursache: Python 3.11 erlaubt keine geschachtelten Anführungszeichen in F-Strings, wenn diese Backslashes oder komplexe Ausdrücke enthalten.
- Lösung: RADIKALER VERZICHT auf F-Strings in allen kritischen Logik-Bereichen. Umstellung auf einfache Schleifen und
.format().
-
Problem:
unterminated string literal (detected at line 203)- Ursache: Einfache Anführungszeichen
'in Kombination mit\nwurden im Container-Kontext falsch interpretiert. - Lösung: ULTIMATIVE SYNTAX: Verwendung von Triple Raw Quotes (
r"""...""") für jeden einzelnen String, der Variablen oder Sonderzeichen enthält.
- Ursache: Einfache Anführungszeichen
-
Problem: Analyse stoppt nach 5 Konkurrenten (Token Limit / Lazy LLM)
- Symptom: Bei 9 Konkurrenten wurden nur die ersten 5 analysiert, der Rest fehlte.
- Ursache: Der riesige Prompt ("Analysiere alle 9...") überforderte das Kontext-Fenster oder führte zu Timeouts.
- Lösung: Umstellung auf Map-Reduce: Jeder Konkurrent wird in einem eigenen parallelen Task (
asyncio.gather) analysiert. Erhöhung vonmax_output_tokensauf 8192.
-
Problem:
NameResolutionErrorim Container- Symptom: Scraping schlug fehl ("Name or service not known").
- Ursache: Docker-Container nutzten den (instabilen) Host-DNS.
- Lösung: Explizites Setzen von Google DNS (
8.8.8.8,8.8.4.4) indocker-compose.yml.
-
Problem:
422 Unprocessable Entityin Schritt 6 & 8- Ursache: Diskrepanz zwischen Frontend-Request (z.B. sendet
industries) und Backend-Pydantic-Modell (erwartettarget_industries). - Lösung: Backend-Modelle exakt an die Frontend-Payloads angepasst.
- Ursache: Diskrepanz zwischen Frontend-Request (z.B. sendet
-
Problem: Leere Matrizen in der Conclusion
- Ursache: Das LLM füllte das
availability-Array nicht korrekt oder erfand eigene Produktnamen als Zeilenbeschriftung. - Lösung: Extrem strikter Prompt ("KEINE Produktnamen", "GENAU einen Eintrag pro Kategorie") und detailliertes JSON-Schema.
- Ursache: Das LLM füllte das
-
Problem: Blinde KI in Schritt 8 (Referenzen)
- Symptom: Die Referenzanalyse lieferte nur generische, oft erfundene Branchen, anstatt echter Kunden.
- Ursache: Der Prompt bat die KI, "nach Referenzen zu suchen", ohne ihr eine Datengrundlage zu geben. Die KI hat halluziniert.
- Lösung: Implementierung einer "Grounded" Referenz-Suche.
- Ein neuer Scraper (
discover_and_scrape_references_page) sucht gezielt nach "Referenzen", "Case Studies" oder "Kunden" auf der Website des Wettbewerbers. - Der Inhalt DIESER Seiten wird extrahiert.
- Nur dieser "grounded" Text wird an das LLM zur Analyse und Extraktion übergeben.
- Ein neuer Scraper (
- Ergebnis: Die Analyse basiert nun auf Fakten von der Webseite des Wettbewerbers, nicht auf dem allgemeinen Wissen der KI.
🛡️ Die finale "Grounded" Architektur
- Scraping: Nutzt
requestsundBeautifulSoup, um nicht nur die Homepage, sondern auch Produkt- und Branchen-Unterseiten zu lesen. - Grounded References: Für die Referenzanalyse (Schritt 8) wird nun gezielt nach "Case Study" oder "Kunden"-Seiten gescraped, um die Extraktion auf echte Daten zu stützen und Halluzinationen zu vermeiden.
- Map-Reduce: Statt eines Riesen-Prompts werden Konkurrenten parallel einzeln analysiert. Das skaliert linear.
- Logging: Ein spezieller
log_debugHelper schreibt direkt in/app/Log_from_docker, um Python-Logging-Probleme zu umgehen.
📊 Relationaler Notion Import (Competitive Radar v2.0)
Um die Analyse-Ergebnisse optimal nutzbar zu machen, wurde ein bidirektionaler Import-Prozess nach Notion implementiert (import_relational_radar.py).
- Architektur: Statt Textblöcken werden vier vernetzte Datenbanken erstellt:
- 📦 Companies (Hub): Stammdaten, USPs, Portfolio-Summary.
- 💣 Landmines (Satellite): Einzelfragen und Angriffsvektoren, verknüpft mit der Company.
- 🏆 References (Satellite): Konkrete Kundenprojekte, verknüpft mit der Company.
- 🤖 Products (Satellite): Einzelne Produkte als Datensätze, ermöglicht marktweiten Vergleich (z.B. "Alle Reinigungsroboter").
- Dual-Way Relations: Dank
dual_propertyKonfiguration sind die Verknüpfungen in Notion sofort in beide Richtungen navigierbar. - Daten-Qualität: Durch die Map-Reduce Analyse und das gezielte Reference-Scraping werden nun echte Fakten statt KI-Halluzinationen importiert.
Dokumentation aktualisiert am 11.01.2026 nach Implementierung des relationalen Competitive Radars.