This commit is contained in:
2025-04-14 06:13:31 +00:00
parent 47a7f1d442
commit 672d5fc06b

View File

@@ -1406,19 +1406,21 @@ class WikipediaScraper:
# ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ====================
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary):
# Ziel-Branchenschema laden (BOM entfernen)
def load_target_branches():
try:
# Mit "utf-8-sig" werden BOM-Zeichen automatisch entfernt.
with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile:
reader = csv.reader(csvfile)
# Filtern: Nur Zeilen, deren erster Eintrag (nach Strip) nicht exakt "branche" (unabhängig von Groß-/Kleinschreibung) ist.
branches = [row[0].strip() for row in reader if row and row[0].strip().lower() != "branche"]
# Nimm alle Einträge (Spalte 0), ohne leere Zeilen
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)
# Definierte Fokusbranchen (wie bisher)
focus_branches = [
"Gutachter / Versicherungen > Baugutachter",
"Gutachter / Versicherungen > Technische Gutachten",
@@ -1437,6 +1439,8 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
"Versorger > Telekommunikation"
]
focus_branches_str = "\n".join(focus_branches)
# API-Key laden
try:
with open("api_key.txt", "r") as f:
api_key = f.read().strip()
@@ -1445,6 +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
# Fallback: Wenn kein Wikipedia-Artikel vorhanden, verwende 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
@@ -1452,6 +1457,7 @@ 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}'")
# System-Prompt erstellen
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"
f"CRM-Branche (Spalte F): {crm_branche if crm_branche.strip() != '' else 'k.A.'}\n"
@@ -1467,8 +1473,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
"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"
"Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). Bitte antworte im Format:\n"
"Branche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>"
)
@@ -1484,35 +1489,44 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}")
return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."}
branch = None
consistency = None
justification = ""
# Ergebnisse parsen
chat_branch = None
chat_consistency = None
chat_justification = ""
for line in result.split("\n"):
if line.lower().startswith("branche:"):
branch = line.split(":", 1)[1].strip()
elif line.lower().startswith("übereinstimmung:"):
consistency = line.split(":", 1)[1].strip()
elif line.lower().startswith("begründung:"):
justification = line.split(":", 1)[1].strip()
lower_line = line.lower()
if lower_line.startswith("branche:"):
chat_branch = line.split(":", 1)[1].strip()
elif lower_line.startswith("übereinstimmung:"):
chat_consistency = line.split(":", 1)[1].strip()
elif lower_line.startswith("begründung:"):
chat_justification = line.split(":", 1)[1].strip()
# Fallback-Logik: Falls der von ChatGPT vorgeschlagene Branch nicht im Ziel-Branchenschema enthalten ist,
# wird geprüft, ob der in CRM angegebene Branch vorhanden und gültig ist; andernfalls der erste Eintrag.
target_lower = [tb.lower() for tb in target_branches]
if branch is None or branch.lower() not in target_lower:
debug_print("Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema, Fallback verwenden.")
fallback = None
if crm_branche.strip() and crm_branche.lower() in target_lower:
fallback = crm_branche.strip()
elif target_branches:
fallback = target_branches[0]
else:
fallback = "k.A."
branch = fallback
consistency = "ok"
justification = ""
debug_print(f"Endergebnis Branchenbewertung: Branche='{branch}', Übereinstimmung='{consistency}', Begründung='{justification}'")
return {"branch": branch, "consistency": consistency, "justification": justification}
# Überprüfung: Wird ein Branch vorgeschlagen und ist dieser im Ziel-Schema enthalten?
valid = False
if chat_branch:
# Vergleiche normiert
norm_chat = normalize_company_name(chat_branch)
norm_targets = [normalize_company_name(tb) for tb in target_branches]
if norm_chat and norm_chat in norm_targets:
valid = True
if not valid:
# Falls der Vorschlag nicht im Schema enthalten ist, gebe klar die Fehlermeldung zurück
debug_print("Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema.")
return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."}
else:
# Wenn der ChatGPT-Vorschlag gültig ist, vergleichen wir ihn mit der normierten CRM-Branche
norm_crm = normalize_company_name(crm_branche)
norm_chat = normalize_company_name(chat_branch)
debug_print(f"Vergleich normierter Werte: CRM='{norm_crm}' vs. ChatGPT='{norm_chat}'")
if norm_crm and norm_crm == norm_chat:
chat_consistency = "ok"
chat_justification = ""
else:
chat_consistency = "X"
debug_print(f"Endergebnis Branchenbewertung: Branche='{chat_branch}', Übereinstimmung='{chat_consistency}', Begründung='{chat_justification}'")
return {"branch": chat_branch, "consistency": chat_consistency, "justification": chat_justification}