1.5.5: Neue evaluate_branche_chatgpt mit erweitertem Logging und exakter Branchenabgleich

- Alle verwendeten Input-Werte (CRM-Branche, externe Beschreibung, Wiki-Daten, Website-Zusammenfassung) werden geloggt.
- Bei fehlendem Wikipedia-Eintrag wird explizit die Website-Zusammenfassung als Fallback genutzt.
- Normierte Eingabewerte und Ziel-Branchenschema werden für den exakten Vergleich ausgegeben.
- Es werden ausschließlich Branchen aus dem Ziel-Schema akzeptiert – ansonsten Rückgabe "k.A." mit Konsistenz "X".
This commit is contained in:
2025-04-14 13:02:36 +00:00
parent cd613d15e5
commit 23b331bd4b

View File

@@ -1,6 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Version: v1.5.4 Version: v1.5.5
Datum: {aktuelles Datum} Datum: {aktuelles Datum}
Git-Überschrift (max. 100 Zeichen): Git-Überschrift (max. 100 Zeichen):
1.5.4: Dispatcher und modulare Batch-Prozesse für Wiki, Website und Branch integriert 1.5.4: Dispatcher und modulare Batch-Prozesse für Wiki, Website und Branch integriert
@@ -40,7 +40,7 @@ except ImportError:
# ==================== KONFIGURATION ==================== # ==================== KONFIGURATION ====================
class Config: class Config:
VERSION = "v1.5.4" VERSION = "v1.5.5"
LANG = "de" LANG = "de"
CREDENTIALS_FILE = "service_account.json" CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo" SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -1408,15 +1408,16 @@ class WikipediaScraper:
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):
def load_target_branches(): def load_target_branches():
try: try:
with open("ziel_Branchenschema.csv", "r", encoding="utf-8") as csvfile: with open("ziel_Branchenschema.csv", "r", encoding="utf-8-sig") as csvfile:
reader = csv.reader(csvfile) reader = csv.reader(csvfile)
branches = [row[0] for row in reader if row] 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) target_branches_str = "\n".join(target_branches)
focus_branches = [ focus_branches = [
"Gutachter / Versicherungen > Baugutachter", "Gutachter / Versicherungen > Baugutachter",
"Gutachter / Versicherungen > Technische Gutachten", "Gutachter / Versicherungen > Technische Gutachten",
@@ -1435,6 +1436,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
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()
@@ -1443,13 +1446,13 @@ 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
# Falls kein Wikipedia-Artikel vorliegt, nutze die Website-Zusammenfassung als Fallback für die Branchenbeschreibung # Entscheide, welche Branchenbeschreibung genutzt wird.
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}'") debug_print(f"Verwendete Angaben: CRM-Branche='{crm_branche}', externe Beschreibung='{beschreibung}', Wiki-Branche='{wiki_branche}', Wiki-Kategorien='{wiki_kategorien}', Website-Zusammenfassung='{website_summary}'")
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. Deine Aufgabe ist es, ein Unternehmen basierend auf folgenden Angaben einer Branche zuzuordnen.\n\n"
@@ -1479,40 +1482,47 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
) )
result = response.choices[0].message.content.strip() result = response.choices[0].message.content.strip()
debug_print(f"Branchenabgleich ChatGPT Antwort: '{result}'") debug_print(f"Branchenabgleich ChatGPT Antwort: '{result}'")
branch = "k.A."
consistency = "k.A."
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()
# Zuerst prüfen, ob der ChatGPT-Vorschlag überhaupt zum Ziel-Branchenschema gehört
if branch.lower() not in [tb.lower() for tb in target_branches]:
justification = "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."
branch = "k.A."
consistency = "X"
else:
# Vergleiche die normierten Werte der CRM-Branche und des ChatGPT-Vorschlags
norm_crm = normalize_company_name(crm_branche)
norm_branch = normalize_company_name(branch)
debug_print(f"Vergleich normierter Werte: CRM='{norm_crm}' vs. ChatGPT='{norm_branch}'")
if norm_crm and norm_branch == norm_crm:
justification = ""
consistency = "ok"
else:
consistency = "X"
debug_print(f"Endergebnis Branchenbewertung: Branche='{branch}', Übereinstimmung='{consistency}', Begründung='{justification}'")
return {"branch": branch, "consistency": consistency, "justification": justification}
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."} return {"branch": "k.A.", "consistency": "k.A.", "justification": "k.A."}
# Ergebnis aus der Antwort parsen
chat_branch = None
chat_consistency = None
chat_justification = ""
for line in result.split("\n"):
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()
debug_print(f"Aus der Antwort extrahiert: Branche='{chat_branch}', Übereinstimmung='{chat_consistency}', Begründung='{chat_justification}'")
# Normiere CRM-Branche und ChatGPT-Ergebnis für Vergleich
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}")
# Ü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."}
else:
# Vergleiche den normierten CRM-Wert mit dem ChatGPT-Vorschlag
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}
def evaluate_servicetechnicians_estimate(company_name, company_data): def evaluate_servicetechnicians_estimate(company_name, company_data):