From ccf394d5c2f96bc158369f8797507488fabb6fb8 Mon Sep 17 00:00:00 2001 From: Floke Date: Sat, 19 Jul 2025 15:15:58 +0000 Subject: [PATCH] Anpassung Verify Wiki Article --- helpers.py | 105 +++++++++++++++++++++++++++++++++-------------------- 1 file changed, 66 insertions(+), 39 deletions(-) diff --git a/helpers.py b/helpers.py index b27974fa..9a5fc013 100644 --- a/helpers.py +++ b/helpers.py @@ -812,6 +812,32 @@ def summarize_website_content(raw_text): logger.error(f"FEHLER bei Website Zusammenfassung nach Retries: {e}") return f"k.A. (Fehler Zusammenfassung: {str(e)[:50]}...)" +@retry_on_failure +def summarize_wikipedia_article(full_text, company_name): + """ + Fasst den Rohtext eines Wikipedia-Artikels gezielt für den Geschäftskontext zusammen. + """ + logger = logging.getLogger(__name__) + if not full_text or len(full_text) < 100: + logger.debug("Wikipedia-Rohtext zu kurz für eine Zusammenfassung.") + return "k.A. (Text zu kurz)" + + prompt = ( + f"Du bist ein Wirtschaftsanalyst. Fasse den folgenden Wikipedia-Artikel über das Umfeld des Unternehmens '{company_name}' zusammen.\n" + "Fokus: Geschäftsmodell, Hauptprodukte, bediente Märkte und die jüngere Unternehmensgeschichte.\n" + "Erstelle eine prägnante Zusammenfassung von maximal 150 Wörtern, die die Kernaussagen auf den Punkt bringt.\n\n" + "--- Artikeltext ---\n" + f"{full_text[:8000]}\n" # Begrenzung auf ca. 8k Zeichen zur Kostenkontrolle + "--- Zusammenfassung ---" + ) + + try: + summary = call_openai_chat(prompt, temperature=0.3, model="gpt-4o-mini") + return summary if summary else "k.A. (Zusammenfassung fehlgeschlagen)" + except Exception as e: + logger.error(f"Fehler bei der Wikipedia-Zusammenfassung für {company_name}: {e}") + return "FEHLER (API-Fehler bei Zusammenfassung)" + @retry_on_failure def summarize_batch_openai(tasks_data): @@ -1000,55 +1026,56 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg @retry_on_failure -def verify_wiki_article_chatgpt(company_name, website, wiki_url): +def verify_wiki_article_chatgpt(company_name, parent_name, website, wiki_title, wiki_summary): + """ + Verifiziert faktenbasiert, ob ein Wikipedia-Artikel zum Unternehmen passt, + indem der notwendige Kontext direkt im Prompt mitgeliefert wird. + """ logger = logging.getLogger(__name__) - logger.info(f"Starte ChatGPT-Verifizierung für '{company_name}' und URL '{wiki_url[:50]}'...") + logger.info(f"Starte kontextbasierte KI-Verifizierung für '{company_name}'...") - - prompt = """Aufgabe: Bewerte als erfahrener Datenanalyst, ob der Wikipedia-Artikel die relevanteste verfügbare Seite für das angegebene Unternehmen ist. + prompt_template = """ +Aufgabe: Bewerte als erfahrener Datenanalyst, ob der Wikipedia-Artikel die relevanteste Seite für das angegebene Unternehmen ist. Deine Bewertungsregeln: -1. Muttergesellschaft ist OK: Der Artikel darf auch die Muttergesellschaft beschreiben (z.B. für "ABB Automation GmbH" ist der Artikel "ABB (Unternehmen)" korrekt). -2. Rechtsform ist sekundär: Ignoriere kleine Abweichungen im NAmen, insbesondere fehlende REchtsformen wie "GmbH", "AG" etc. (z.B. für "1&1 Versatel GmbH" ist der Artikel "1&1 Versatel" korrekt). -3. Inhalt zählt: Prüfe, ob die Website des Unternehmens im Artikel erwähnt wird oder ob der beschriebene Geschäftszweck übereinstimmt. Das ist wichtiger als der exakte Name. +1. **Muttergesellschaft prüfen:** Wird der Name des Zielunternehmens oder des Mutterkonzerns im Titel oder in der Zusammenfassung erwähnt? Das ist ein sehr starkes positives Signal. +2. **Inhalt prüfen:** Vergleiche den Geschäftszweck aus der Artikel-Zusammenfassung mit der Website. Gibt es eine plausible Übereinstimmung? +3. **Irrelevanz erkennen:** Ist der Artikel über etwas völlig anderes (z.B. eine Stadt, eine Person, ein allgemeines Konzept)? Dann ist er falsch. -Unternehmen: -Name: {company_name} -Website: {website} +--- Unternehmensdaten --- +Name des Zielunternehmens: {company_name} +Website des Zielunternehmens: {website} +Mutterkonzern (falls bekannt): {parent_name} -Vorgegebener Wikipedia-Artikel: -Artikel: {wiki_url} +--- Vorgegebener Wikipedia-Artikel --- +Titel: {wiki_title} +Zusammenfassung: {wiki_summary} -Antwortformat: -Konsistenz: +--- Antwortformat (strikt einhalten!) --- +Konsistenz: Begründung: -Vorschlag URL: -""".strip() +""" + prompt = prompt_template.format( + company_name=company_name, + website=website, + parent_name=parent_name if parent_name else "Nicht bekannt", + wiki_title=wiki_title, + wiki_summary=wiki_summary[:1500] + ) + try: - chat_response = call_openai_chat(prompt, temperature=0.0) - if not chat_response: - raise APIError("Keine Antwort von OpenAI für Wiki-Verifizierung erhalten.") - - - # Robustes Parsing - parsed = {"consistency": "FEHLER PARSING", "justification": "", "suggested_url": ""} - for line in chat_response.strip().splitlines(): - if ":" in line: - key, val = line.split(":", 1) - key = key.strip().lower().replace(" ", "_") - parsed[key] = val.strip() - - - return { - "consistency": parsed.get("konsistenz", "FEHLER PARSING").upper(), - "justification": parsed.get("begründung", ""), - "suggested_url": parsed.get("vorschlag_url", ""), - } - - + response = call_openai_chat(prompt, temperature=0.0, model="gpt-4o-mini") + lines = response.strip().lower().split('\n') + result = {'consistency': 'X', 'justification': 'Fehler: KI-Antwort unvollständig'} + for line in lines: + if line.startswith('konsistenz:'): + result['consistency'] = line.split(':', 1)[1].strip().upper() + elif line.startswith('begründung:'): + result['justification'] = line.split(':', 1)[1].strip().capitalize() + return result except Exception as e: - logger.error(f"Fehler bei der ChatGPT Wiki-Verifizierung: {e}") - return {"consistency": "FEHLER API", "justification": str(e), "suggested_url": ""} + logger.error(f"Fehler bei der Verarbeitung der ChatGPT-Antwort für Wiki-Verifizierung: {e}") + return {'consistency': 'X', 'justification': 'Fehler: KI-Antwort konnte nicht geparst werden'} @retry_on_failure