diff --git a/helpers.py b/helpers.py index d2e9af1e..d94dd629 100644 --- a/helpers.py +++ b/helpers.py @@ -901,6 +901,92 @@ def summarize_wikipedia_article(full_text, company_name): logger.error(f"Fehler bei der Wikipedia-Zusammenfassung für {company_name}: {e}") return "FEHLER (API-Fehler bei Zusammenfassung)" +@retry_on_failure +def evaluate_branche_chatgpt(company_name, website_summary, wiki_absatz): + """ + Führt eine kontextbasierte Brancheneinstufung (v2.0) durch. + Das Unternehmensprofil wird mit dem vollständigen, definierten Branchenschema + abgeglichen, um die bestmögliche Zuordnung zu finden. + """ + logger = logging.getLogger(__name__) + + # 1. Baue das Unternehmensprofil zusammen + unternehmens_profil = [f"- Name: {company_name}"] + if website_summary and 'k.a.' not in website_summary.lower(): + unternehmens_profil.append(f"- Website-Zusammenfassung: {website_summary}") + if wiki_absatz and 'k.a.' not in wiki_absatz.lower(): + unternehmens_profil.append(f"- Wikipedia-Auszug: {wiki_absatz}") + + if len(unternehmens_profil) == 1: + logger.warning(f"Zu wenige Informationen für Brancheneinstufung von '{company_name}'. Breche ab.") + return { + "branch": "FEHLER (Mangelnde Daten)", + "confidence": "N/A", + "justification": "Keine Website- oder Wikipedia-Daten zur Analyse vorhanden." + } + + # 2. Baue das Ziel-Branchenschema als Textblock auf + schema_text_parts = [] + for i, (branch, details) in enumerate(Config.BRANCH_GROUP_MAPPING.items()): + schema_text_parts.append(f"{i+1}. Branche: {branch}") + if details.get("definition"): + schema_text_parts.append(f" Definition: {details['definition']}") + if details.get("beispiele"): + schema_text_parts.append(f" Beispiele: {details['beispiele']}") + + ziel_branchenschema_text = "\n".join(schema_text_parts) + + # 3. Baue den Master-Prompt zusammen + prompt_parts = [ + "Du bist ein erfahrener Branchenanalyst bei einer führenden Unternehmensberatung. Deine Aufgabe ist es, ein Unternehmen präzise einer von 54 vordefinierten Branchenkategorien zuzuordnen. Nutze dafür ausschließlich die bereitgestellten Definitionen.", + "\n--- UNTERNEHMENS-PROFIL ---", + "\n".join(unternehmens_profil), + "\n--- ZIEL-BRANCHENSCHEMA (Deine einzig gültige Wissensbasis) ---", + ziel_branchenschema_text, + "\n--- DEINE AUFGABE (DENKPROZESS) ---", + "1. **Analysiere das Unternehmens-Profil:** Was ist die exakte, primäre Geschäftstätigkeit des Unternehmens?", + "2. **Vergleiche diese Tätigkeit mit ALLEN Definitionen** im Ziel-Branchenschema. Achte genau auf die Abgrenzungen.", + "3. **Identifiziere die Definition, die am besten passt.** Nutze die Beispielunternehmen zur Validierung deiner Wahl.", + "4. **Triff eine Entscheidung** und gib das Ergebnis im folgenden JSON-Format aus:", + ''' + { + "Branche": "", + "Konfidenz": "", + "Begruendung": "" + } + ''' + ] + + prompt = "\n".join(prompt_parts) + + # 4. API-Aufruf + try: + response_str = call_openai_chat(prompt, temperature=0.0, model="gpt-4o", response_format_json=True) + if not response_str: + raise APIError("Keine Antwort von OpenAI erhalten.") + + response_json = json.loads(response_str) + + # Validierung des Ergebnisses + final_branch = response_json.get("Branche") + if final_branch not in Config.BRANCH_GROUP_MAPPING: + logger.warning(f"KI hat eine ungültige Branche zurückgegeben: '{final_branch}'. Markiere als Fehler.") + response_json["Branche"] = "FEHLER (Ungültige Antwort)" + response_json["Begruendung"] = f"Originalantwort: {final_branch}. " + response_json.get("Begruendung", "") + + return { + "branch": response_json.get("Branche", "FEHLER (Parsing)"), + "confidence": response_json.get("Konfidenz", "N/A"), + "justification": response_json.get("Begruendung", "Keine Begründung erhalten.") + } + + except Exception as e: + logger.error(f"Endgültiger FEHLER beim OpenAI-Aufruf für Brancheneinstufung von {company_name}: {e}") + return { + "branch": "FEHLER (API)", + "confidence": "N/A", + "justification": f"Fehler bei der API-Kommunikation: {str(e)[:100]}" + } def evaluate_branches_batch(companies_data): """