v1.4.7 Fallback Website-Details: Mehr Logging & Fallback in Branchenbewertung

- In evaluate_branche_chatgpt() wird geprüft, ob sowohl Wiki- als auch externe Beschreibung 'k.A.' sind.
- Falls ja, wird der Website-Zusammenfassungstext als Fallback zur Branchenbewertung genutzt.
- Zusätzliche debug_print()-Ausgaben wurden eingefügt, um anzuzeigen, welche Informationen für die Entscheidungsfindung herangezogen wurden.
- Nach der ChatGPT-Antwort wird das Endergebnis ebenfalls geloggt.
This commit is contained in:
2025-04-09 07:04:45 +00:00
parent 1202b2c2f4
commit 9dfff201d6

View File

@@ -1,16 +1,15 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
""" """
Version: v1.4.6 Version: v1.4.7
Datum: {aktuelles Datum} Datum: {aktuelles Datum}
Git-Überschrift (max. 100 Zeichen): Git-Überschrift (max. 100 Zeichen):
v1.4.6 Erweiterte Modi: Neuer Modus 23 Website-Detail Extraction + SERP Lookup v1.4.7 Fallback Website-Details: Mehr Logging & Fallback in Branchenbewertung
Git-Änderungsbeschreibung: Git-Änderungsbeschreibung:
- Neuer Modus 23 implementiert: Website Detail Extraction für Zeilen mit "x" in Spalte A. - In evaluate_branche_chatgpt() wird geprüft, ob sowohl Wiki- als auch externe Beschreibung 'k.A.' sind.
- scrape_website_details() extrahiert Seitentitel, Meta-Description und h1/h2/h3 aus der Startseite. - Falls ja, wird der Website-Zusammenfassungstext als Fallback zur Branchenbewertung genutzt.
- SERP-API Website Lookup (Modus 22) integriert: Fehlt in Spalte D eine Website, wird diese ermittelt und normalisiert. - Zusätzliche debug_print()-Ausgaben wurden eingefügt, um anzuzeigen, welche Informationen für die Entscheidungsfindung herangezogen wurden.
- Alignment Demo bleibt unverändert; neue Spalten AR (Website Rohtext) und AS (Website Zusammenfassung) werden beibehalten. - Nach der ChatGPT-Antwort wird das Endergebnis ebenfalls geloggt.
- Main-Funktion und DataProcessor entsprechend der neuen Betriebsmodi angepasst.
""" """
@@ -941,14 +940,18 @@ 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
# Wenn weder Wikipedia-Branche noch externe Beschreibung vorliegen, verwende Website-Zusammenfassung als Fallback # Fallback: Falls Wikipedia-Branche und externe Beschreibung beide 'k.A.' sind, nutze Website-Zusammenfassung
if wiki_branche.strip().lower() == "k.a." and beschreibung.strip().lower() == "k.a.": if wiki_branche.strip().lower() == "k.a." and beschreibung.strip().lower() == "k.a.":
beschreibung = website_summary debug_print("Keine Wiki- und externe Branchenbeschreibung vorhanden, verwende Website-Zusammenfassung als Fallback.")
used_description = website_summary
else:
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 = ( 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"
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): {beschreibung if beschreibung.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" "Das Ziel-Branchenschema umfasst ALLE gültigen Branchen, also sowohl Fokusbranchen als auch weitere, z. B. 'Housing > Sozialbau Unternehmen'.\n"
@@ -958,7 +961,7 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
f"{focus_branches_str}\n\n" f"{focus_branches_str}\n\n"
"Gewichtung der Angaben:\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" "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 übernimmt gegebenenfalls der Website-Zusammenfassungstext, wenn beide fehlen)\n" "2. Branchenbeschreibung (Spalte G) (hier wird Website-Zusammenfassung genutzt, wenn beide Wikipedia- und externe Beschreibung fehlen)\n"
"3. CRM-Branche (Spalte F)\n\n" "3. CRM-Branche (Spalte F)\n\n"
"Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). " "Ordne das Unternehmen exakt einer der oben genannten Branchen zu (keine zusätzlichen Branchen erfinden). "
"Bitte antworte im Format:\n" "Bitte antworte im Format:\n"
@@ -983,18 +986,23 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
consistency = line.split(":", 1)[1].strip() consistency = line.split(":", 1)[1].strip()
elif line.lower().startswith("begründung:"): elif line.lower().startswith("begründung:"):
justification = line.split(":", 1)[1].strip() justification = line.split(":", 1)[1].strip()
# Falls das Ergebnis nicht im Ziel-Branchenschema enthalten ist, vermerke dies
if branch.lower() not in [tb.lower() for tb in target_branches]: if branch.lower() not in [tb.lower() for tb in target_branches]:
justification = "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema." justification = "Vorgeschlagene Branche entspricht nicht dem Ziel-Branchenschema."
branch = "k.A." branch = "k.A."
consistency = "X" consistency = "X"
# Falls die CRM-Branche exakt übereinstimmt, löschen wir die Begründung
if crm_branche.strip() and branch.lower() == crm_branche.strip().lower(): if crm_branche.strip() and branch.lower() == crm_branche.strip().lower():
justification = "" justification = ""
consistency = "ok" consistency = "ok"
# Zusätzliche Debug-Ausgabe zur Endbewertung
debug_print(f"Endergebnis Branchenbewertung: Branche='{branch}', Übereinstimmung='{consistency}', Begründung='{justification}'")
return {"branch": branch, "consistency": consistency, "justification": 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."}
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: