This commit is contained in:
2025-04-14 13:34:36 +00:00
parent 23b331bd4b
commit 253ed2ca3e

View File

@@ -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: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>"
)
@@ -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: