diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 66f6f621..2dd24b79 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -1410,13 +1410,16 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg try: with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile: reader = csv.reader(csvfile) + # Spalte 0 wird getrimmt branches = [row[0].strip() for row in reader if row and row[0].strip()] return branches except Exception as e: debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}") return [] + target_branches = load_target_branches() - target_branches_str = "\n".join(target_branches) + # Wir loggen hier nicht das vollständige Ziel-Branchenschema! + norm_targets = [normalize_company_name(tb) for tb in target_branches] focus_branches = [ "Gutachter / Versicherungen > Baugutachter", @@ -1446,7 +1449,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} openai.api_key = api_key - # Entscheide, welche Branchenbeschreibung genutzt wird. + # Entscheidung: Falls kein Wikipedia-Artikel vorliegt, verwende die Website-Zusammenfassung if wiki_branche.strip().lower() == "k.a.": debug_print("Kein Wikipedia-Artikel vorhanden – verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.") used_description = website_summary @@ -1454,23 +1457,20 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg used_description = beschreibung debug_print(f"Verwendete Angaben: CRM-Branche='{crm_branche}', externe Beschreibung='{beschreibung}', Wiki-Branche='{wiki_branche}', Wiki-Kategorien='{wiki_kategorien}', Website-Zusammenfassung='{website_summary}'") + # Erstelle den Prompt – wir verzichten hier auf die Ausgabe des Ziel-Branchenschemas system_prompt = ( - "Du bist ein Experte im Field Service Management. Deine Aufgabe ist es, ein Unternehmen basierend auf folgenden Angaben einer Branche zuzuordnen.\n\n" + "Du bist ein Experte im Field Service Management. Ordne das folgende Unternehmen exakt einer Branche zu.\n\n" f"CRM-Branche (Spalte F): {crm_branche if crm_branche.strip() != '' else 'k.A.'}\n" f"Branchenbeschreibung (Spalte G): {used_description if used_description.strip() != '' else 'k.A.'}\n" f"Wikipedia-Branche (Spalte N): {wiki_branche}\n" f"Wikipedia-Kategorien (Spalte Q): {wiki_kategorien}\n\n" - "Das Ziel-Branchenschema umfasst ALLE gültigen Branchen, also sowohl Fokusbranchen als auch weitere, z. B. 'Housing > Sozialbau Unternehmen'.\n" - "Das vollständige Ziel-Branchenschema lautet:\n" - f"{target_branches_str}\n\n" - "Falls das Unternehmen mehreren Branchen zugeordnet werden könnte, wähle bitte bevorzugt eine Branche aus der folgenden Fokusliste, sofern zutreffend:\n" + "Falls das Unternehmen mehreren Branchen zugeordnet werden könnte, wähle bitte bevorzugt eine aus der folgenden Fokusliste:\n" f"{focus_branches_str}\n\n" - "Gewichtung der Angaben:\n" - "1. Wikipedia-Branche (Spalte N) zusammen mit Wikipedia-Kategorien (Spalte Q) (höchste Priorität, wenn verifiziert, ansonsten erhöhte Gewichtung der Kategorien)\n" - "2. Branchenbeschreibung (Spalte G) – (hier wird die Website-Zusammenfassung genutzt, wenn kein Wikipedia-Artikel vorhanden ist)\n" - "3. CRM-Branche (Spalte F)\n\n" - "Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). " - "Bitte antworte im Format:\n" + "Gewichtung:\n" + "1. Wikipedia-Daten (falls vorhanden)\n" + "2. Externe Branchenbeschreibung (Website-Zusammenfassung, falls Wikipedia nicht vorhanden ist)\n" + "3. CRM-Branche\n\n" + "Die Antwort muss exakt einem der Zielbranchen entsprechen. Bitte antworte im Format:\n" "Branche: \nÜbereinstimmung: \nBegründung: " ) @@ -1484,9 +1484,14 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg debug_print(f"Branchenabgleich ChatGPT Antwort: '{result}'") except Exception as e: debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}") - return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."} + # Falls keine Einschätzung möglich ist, nehmen wir den ursprünglichen CRM-Wert + if normalize_company_name(crm_branche) in norm_targets: + debug_print("Fallback: Verwende CRM-Branche, da keine ChatGPT-Einschätzung verfügbar ist.") + return {"branch": crm_branche, "consistency": "ok", "justification": "Keine ChatGPT-Einschätzung; CRM-Wert verwendet."} + else: + return {"branch": "k.A.", "consistency": "k.A.", "justification": "Keine ChatGPT-Einschätzung möglich und CRM-Wert ungültig."} - # Ergebnis aus der Antwort parsen + # Parse die Antwort chat_branch = None chat_consistency = None chat_justification = "" @@ -1499,23 +1504,33 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg elif lower_line.startswith("begründung:"): chat_justification = line.split(":", 1)[1].strip() - debug_print(f"Aus der Antwort extrahiert: Branche='{chat_branch}', Übereinstimmung='{chat_consistency}', Begründung='{chat_justification}'") + debug_print(f"Extrahiert: Branche='{chat_branch}', Übereinstimmung='{chat_consistency}', Begründung='{chat_justification}'") - # Normiere CRM-Branche und ChatGPT-Ergebnis für Vergleich + # Normiere die Werte zur Validierung norm_crm = normalize_company_name(crm_branche) norm_chat = normalize_company_name(chat_branch) if chat_branch else "" debug_print(f"Normierte Werte: CRM='{norm_crm}', ChatGPT-Vorschlag='{norm_chat}'") - # Erzeuge eine Liste normierter Zielbranchen - norm_targets = [normalize_company_name(tb) for tb in target_branches] - debug_print(f"Normierte Zielbranchen: {norm_targets}") + # Falls ChatGPT keine brauchbare Antwort lieferte, verwenden wir den CRM-Wert als Fallback + if not norm_chat: + debug_print("Keine aussagekräftige ChatGPT-Antwort erhalten, fallback: CRM-Branche.") + if norm_crm in norm_targets: + return {"branch": crm_branche, "consistency": "ok", "justification": "Keine ChatGPT-Antwort; CRM-Wert übernommen."} + else: + return {"branch": "k.A.", "consistency": "X", "justification": "Keine ChatGPT-Antwort und CRM-Wert passt nicht."} - # Überprüfe, ob der ChatGPT-Vorschlag im Ziel-Schema enthalten ist - if not norm_chat or norm_chat not in norm_targets: - debug_print(f"Vorgeschlagene Branche '{chat_branch}' entspricht nicht dem Ziel-Branchenschema.") - return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."} + # Überprüfe, ob der ChatGPT-Vorschlag im Ziel-Branchenschema enthalten ist + if norm_chat not in norm_targets: + debug_print(f"Vorgeschlagene Branche '{chat_branch}' (normiert: '{norm_chat}') entspricht nicht exakt dem Ziel-Branchenschema.") + # Fallback: Falls der CRM-Wert gültig ist, verwende ihn. + if norm_crm in norm_targets: + debug_print("Fallback: CRM-Branche entspricht dem Ziel-Branchenschema, daher wird sie übernommen.") + return {"branch": crm_branche, "consistency": "ok", "justification": "Fallback: CRM-Wert verwendet."} + else: + debug_print("Fallback: Keine gültige Branche gefunden.") + return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."} else: - # Vergleiche den normierten CRM-Wert mit dem ChatGPT-Vorschlag + # Vergleiche die normierten Werte von CRM und ChatGPT if norm_crm and norm_crm == norm_chat: chat_consistency = "ok" chat_justification = "" @@ -1525,6 +1540,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg return {"branch": chat_branch, "consistency": chat_consistency, "justification": chat_justification} + def evaluate_servicetechnicians_estimate(company_name, company_data): try: with open("serpApiKey.txt", "r") as f: