v1.4.3 Anpassung Branchenbewertung im Batch, Ziel-Branchenschema streng prüfen, Zeilenabfrage in Mod
- Alignment Demo (Zeilen A1–AQ5) wurde exakt wie in der Ausgangsversion integriert.
- Im Batch-Modus (Modus 51) wird nun zusätzlich die Branchenbewertung (bis Spalte Y) ausgeführt:
• Spalte W: Chat Vorschlag Branche
• Spalte X: Chat Konsistenz Branche
• Spalte Y: Chat Begründung Abweichung Branche
- In evaluate_branche_chatgpt wird überprüft, ob der von ChatGPT vorgeschlagene Branchentext exakt im Ziel-Branchenschema enthalten ist.
Falls nicht, wird „k.A.“ mit Konsistenz "X" und entsprechender Begründung zurückgegeben.
- Wenn der Vorschlag mit der in CRM festgelegten Branche übereinstimmt, wird keine Begründung (leere Zeichenkette) ausgegeben.
- Vor Start im Batch wird abgefragt, wieviele Zeilen verarbeitet werden sollen.
- Bei Wikipedia: Wird _nicht_ erneut gesucht, wenn first_paragraph "k.A." ist.
This commit is contained in:
@@ -1,19 +1,21 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Version: v1.4.2
|
||||
Version: v1.4.3
|
||||
Datum: {aktuelles Datum}
|
||||
Git-Überschrift (max. 100 Zeichen):
|
||||
v1.4.2 Branchenbewertung im Batch, Wikipedia k.A.-Handling optimiert, Zeilenabfrage in Modus 51
|
||||
v1.4.3 Anpassung Branchenbewertung im Batch, Ziel-Branchenschema streng prüfen, Zeilenabfrage in Modus 51
|
||||
|
||||
Git-Änderungsbeschreibung:
|
||||
- Alignment Demo (Zeilen A1–AQ5) exakt gemäß der vorgegebenen Ausgangsversion eingebaut.
|
||||
- Im Batch-Prozess (Modus 51) wird jetzt zusätzlich die Branchenbewertung (bis einschließlich Spalte Y) durchgeführt.
|
||||
- Spalte W: Chat Vorschlag Branche
|
||||
- Spalte X: Chat Konsistenz Branche
|
||||
- Spalte Y: Chat Begründung Abweichung Branche
|
||||
- Wenn der extrahierte Wikipedia-Artikel "k.A." enthält, wird nicht erneut nach einem Artikel gesucht; stattdessen bleibt der Wert "k.A.".
|
||||
- Vor Start im Batch (Modus 51) wird abgefragt, wie viele Zeilen verarbeitet werden sollen.
|
||||
- Weitere Schritte im Vollverarbeitungsmodus (insb. Mitarbeiter‑Schätzung und Kontaktsuche) sind vorerst noch nicht vollständig implementiert.
|
||||
- Alignment Demo (Zeilen A1–AQ5) wurde exakt wie in der Ausgangsversion integriert.
|
||||
- Im Batch-Modus (Modus 51) wird nun zusätzlich die Branchenbewertung (bis Spalte Y) ausgeführt:
|
||||
• Spalte W: Chat Vorschlag Branche
|
||||
• Spalte X: Chat Konsistenz Branche
|
||||
• Spalte Y: Chat Begründung Abweichung Branche
|
||||
- In evaluate_branche_chatgpt wird überprüft, ob der von ChatGPT vorgeschlagene Branchentext exakt im Ziel-Branchenschema enthalten ist.
|
||||
Falls nicht, wird „k.A.“ mit Konsistenz "X" und entsprechender Begründung zurückgegeben.
|
||||
- Wenn der Vorschlag mit der in CRM festgelegten Branche übereinstimmt, wird keine Begründung (leere Zeichenkette) ausgegeben.
|
||||
- Vor Start im Batch wird abgefragt, wieviele Zeilen verarbeitet werden sollen.
|
||||
- Bei Wikipedia: Wird _nicht_ erneut gesucht, wenn first_paragraph "k.A." ist.
|
||||
"""
|
||||
|
||||
import os
|
||||
@@ -38,7 +40,7 @@ except ImportError:
|
||||
|
||||
# ==================== KONFIGURATION ====================
|
||||
class Config:
|
||||
VERSION = "v1.4.2"
|
||||
VERSION = "v1.4.3"
|
||||
LANG = "de"
|
||||
CREDENTIALS_FILE = "service_account.json"
|
||||
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
|
||||
@@ -72,7 +74,7 @@ def create_log_filename(mode):
|
||||
|
||||
if not os.path.exists("Log"):
|
||||
os.makedirs("Log")
|
||||
LOG_FILE = None # Wird in main() gesetzt
|
||||
LOG_FILE = None
|
||||
|
||||
def debug_print(message):
|
||||
global LOG_FILE
|
||||
@@ -188,7 +190,7 @@ def prompt_overview():
|
||||
["process_employee_consistency", "Vergleiche CRM-, Wiki- und ChatGPT-Mitarbeiterzahlen. Gib die prozentuale Differenz und eine Begründung zurück."],
|
||||
["evaluate_umsatz_chatgpt", "Schätze den Umsatz in Mio. Euro für {company_name} basierend auf Wikipedia-Daten, antworte nur mit der Zahl."],
|
||||
["evaluate_fsm_suitability", "Bewerte, ob {company_name} für Field Service Management geeignet ist; antworte ausschließlich mit 'Ja' oder 'Nein' und einer kurzen Begründung."],
|
||||
["evaluate_branche_chatgpt", "Ordne {company_name} exakt einer Branche des Ziel-Branchenschemas zu. Antworte im Format: Branche: <>, Übereinstimmung: <>, Begründung: <>."]
|
||||
["evaluate_branche_chatgpt", "Ordne {company_name} exakt einer Branche des Ziel-Branchenschemas zu. Antworte im Format:\nBranche: <vorgeschlagene Branche>\nÜbereinstimmung: <ok oder X>\nBegründung: <kurze Begründung>."]
|
||||
]
|
||||
return prompts
|
||||
|
||||
@@ -201,14 +203,13 @@ def mark_processed(field):
|
||||
|
||||
# ==================== NEUE FUNKTIONEN FÜR MITARBEITER ====================
|
||||
def process_employee_estimation(company_name, wiki_first_paragraph, crm_employee):
|
||||
# Wenn Wikipedia-Daten "k.A." liefern, wird nicht erneut gesucht – der Wert bleibt "k.A.".
|
||||
if wiki_first_paragraph.strip().lower() == "k.a.":
|
||||
return "Skipped (k.A.)"
|
||||
try:
|
||||
crm_val = int(crm_employee)
|
||||
return str(crm_val)
|
||||
except Exception:
|
||||
return "100" # Beispielwert
|
||||
return "100"
|
||||
|
||||
def process_employee_consistency(crm_employee, wiki_employee, chat_employee):
|
||||
try:
|
||||
@@ -362,12 +363,12 @@ def alignment_demo(sheet):
|
||||
"Wird u.a. mit CRM-Anzahl Mitarbeiter zur Validierung des Unternehmens verglichen bzw. zur Bewertung der Größe / Einschätzung der Technikerzahl bzw. FSM-Relevanz genutzt.",
|
||||
"Wenn Wiki-Branche nicht gepflegt ist, wird dieses Feld zur finalen Ermittlung der Branche im Ziel-Branchenschema genutzt und mit CRM-Branche bzw. CRM-Beschreibung Branche Extern verglichen.",
|
||||
"\"Es soll durch ChatGPT geprüft werden, ob anhand der vorliegenden Daten bestätigt werden kann, dass der Wikipedia-Eintrag das Unternehmen sicher beschreibt. Dabei können alle Daten (Website, Umsatz, Mitarbeiterzahl etc.) berücksichtigt werden. Eine gewisse Toleranz (±30%) ist erlaubt. Insbesondere bei Konzernstrukturen muss großzügig bewertet werden. Abweichungen sollen in der Spalte 'Chat Begründung Wiki Inkonsistenz' begründet werden.\"",
|
||||
"\"Liegt eine Inkonsistenz zwischen dem gefundenen Wikipedia-Artikel und dem Unternehmen vor, so soll dies kurz begründet werden. Wurde der Artikel als unpassend identifiziert, soll ChatGPT einen alternativen Wikipedia-Artikel vorschlagen und in Spalte 'Chat Vorschlag Wiki Artikel' ausgeben.\"",
|
||||
"\"Liegt eine Inkonsistenz zwischen dem gefundenen Wikipedia-Artikel und dem Unternehmen vor, so soll dies kurz begründet werden. Wurde der Artikel als unpassend identifiziert, soll ChatGPT einen alternativen Wikipedia-Artikel vorschlagen und diesen in Spalte 'Chat Vorschlag Wiki Artikel' ausgeben.\"",
|
||||
"\"Sollte durch die Wikipedia-Suche kein Artikel gefunden werden oder als unpassend bewertet werden, soll ChatGPT eigenständig nach einem passenden Artikel recherchieren. Der gefundene Artikel muss vom als unpassend bewerteten Artikel abweichen. Wird kein passender Artikel gefunden, soll 'kein Artikel verfügbar' ausgegeben werden.\"",
|
||||
"XXX derzeit nicht verwendet, wird vermutlich gelöscht xxx",
|
||||
"\"ChatGPT soll anhand der vorliegenden Informationen prüfen, welcher Branche des Ziel-Branchenschemas das Unternehmen am ehesten zugeordnet werden kann. Das Ziel-Branchenschema darf nicht verändert werden, sondern die Vorschläge müssen exakt diesem Schema entsprechen.\"",
|
||||
"Die in Spalte CRM festgelegte Branche soll mit der von ChatGPT ermittelten Branche in 'Chat Vorschlag Branche' verglichen werden.",
|
||||
"Weicht die von ChatGPT ermittelte Branche von der in CRM vorliegenden ab, soll ChatGPT die Abweichung kurz begründen.",
|
||||
"Weicht die von ChatGPT ermittelte Branche von der in CRM vorliegenden ab, so soll ChatGPT die Abweichung kurz begründen.",
|
||||
"ChatGPT soll anhand der vorliegenden Daten prüfen, ob das Unternehmen für den Einsatz einer Field Service Management Lösung geeignet ist.",
|
||||
"Die in 'Chat Begründung für FSM Relevanz' angegebene Begründung soll zur Bewertung der FSM-Eignung herangezogen werden.",
|
||||
"Nur wenn kein Wikipedia-Eintrag vorhanden ist, soll ChatGPT basierend auf öffentlich verfügbaren Informationen die Mitarbeiterzahl schätzen. Falls keine Schätzung möglich ist, wird 'keine Schätzung möglich' ausgegeben.",
|
||||
@@ -378,12 +379,12 @@ def alignment_demo(sheet):
|
||||
"Nur wenn kein Wikipedia-Eintrag vorhanden ist, soll ChatGPT den Umsatz anhand der Unternehmenswebsite oder anderer Daten schätzen. Bei fehlender Schätzung soll 'keine Schätzung möglich' ausgegeben werden.",
|
||||
"ChatGPT soll signifikante Umsatzabweichungen zwischen den Schätzungen von Chat, Wikipedia und CRM begründen. Stimmen die Werte (±30%) überein, wird 'OK' ausgegeben.",
|
||||
"Über SerpAPI wird zusammen mit der in 'CRM Kurzform' enthaltenen Information nach 'Serviceleiter' gesucht.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' nach 'Leiter IT' etc. gesucht.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' nach 'Geschäftsführer' etc. gesucht.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' erneut nach 'Serviceleiter' etc. gesucht.",
|
||||
"Wenn die Kontaktsuche gestartet wird, wird der erste Eintrag ohne Zeitstempel in dieser Spalte gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Wenn die Wikipedia-Suche gestartet wird, wird der erste Eintrag ohne Zeitstempel in dieser Spalte gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Wenn die ChatGPT-Bewertung gestartet wird, wird der erste Eintrag ohne Zeitstempel in dieser Spalte gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' nach 'Leiter IT' gesucht.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' nach 'Geschäftsführer' gesucht.",
|
||||
"Über SerpAPI wird zusammen mit 'CRM Kurzform' erneut nach 'Serviceleiter' gesucht.",
|
||||
"Wenn die Kontaktsuche gestartet wird, wird der erste Eintrag ohne Zeitstempel gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Wenn die Wikipedia-Suche gestartet wird, wird der erste Eintrag ohne Zeitstempel gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Wenn die ChatGPT-Bewertung gestartet wird, wird der erste Eintrag ohne Zeitstempel gesucht; Zeilen mit vorhandenem Zeitstempel werden übersprungen.",
|
||||
"Wird durch das System befüllt",
|
||||
"Wird durch tiktoken berechnet"
|
||||
]
|
||||
@@ -666,7 +667,7 @@ def process_verification_only(rows_limit=None):
|
||||
main_sheet.update(values=[[wiki_confirm]], range_name=f"S{row_num}")
|
||||
main_sheet.update(values=[[alt_article]], range_name=f"U{row_num}")
|
||||
main_sheet.update(values=[[wiki_explanation]], range_name=f"V{row_num}")
|
||||
# Hier: Branchenbewertung hinzufügen (bis Spalte Y)
|
||||
# Branchenbewertung hinzufügen (Spalten W bis Y)
|
||||
crm_branch = data[row_num-1][6] if len(data[row_num-1]) > 6 else "k.A."
|
||||
ext_branch = data[row_num-1][7] if len(data[row_num-1]) > 7 else "k.A."
|
||||
wiki_branch = data[row_num-1][14] if len(data[row_num-1]) > 14 else "k.A."
|
||||
@@ -741,13 +742,12 @@ class DataProcessor:
|
||||
website = row_data[2] if len(row_data) > 2 else ""
|
||||
# Wikipedia-Daten werden in Spalte L bis R geschrieben
|
||||
wiki_update_range = f"L{row_num}:R{row_num}"
|
||||
dt_wiki_range = f"AN{row_num}" # Wikipedia Timestamp
|
||||
dt_chat_range = f"AO{row_num}" # ChatGPT Timestamp
|
||||
ver_range = f"AP{row_num}" # Versions-Timestamp
|
||||
dt_wiki_range = f"AN{row_num}"
|
||||
dt_chat_range = f"AO{row_num}"
|
||||
ver_range = f"AP{row_num}"
|
||||
print(f"\n[{datetime.now().strftime('%H:%M:%S')}] Verarbeite Zeile {row_num}: {company_name}")
|
||||
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
company_data = {}
|
||||
# Wikipedia-Verarbeitung: Falls Timestamp nicht gesetzt
|
||||
if process_wiki:
|
||||
if len(row_data) <= 39 or row_data[39].strip() == "":
|
||||
if len(row_data) > 11 and row_data[11].strip() not in ["", "k.A."]:
|
||||
@@ -769,8 +769,7 @@ class DataProcessor:
|
||||
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.',
|
||||
'full_infobox': 'k.A.'
|
||||
}
|
||||
# Hier: _NICHT_ erneut suchen, wenn first_paragraph "k.A." ist – wir belassen diesen Wert,
|
||||
# sodass später ChatGPT via process_wiki_verification alternative Vorschläge liefern kann.
|
||||
# Kein erneuter Suchvorgang, wenn first_paragraph "k.A." enthält
|
||||
wiki_values = [
|
||||
row_data[11] if len(row_data) > 11 and row_data[11].strip() not in ["", "k.A."] else "k.A.",
|
||||
company_data.get('url', 'k.A.'),
|
||||
@@ -784,7 +783,6 @@ class DataProcessor:
|
||||
self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_wiki_range)
|
||||
else:
|
||||
debug_print(f"Zeile {row_num}: Wikipedia-Timestamp bereits gesetzt – überspringe Wiki-Auswertung.")
|
||||
# ChatGPT-Verarbeitung
|
||||
if process_chatgpt:
|
||||
if len(row_data) <= 40 or row_data[40].strip() == "":
|
||||
crm_umsatz = row_data[8] if len(row_data) > 8 else "k.A."
|
||||
@@ -827,7 +825,7 @@ class DataProcessor:
|
||||
self.sheet_handler.sheet.update(values=[[Config.VERSION]], range_name=ver_range)
|
||||
debug_print(f"✅ Aktualisiert: URL: {company_data.get('url', 'k.A.')}, Branche: {company_data.get('branche', 'k.A.')}, Umsatz-Abgleich: {abgleich_result}, Validierung: {valid_result}, FSM: {fsm_result['suitability']}, Servicetechniker-Schätzung: {st_estimate}")
|
||||
time.sleep(Config.RETRY_DELAY)
|
||||
|
||||
|
||||
# ==================== ALIGNMENT DEMO FÜR HAUPTBLATT UND CONTACTS ====================
|
||||
def alignment_demo_full():
|
||||
alignment_demo(GoogleSheetHandler().sheet)
|
||||
@@ -1070,6 +1068,7 @@ def evaluate_fsm_suitability(company_name, company_data):
|
||||
return {"suitability": "k.A.", "justification": "k.A."}
|
||||
|
||||
def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien):
|
||||
# Laden des Ziel-Branchenschemas
|
||||
def load_target_branches():
|
||||
try:
|
||||
with open("ziel_Branchenschema.csv", "r", encoding="utf-8") as csvfile:
|
||||
@@ -1140,6 +1139,15 @@ def evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kateg
|
||||
consistency = line.split(":", 1)[1].strip()
|
||||
elif line.lower().startswith("begründung:"):
|
||||
justification = line.split(":", 1)[1].strip()
|
||||
# Prüfe, ob der vorgeschlagene Branchentext exakt im Ziel-Branchenschema enthalten ist
|
||||
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"
|
||||
# Falls der Vorschlag exakt mit der CRM-Branche übereinstimmt, brauchen wir keine Begründung.
|
||||
if crm_branche.strip() and branch.lower() == crm_branche.strip().lower():
|
||||
justification = ""
|
||||
consistency = "ok"
|
||||
return {"branch": branch, "consistency": consistency, "justification": justification}
|
||||
except Exception as e:
|
||||
debug_print(f"Fehler beim Aufruf der ChatGPT API für Branchenabgleich: {e}")
|
||||
@@ -1221,12 +1229,11 @@ def process_batch_token_count():
|
||||
time.sleep(Config.RETRY_DELAY)
|
||||
debug_print("Batch Token Count abgeschlossen.")
|
||||
|
||||
|
||||
# ==================== MAIN-FUNKTION ====================
|
||||
def main():
|
||||
global MODE, LOG_FILE
|
||||
print("Bitte wählen Sie den Betriebsmodus:")
|
||||
print("1: Vollständige Verarbeitung (alle Funktionen)")
|
||||
print("1: Vollständige Verarbeitung (alle Funktionen) [Noch nicht fertig]")
|
||||
print("2: Re-Evaluierung markierter Zeilen (nur 'x' in Spalte A)")
|
||||
print("3: Alignment-Demo (nur Spaltenüberschriften)")
|
||||
print("4: Nur Wikipedia-Suche")
|
||||
|
||||
Reference in New Issue
Block a user