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: try:
with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile: with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile:
reader = csv.reader(csvfile) reader = csv.reader(csvfile)
# Spalte 0 wird getrimmt
branches = [row[0].strip() for row in reader if row and row[0].strip()] branches = [row[0].strip() for row in reader if row and row[0].strip()]
return branches return branches
except Exception as e: except Exception as e:
debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}") debug_print(f"Fehler beim Laden des Ziel-Branchenschemas: {e}")
return [] return []
target_branches = load_target_branches() 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 = [ focus_branches = [
"Gutachter / Versicherungen > Baugutachter", "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."} return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."}
openai.api_key = api_key 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.": if wiki_branche.strip().lower() == "k.a.":
debug_print("Kein Wikipedia-Artikel vorhanden verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.") debug_print("Kein Wikipedia-Artikel vorhanden verwende Website-Zusammenfassung als Branchenbeschreibung-Fallback.")
used_description = website_summary used_description = website_summary
@@ -1454,23 +1457,20 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
used_description = beschreibung 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}'") 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 = ( 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"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"Branchenbeschreibung (Spalte G): {used_description if used_description.strip() != '' else 'k.A.'}\n"
f"Wikipedia-Branche (Spalte N): {wiki_branche}\n" f"Wikipedia-Branche (Spalte N): {wiki_branche}\n"
f"Wikipedia-Kategorien (Spalte Q): {wiki_kategorien}\n\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" "Falls das Unternehmen mehreren Branchen zugeordnet werden könnte, wähle bitte bevorzugt eine aus der folgenden Fokusliste:\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"
f"{focus_branches_str}\n\n" f"{focus_branches_str}\n\n"
"Gewichtung der Angaben:\n" "Gewichtung:\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" "1. Wikipedia-Daten (falls vorhanden)\n"
"2. Branchenbeschreibung (Spalte G) (hier wird die Website-Zusammenfassung genutzt, wenn kein Wikipedia-Artikel vorhanden ist)\n" "2. Externe Branchenbeschreibung (Website-Zusammenfassung, falls Wikipedia nicht vorhanden ist)\n"
"3. CRM-Branche (Spalte F)\n\n" "3. CRM-Branche\n\n"
"Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). " "Die Antwort muss exakt einem der Zielbranchen entsprechen. Bitte antworte im Format:\n"
"Bitte antworte im Format:\n"
"Branche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>" "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}'") debug_print(f"Branchenabgleich ChatGPT Antwort: '{result}'")
except Exception as e: except Exception as e:
debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {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_branch = None
chat_consistency = None chat_consistency = None
chat_justification = "" chat_justification = ""
@@ -1499,23 +1504,33 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
elif lower_line.startswith("begründung:"): elif lower_line.startswith("begründung:"):
chat_justification = line.split(":", 1)[1].strip() 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_crm = normalize_company_name(crm_branche)
norm_chat = normalize_company_name(chat_branch) if chat_branch else "" norm_chat = normalize_company_name(chat_branch) if chat_branch else ""
debug_print(f"Normierte Werte: CRM='{norm_crm}', ChatGPT-Vorschlag='{norm_chat}'") debug_print(f"Normierte Werte: CRM='{norm_crm}', ChatGPT-Vorschlag='{norm_chat}'")
# Erzeuge eine Liste normierter Zielbranchen # Falls ChatGPT keine brauchbare Antwort lieferte, verwenden wir den CRM-Wert als Fallback
norm_targets = [normalize_company_name(tb) for tb in target_branches] if not norm_chat:
debug_print(f"Normierte Zielbranchen: {norm_targets}") 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 # Überprüfe, ob der ChatGPT-Vorschlag im Ziel-Branchenschema enthalten ist
if not norm_chat or norm_chat not in norm_targets: if norm_chat not in norm_targets:
debug_print(f"Vorgeschlagene Branche '{chat_branch}' entspricht nicht dem Ziel-Branchenschema.") debug_print(f"Vorgeschlagene Branche '{chat_branch}' (normiert: '{norm_chat}') entspricht nicht exakt dem Ziel-Branchenschema.")
return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht 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: 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: if norm_crm and norm_crm == norm_chat:
chat_consistency = "ok" chat_consistency = "ok"
chat_justification = "" 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} return {"branch": chat_branch, "consistency": chat_consistency, "justification": chat_justification}
def evaluate_servicetechnicians_estimate(company_name, company_data): def evaluate_servicetechnicians_estimate(company_name, company_data):
try: try:
with open("serpApiKey.txt", "r") as f: with open("serpApiKey.txt", "r") as f: