This commit is contained in:
2025-04-14 14:09:14 +00:00
parent 253ed2ca3e
commit 2c340537ef

View File

@@ -1406,21 +1406,27 @@ class WikipediaScraper:
# ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ==================== # ==================== NEUE FUNKTION: Angepasste evaluate_branche_chatgpt ====================
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary): def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary):
import csv
from datetime import datetime
# Hier sollte auch die Funktion debug_print und normalize_company_name verfügbar sein.
# Ich gehe davon aus, dass diese Funktionen bereits definiert sind.
def load_target_branches(): def load_target_branches():
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 # Spalte 0 wird getrimmt und nur nicht-leere Zeilen übernommen
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 []
# Lade das Ziel-Branchenschema und normalisiere die Werte
target_branches = load_target_branches() target_branches = load_target_branches()
# Wir loggen hier nicht das vollständige Ziel-Branchenschema!
norm_targets = [normalize_company_name(tb) for tb in target_branches] norm_targets = [normalize_company_name(tb) for tb in target_branches]
# Definiere die Fokus-Branchen, die im Prompt berücksichtigt werden sollen
focus_branches = [ focus_branches = [
"Gutachter / Versicherungen > Baugutachter", "Gutachter / Versicherungen > Baugutachter",
"Gutachter / Versicherungen > Technische Gutachten", "Gutachter / Versicherungen > Technische Gutachten",
@@ -1439,8 +1445,8 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
"Versorger > Telekommunikation" "Versorger > Telekommunikation"
] ]
focus_branches_str = "\n".join(focus_branches) focus_branches_str = "\n".join(focus_branches)
# API-Key laden # API-Key laden falls nicht verfügbar, gibt die Funktion einen Fallback zurück
try: try:
with open("api_key.txt", "r") as f: with open("api_key.txt", "r") as f:
api_key = f.read().strip() api_key = f.read().strip()
@@ -1449,15 +1455,15 @@ 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
# Entscheidung: Falls kein Wikipedia-Artikel vorliegt, verwende die Website-Zusammenfassung # Falls kein Wikipedia-Artikel vorhanden ist, verwende die Website-Zusammenfassung als Fallback.
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
else: else:
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 # Erstelle den System-Prompt, der die Fokus-Branchen als bevorzugte Auswahlmöglichkeiten integriert.
system_prompt = ( system_prompt = (
"Du bist ein Experte im Field Service Management. Ordne das folgende Unternehmen exakt einer Branche zu.\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"
@@ -1473,7 +1479,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
"Die Antwort muss exakt einem der Zielbranchen entsprechen. Bitte antworte im Format:\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>" "Branche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung, falls abweichend, ansonsten leer>"
) )
try: try:
response = openai.ChatCompletion.create( response = openai.ChatCompletion.create(
model=Config.TOKEN_MODEL, model=Config.TOKEN_MODEL,
@@ -1484,14 +1490,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}")
# Falls keine Einschätzung möglich ist, nehmen wir den ursprünglichen CRM-Wert # Fallback: Wenn keine ChatGPT-Einschätzung möglich ist
if normalize_company_name(crm_branche) in norm_targets: if normalize_company_name(crm_branche) in norm_targets:
debug_print("Fallback: Verwende CRM-Branche, da keine ChatGPT-Einschätzung verfügbar ist.") 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."} return {"branch": crm_branche, "consistency": "ok", "justification": "Keine ChatGPT-Einschätzung; CRM-Wert verwendet."}
else: else:
return {"branch": "k.A.", "consistency": "k.A.", "justification": "Keine ChatGPT-Einschätzung möglich und CRM-Wert ungültig."} return {"branch": "k.A.", "consistency": "X", "justification": "Keine ChatGPT-Einschätzung möglich und CRM-Wert ungültig."}
# Parse die Antwort # Parse die Antwort von ChatGPT
chat_branch = None chat_branch = None
chat_consistency = None chat_consistency = None
chat_justification = "" chat_justification = ""
@@ -1503,23 +1509,23 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
chat_consistency = line.split(":", 1)[1].strip() chat_consistency = line.split(":", 1)[1].strip()
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"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 die Werte zur Validierung # Normiere die Werte zum Vergleich
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}'")
# Falls ChatGPT keine brauchbare Antwort lieferte, verwenden wir den CRM-Wert als Fallback # Falls ChatGPT keine aussagekräftige Antwort liefert, verwende den CRM-Wert als Fallback
if not norm_chat: if not norm_chat:
debug_print("Keine aussagekräftige ChatGPT-Antwort erhalten, fallback: CRM-Branche.") debug_print("Keine aussagekräftige ChatGPT-Antwort erhalten, fallback: CRM-Branche.")
if norm_crm in norm_targets: if norm_crm in norm_targets:
return {"branch": crm_branche, "consistency": "ok", "justification": "Keine ChatGPT-Antwort; CRM-Wert übernommen."} return {"branch": crm_branche, "consistency": "ok", "justification": "Keine ChatGPT-Antwort; CRM-Wert übernommen."}
else: else:
return {"branch": "k.A.", "consistency": "X", "justification": "Keine ChatGPT-Antwort und CRM-Wert passt nicht."} return {"branch": "k.A.", "consistency": "X", "justification": "Keine ChatGPT-Antwort und CRM-Wert passt nicht."}
# Überprüfe, ob der ChatGPT-Vorschlag im Ziel-Branchenschema enthalten ist # Überprüfe, ob der ChatGPT-Vorschlag exakt im Ziel-Branchenschema enthalten ist
if norm_chat not in norm_targets: if norm_chat not in norm_targets:
debug_print(f"Vorgeschlagene Branche '{chat_branch}' (normiert: '{norm_chat}') entspricht nicht exakt dem Ziel-Branchenschema.") 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. # Fallback: Falls der CRM-Wert gültig ist, verwende ihn.
@@ -1530,7 +1536,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
debug_print("Fallback: Keine gültige Branche gefunden.") debug_print("Fallback: Keine gültige Branche gefunden.")
return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."} return {"branch": "k.A.", "consistency": "X", "justification": "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."}
else: else:
# Vergleiche die normierten Werte von CRM und ChatGPT # Vergleiche CRM- und ChatGPT-Vorschlag wenn diese exakt übereinstimmen, ist die Konsistenz "ok"
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 = ""