v1.7.3 Vollständige Alignment Demo für Spaltendoku wiederhergestellt & erweitert

Diese Version stellt die ausführliche `alignment_demo`-Funktion wieder her und erweitert sie, um alle aktuellen Spalten (A-AY) des Google Sheets präzise zu dokumentieren. Dies dient als zentrale Referenz für die Spaltenbedeutungen und -verwendungen im Projekt.

**Änderungen:**
- **`alignment_demo` wiederhergestellt:** Die ursprüngliche, detaillierte Struktur der `alignment_demo`-Funktion mit Beschreibungen für Quelle, Feldkategorie, Kurzbeschreibung und Aufgabe/Funktion pro Spalte wurde re-integriert.
- **Erweiterung für neue Spalten:** Die Dokumentation in `alignment_demo` wurde um die neu hinzugekommenen Spalten AR ("Website Rohtext") bis AY ("SerpAPI Wiki Search Timestamp") ergänzt, inklusive detaillierter Beschreibungen ihrer Herkunft und Funktion.
- **Inhaltliche Anpassungen:** Bestehende Beschreibungen in der `alignment_demo` (insbesondere für Spalten wie V, S) wurden präzisiert, um die aktuelle Code-Logik und die Bedeutung von Statuswerten (z.B. "?") widerzuspiegeln.
- **Konsistenz mit `COLUMN_MAP`:** Sichergestellt, dass die `alignment_demo` alle 51 Spalten abdeckt, die in der aktuellen `COLUMN_MAP`-Konstante definiert sind.
- **Vorbereitung für Modularisierung:** Die `alignment_demo` unterstreicht die Notwendigkeit einer klaren Spaltendefinition, die bei einer zukünftigen Aufteilung des Codes in Module essenziell ist.

**Ziel:**
- Eine klare, aktuelle und umfassende Dokumentation der Spaltenstruktur direkt im Google Sheet über die `alignment_demo`-Funktion.
- Schaffung einer verbindlichen Referenz für die weitere Entwicklung und das Verständnis der Datenverarbeitungsschritte.
This commit is contained in:
2025-05-10 07:47:51 +00:00
parent e5ca7775a7
commit 163dc7d220

View File

@@ -2415,52 +2415,183 @@ def is_valid_wikipedia_article_url(url_to_check, lang=None):
# GLOBALE HELPER FUNCTIONS (PART 12: Alignment Demo Function)
# ==============================================================================
# --- Alignment Demo (Header schreiben) ---
# Basierend auf alignment_demo aus Teil 10. Bleibt global, da es direkt das gspread sheet Objekt verwendet.
# Nutzt globale Helfer: COLUMN_MAP, Config.VERSION, logger, traceback.
def alignment_demo(sheet):
# Annahme: Als globale Funktion, wie ursprünglich von Ihnen gezeigt.
# Wenn sie in DataProcessor ist, ändern Sie `sheet` zu `self.sheet_handler.sheet`
# und fügen `self` als erstes Argument der Methode hinzu.
def alignment_demo(sheet): # Behält Argument bei, falls global
"""
Schreibt die vordefinierte Header-Struktur (Zeilen 1-5) ins angegebene Google Sheet.
Dies dient als "Alignment" der Spalten und zur Dokumentation im Sheet selbst.
Args:
sheet (gspread.Worksheet): Das Worksheet-Objekt zum Schreiben der Header.
"""
# Verwenden Sie logger, da das Logging jetzt konfiguriert ist
logger = logging.getLogger(__name__) # <<< DIESE ZEILE HINZUFÜGEN
# Stellen Sie sicher, dass COLUMN_MAP die hoechstbenuetigte Spalte AY (Index 50) enthaelt.
# Diese Funktion nimmt an, dass COLUMN_MAP komplett und korrekt ist.
# Die Listen unten muessen exakt die gleiche Laenge haben wie COLUMN_MAP.
logger = logging.getLogger(__name__) # Logger holen
# Header-Texte fuer die ersten 5 Zeilen
# Die Reihenfolge der Spalten muss EXACT mit der Reihenfolge der Schluessel in COLUMN_MAP uebereinstimmen.
# Zaehlen Sie die Eintraege: ReEval Flag (Index 0) bis SerpAPI Wiki Search Timestamp (Index 50) = 51 Spalten (Index 0-50).
# Ueberpruefen Sie, dass jede Liste unten 51 Eintraege hat.
# Die Reihenfolge der Spalten muss EXAKT mit der Reihenfolge der Schluessel in COLUMN_MAP uebereinstimmen.
# Aktuell 51 Spalten (Index 0-50, A-AY).
new_headers = [
# Zeile 1: Spaltenname (Muss mit COLUMN_MAP Schluesseln uebereinstimmen, falls dynamisch genutzt)
["ReEval Flag", "CRM Name", "CRM Kurzform", "CRM Website", "CRM Ort", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL", "Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Chat Wiki Konsistenzpruefung", "Chat Begruendung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begruendung bei Abweichung", "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begruendung Abweichung Branche", "Chat Pruefung FSM Relevanz", "Chat Begruendung fuer FSM Relevanz", "Chat Schaetzung Anzahl Mitarbeiter", "Chat Konsistenzpruefung Mitarbeiterzahl", "Chat Begruendung Abweichung Mitarbeiterzahl", "Chat Einschaetzung Anzahl Servicetechniker", "Chat Begruendung Abweichung Anzahl Servicetechniker", "Chat Schaetzung Umsatz", "Chat Begruendung Abweichung Umsatz", "Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden", "Contact Search Timestamp", "Wikipedia Timestamp", "Timestamp letzte Pruefung", "Version", "Tokens", "Website Rohtext", "Website Zusammenfassung", "Website Scrape Timestamp", "Geschaetzter Techniker Bucket", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)", "Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp"],
# Zeile 2: Quelle der Daten
["CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "Chat GPT API", "LinkedIn (ueber SerpApi)", "LinkedIn (ueber SerpApi)", "LinkedIn (ueber SerpApi)", "LinkedIn (ueber SerpApi)", "System", "System", "System", "System", "System", "Web Scraper", "Chat GPT API", "System", "ML Modell / Skript", "Skript (Wiki/CRM)", "Skript (Wiki/CRM)", "System", "System"],
# Zeile 3: Feldkategorie
["Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL", "Wikipedia Artikel", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)", "Verifizierung", "Begruendung bei Abweichung", "Wikipedia Artikel", "Wikipedia Artikel", "Branche", "Branche", "Branche", "FSM Relevanz", "FSM Relevanz", "Anzahl Mitarbeiter", "Anzahl Mitarbeiter", "Anzahl Mitarbeiter", "Anzahl Servicetechniker", "Anzahl Servicetechniker", "Umsatz", "Umsatz", "Kontakte zur Firma", "Kontakte zur Firma", "Kontakte zur Firma", "Kontakte zur Firma", "Timestamp", "Timestamp", "Timestamp", "Version des Skripts die verwendet wurde", "ChatGPT Tokens", "Website-Content", "Website Zusammenfassung", "Timestamp", "Anzahl Servicetechniker Bucket", "Umsatz", "Anzahl Mitarbeiter", "Timestamp", "Timestamp"],
# Zeile 4: Kurze Beschreibung
["Systemspalte...", "Enthaehlt den Firmennamen...", "Manuell gepflegte Kurzform...", "Website des Unternehmens.", "Ort des Unternehmens.", "Kurze Beschreibung...", "Aktuelle Branchenzuweisung...", "Externe Branchenbeschreibung...", "Recherchierte Anzahl...", "Umsatz in Mio. € (CRM).", "Anzahl Mitarbeiter (CRM).", "Vorgeschlagene Wikipedia URL...", "Wikipedia URL...", "Erster Absatz...", "Wikipedia-Branche...", "Wikipedia-Umsatz...", "Wikipedia-Mitarbeiterzahl...", "Liste der Wikipedia-Kategorien.", "\"OK\" oder \"X\" Ergebnis...", "Begruendung bei Inkonsistenz...", "Chat-Vorschlag Wiki Artikel...", "Nicht genutzt...", "Branchenvorschlag ueber ChatGPT...", "Vergleich: Uebereinstimmung CRM vs. ...", "Begruendung bei abweichender...", "FSM-Relevanz: Bewertung...", "Begruendung zur FSM-Bewertung.", "Schaetzung Anzahl Mitarbeiter...", "Vergleich CRM vs. Wiki vs. ...", "Begruendung bei Mitarbeiterabweichung...", "Schaetzung Servicetechniker...", "Begruendung bei Abweichung...", "Schaetzung Umsatz ueber ChatGPT.", "Begruendung bei Umsatzabweichung.", "Anzahl Kontakte (Serviceleiter)...", "Anzahl Kontakte (IT-Leiter)...", "Anzahl Kontakte (Management)...", "Anzahl Kontakte (Disponent)...", "Timestamp der Kontaktsuche.", "Timestamp der Wikipedia-Suche/Extraktion.", "Timestamp der ChatGPT-Bewertung / Letzte Pruefung der Zeile.", "Ausgabe der Skriptversion...", "Token-Zaehlung...", "Roh extrahierter Text...", "Zusammenfassung des Webseiteninhalts...", "Timestamp des letzten Website-Scrapings (AR, AS).", "Ergebnis der Schaetzung durch das trainierte ML-Modell.", "Konsolidierter Umsatz (Mio €) nach Prioritaet Wiki > CRM.", "Konsolidierte Mitarbeiterzahl nach Prioritaet Wiki > CRM.", "Timestamp der letzten Wiki-Verifikation (Spalten S-U).", "Timestamp der letzten SerpAPI-Suche nach fehlender Wiki-URL (Modus find_wiki_serp)."]
# Zeile 5: Aufgabe / Funktion
# Stellen Sie sicher, dass die Spaltenreihenfolge hier mit den anderen Zeilen uebereinstimmt!
# Dies ist die laengste Zeile und kann schwierig zu pflegen sein.
# Zaehlen Sie die Eintraege sorgfaeltig (51 Eintraege).
,["Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Datenquelle", "Wird durch Wikipedia Scraper bereitgestellt", "Wird zunaechst nicht verwendet...", "Wird u.a. zur finalen Ermittlung...", "Wird u.a. mit CRM-Umsatz...", "Wird u.a. mit CRM-Anzahl...", "Wenn Website-Daten fehlen...", "\"Es soll durch ChatGPT geprueft werden...", "\"Liegt eine Inkonsistenz...", "\"Sollte durch die Wikipedia-Suche...", "XXX derzeit nicht verwendet...", "\"ChatGPT soll anhand der vorliegenden...", "Die in Spalte CRM festgelegte...", "Weicht die von ChatGPT ermittelte...", "ChatGPT soll anhand der vorliegenden Daten pruefen...", "Die in 'Chat Begruendung fuer FSM Relevanz'...", "Nur wenn kein Wikipedia-Eintrag...", "Entspricht die durch ChatGPT ermittelte...", "Weicht die von ChatGPT geschaetzte...", "ChatGPT soll auf Basis oeffentlich...", "Weicht die von ChatGPT geschaetzte...", "Nur wenn kein Wikipedia-Eintrag...", "ChatGPT soll signifikante Umsatzabweichungen...", "Ueber SerpAPI wird zusammen...", "Ueber SerpAPI wird zusammen...", "Ueber SerpAPI wird zusammen...", "Ueber SerpAPI wird zusammen...", "Wenn die Kontaktsuche gestartet wird...", "Wenn die Wikipedia-Suche gestartet wird...", "Wenn die ChatGPT-Bewertung gestartet wird...", "Wird durch das System befuellt", "Wird durch tiktoken berechnet", "Wird durch Web Scraper...", "Wird durch ChatGPT API...", "Timestamp wird gesetzt, wenn Website Rohtext/Zusammenfassung geschrieben werden.", "Ergebnis der Schaetzung durch das trainierte ML-Modell.", "Vom Skript berechneter Wert, priorisiert Wiki > CRM...", "Vom Skript berechneter Wert, priorisiert Wiki > CRM...", "Timestamp wird gesetzt, wenn Wiki-Verifikation (S-U) durchgefuehrt wurde.", "Timestamp wird gesetzt, nachdem versucht wurde, eine fehlende Wiki-URL ueber SerpAPI zu finden."]
[ # Zeile 1: Spaltenname (Muss mit COLUMN_MAP Schluesseln uebereinstimmen)
"ReEval Flag", "CRM Name", "CRM Kurzform", "CRM Website", "CRM Ort", "CRM Beschreibung", "CRM Branche", "CRM Beschreibung Branche extern", "CRM Anzahl Techniker", "CRM Umsatz", "CRM Anzahl Mitarbeiter", "CRM Vorschlag Wiki URL",
"Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien",
"Chat Wiki Konsistenzpruefung", "Chat Begründung Wiki Inkonsistenz", "Chat Vorschlag Wiki Artikel", "Begründung bei Abweichung",
"Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche",
"Chat Prüfung FSM Relevanz", "Chat Begründung für FSM Relevanz",
"Chat Schätzung Anzahl Mitarbeiter", "Chat Konsistenzprüfung Mitarbeiterzahl", "Chat Begründung Abweichung Mitarbeiterzahl",
"Chat Einschätzung Anzahl Servicetechniker", "Chat Begründung Abweichung Anzahl Servicetechniker",
"Chat Schätzung Umsatz", "Chat Begründung Abweichung Umsatz",
"Linked Serviceleiter gefunden", "Linked It-Leiter gefunden", "Linked Management gefunden", "Linked Disponent gefunden",
"Contact Search Timestamp", "Wikipedia Timestamp", "Timestamp letzte Prüfung", "Version", "Tokens",
"Website Rohtext", "Website Zusammenfassung", "Website Scrape Timestamp",
"Geschaetzter Techniker Bucket", "Finaler Umsatz (Wiki>CRM)", "Finaler Mitarbeiter (Wiki>CRM)",
"Wiki Verif. Timestamp", "SerpAPI Wiki Search Timestamp"
],
[ # Zeile 2: Quelle der Daten
"CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM", "CRM",
"Wikipediascraper/SerpAPI/ChatGPT/Manuell", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper", "Wikipediascraper",
"ChatGPT API", "ChatGPT API", "ChatGPT API", "System/Manuell",
"ChatGPT API", "System/ChatGPT API", "ChatGPT API",
"ChatGPT API", "ChatGPT API",
"ChatGPT API", "System/ChatGPT API", "ChatGPT API",
"ChatGPT API", "ChatGPT API",
"ChatGPT API", "ChatGPT API",
"LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)", "LinkedIn (via SerpApi)",
"System", "System", "System", "System", "System",
"Web Scraper", "ChatGPT API", "System",
"ML Modell / Skript", "Skript (Wiki/CRM Logik)", "Skript (Wiki/CRM Logik)",
"System", "System"
],
[ # Zeile 3: Feldkategorie
"Prozess", "Firmenname", "Firmenname", "Website", "Ort", "Beschreibung (Text)", "Branche", "Branche", "Anzahl Servicetechniker", "Umsatz", "Anzahl Mitarbeiter", "Wikipedia Artikel URL",
"Wikipedia Artikel URL", "Beschreibung (Text)", "Branche", "Umsatz", "Anzahl Mitarbeiter", "Kategorien (Text)",
"Verifizierung Wiki-Artikel", "Begründung Verifizierung", "Wikipedia Artikel URL (Vorschlag)", "Begründung URL-Abweichung",
"Branche (Vorschlag KI)", "Branche (Konsistenz)", "Branche (Begründung KI)",
"FSM Relevanz (KI)", "FSM Relevanz (Begründung KI)",
"Anzahl Mitarbeiter (KI)", "Anzahl Mitarbeiter (Konsistenz KI)", "Anzahl Mitarbeiter (Begründung KI)",
"Anzahl Servicetechniker (KI)", "Anzahl Servicetechniker (Begründung KI)",
"Umsatz (KI)", "Umsatz (Begründung KI)",
"Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)", "Kontakte (Anzahl)",
"Timestamp", "Timestamp", "Timestamp", "Skript Version", "API Tokens",
"Website-Content", "Website-Content (Zusammenfassung)", "Timestamp",
"Anzahl Servicetechniker (Bucket ML)", "Umsatz (Konsolidiert)", "Anzahl Mitarbeiter (Konsolidiert)",
"Timestamp", "Timestamp"
],
[ # Zeile 4: Kurze Beschreibung
"Systemspalte, irrelevant für den Prompt. Wird genutzt um die manuelle Neuprüfung dieses Accounts durchzuführen ('x' setzen).",
"Enthält den Firmennamen nach bestem Gewissen. Firmennamen sind manchmal herausfordernd, insbesondere was unterschiedliche Schreibweisen, Firmierung, Tochter/Mutterfirmen etc. anbelangt. Zur besseren Trefferquote in der Wikipedia-Suche normalisieren wir den Firmennamen und entfernen sämtliche Firmenformen, wie z.B. AG, GmbH, SE etc.",
"Enthält eine manuell gepflegte (normalisierte) Kurzform des Firmennamens, wie auch ein Mensch die Firma nennen würde. Dies bedeutet insbesondere, dass die Firmenform wie z.B. GmbH oder AG aus dem Namen entfernt wird. Meist entspricht die Kurzform den ersten beiden Worten des Firmennamens. Manchmal sind auch Worte nötig, wenn die ersten beiden worte zu wenig Aussagekraft haben. Beispiele dafür sind beispielsweise Firmen wie 'Schmidt & Söhne', bei denen 'Schmidt &' wenig Sinn machen würde, oder 'Philip Morris Tabakwaren' - weil in diesem Fall 'Philip Morris' zu generisch wäre bzw. wenig eindeutig.",
"Von uns ermittelte Website des Unternehmens, sofern verfügbar. Kann durch Modi 'website_lookup' oder 'check_urls' aktualisiert werden.",
"Von uns ermittelter Ort des Unternehmens.",
"Kurze Beschreibung des Unternehmens aus CRM.",
"Aktuelle Branchenzuweisung entsprechend unserem Ziel-Branchenschema (manuell oder aus Altsystem).",
"Von Dealfront gelieferte externe Beschreibung der Branche. Diese Branchenbeschreibung sollte in den allermeisten Fällen sehr zutreffend sein und ist vermutlich verlässlicher als die aktuelle Branche aus Spalte G.",
"Von uns Recherchierte Anzahl der Servicetechniker. Diese ist in den meisten Fällen korrekt. Dieser Wert gilt als guter Lernwert um zu verstehen, wie ein Unternehmen aussieht, das viele bzw. wenige Techniker hat. Dies ist je nach Branche und Art des Unternehmens unterschiedlich. Es gibt Unternehmen, die hauptsächlich auf die Produktion fokussiert sind, bei denen Service nur einen kleinen Anteil am Geschäft ausmacht und wiederum andere Unternehmen, die fast nur von Kundenservice leben (z.B. Dienstleister). Es gibt allerdings keine 100% verlässliche Faustformel. Das System soll später seine eigene Schätzung mit den von uns recherchierten Werten vergleichen, um dadurch selbst zu lernen Unternehmen besser einzuschätzen.",
"Von uns recherchierter Umsatz in Mio. € (aus CRM).",
"Von uns recherchierte Anzahl der Mitarbeiter (aus CRM).",
"Enthält aus einer alten Recherche Vorschläge für die Wikipedia URL zum Unternehmen. Dieser muss aber nicht stimmen. Sollte als Ausgangs- und Vergleichspunkt für die nachgelagerte Wikipedia-Suche dienen. Der Wert soll mit den üblichen Methoden geprüft werden z.B. kommt die normalisierte Website vor, Ähnlichkeitsprüfung des Firmennamens mit dem Artikelnamen von Wikipedia etc.",
"Finale Wikipedia URL des Unternehmens. Quelle: Wikipedia-Scraper (Suche/Extraktion), SerpAPI (Neusuche), ChatGPT (Vorschlag U nach Prüfung), oder manuelle Eingabe.",
"Erster aussagekräftiger Absatz des Wikipedia-Artikels (M).",
"Aus der Wikipedia-Infobox extrahierte Branche(n).",
"Aus der Wikipedia-Infobox extrahierter Umsatz (normalisiert in Mio. €).",
"Aus der Wikipedia-Infobox extrahierte Mitarbeiterzahl (normalisiert).",
"Komma-separierte Liste der Kategorien, denen der Artikel in Wikipedia zugewiesen wurde. Hier ist auch häufig eine Branche enthalten, häufig auch noch weitere Informationen etwa zur Gründung, ob sie etwa im DAX gelistet ist etc. Guter Anhaltspunkt zur Differenzierung von Unternehmenseinträgen und Wikipedia-Seiten, die kein Unternehmen beschreiben und fälschlicherweise zugewiesen wurden. Bei jeder Unternehmensseite MUSS das Wort unternehmen in irgendeiner Art und Weise vorkommen. NEGATIVSIGNAL: EHEMALIGES UNTERNEHMEN -> Weist darauf hin, dass das Unternehmen nicht mehr besteht.",
"Ergebnis der ChatGPT-Prüfung, ob der Wiki-Artikel (M) zum Unternehmen passt. Mögliche Werte: 'OK', 'X', '?' (Verifizierung ausstehend/erneut nötig), 'X (URL Copied)', 'X (Invalid Suggestion)', 'FEHLER'.",
"Von ChatGPT generierte Begründung, falls der Wiki-Artikel (M) als inkonsistent zum Unternehmen bewertet wurde.",
"Von ChatGPT vorgeschlagene alternative Wikipedia-URL, falls der Artikel in M als unpassend bewertet wurde. Kann auch 'Kein passender Artikel gefunden' enthalten.",
"Wird derzeit primär geleert bei Wiki-Updates/-Verifizierung. Ursprünglich gedacht für Begründung bei Abweichung CRM-Vorschlag-URL (L) vs. gefundener Wiki-URL (M).",
"Branchenvorschlag von ChatGPT basierend auf allen verfügbaren Informationen (CRM, Wiki, Website), abgeglichen mit dem Ziel-Branchenschema.",
"Konsistenzprüfung: 'ok', wenn ChatGPT-Vorschlag (W) mit der extrahierten CRM-Kurzform (aus G) übereinstimmt; 'X' bei Abweichung; oder spezifischer Status bei Fallback-Logik in `evaluate_branche_chatgpt`.",
"Von ChatGPT generierte Begründung für den Branchenvorschlag (W) und ggf. für die Abweichung zur CRM-Branche.",
"Bewertung der FSM-Relevanz durch ChatGPT (z.B. 'Ja', 'Nein', 'Vielleicht'). Platzhalter für zukünftige Implementierung.",
"Von ChatGPT generierte Begründung für die Einschätzung der FSM-Relevanz. Platzhalter.",
"Von ChatGPT geschätzte Anzahl der Mitarbeiter. Platzhalter für zukünftige Implementierung.",
"Konsistenzprüfung der von ChatGPT geschätzten Mitarbeiterzahl (AB) mit CRM (K) und Wiki (Q) Werten. Platzhalter.",
"Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Mitarbeiterzahl. Platzhalter.",
"Von ChatGPT geschätzte Anzahl der Servicetechniker (als Bucket oder konkrete Zahl). Platzhalter für zukünftige Implementierung.",
"Von ChatGPT generierte Begründung für die Einschätzung der Servicetechniker-Anzahl, insbesondere bei Abweichung zu CRM (I). Platzhalter.",
"Von ChatGPT geschätzter Umsatz. Platzhalter für zukünftige Implementierung.",
"Von ChatGPT generierte Begründung bei signifikanter Abweichung der geschätzten Umsatzzahlen. Platzhalter.",
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Serviceleiter'.",
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'IT-Leiter'.",
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Management'.",
"Anzahl der via SerpAPI gefundenen LinkedIn-Kontakte für die Kategorie 'Disponent'.",
"Zeitstempel der letzten Kontaktsuche via SerpAPI für diese Zeile.",
"Zeitstempel der letzten Wikipedia-Suche und Datenextraktion für diese Zeile.",
"Zeitstempel der letzten übergreifenden Prüfung/Bewertung durch ChatGPT (z.B. Branchenevaluation).",
"Version des Skripts, die diese Zeile zuletzt signifikant bearbeitet hat.",
"Geschätzte oder gezählte Anzahl der Tokens, die für OpenAI API-Aufrufe für diese Zeile verbraucht wurden (kumulativ oder letzter Call).",
"Roh extrahierter, unformatierter Textinhalt des Haupt-Content-Bereichs der Unternehmenswebsite (nach Entfernung von Bannern, Skripten, Styles). Dient als Basis für die KI-Zusammenfassung. Kann auch Fehlermeldungen enthalten (z.B. \"k.A. (Timeout)\", \"URL_CHECK_NEEDED\").",
"KI-generierte, prägnante Zusammenfassung des Website-Rohtextes (AR). Fokus auf Haupttätigkeit, Produkte/Dienstleistungen, Zielgruppe.",
"Zeitstempel des letzten Versuchs, die Website zu scrapen und den Rohtext (AR) sowie die Zusammenfassung (AS) zu generieren.",
"Ergebnis der Schätzung durch das trainierte Machine-Learning-Modell. Gibt den wahrscheinlichsten Bucket für die Anzahl der Servicetechniker an.",
"Konsolidierter Umsatzwert in Mio. €. Priorisiert den Wert aus Wikipedia (P), falls vorhanden und numerisch, ansonsten den Wert aus CRM (J).",
"Konsolidierte Mitarbeiterzahl. Priorisiert den Wert aus Wikipedia (Q), falls vorhanden und numerisch, ansonsten den Wert aus CRM (K).",
"Zeitstempel der letzten Wikipedia-Artikel-Verifizierung durch ChatGPT (Spalten S-U).",
"Zeitstempel des letzten Versuchs, eine fehlende Wikipedia-URL (M) über SerpAPI zu suchen (Modi `find_wiki_serp` oder `check_urls`)."
],
[ # Zeile 5: Aufgabe / Funktion
"Datenquelle/Prozesssteuerung: 'x' markiert Zeile für Re-Evaluation in Modus 'reeval'.",
"Datenquelle: Firmenname aus CRM.",
"Datenquelle: Manuell gepflegte Kurzform des Firmennamens, primär für API-Suchen (LinkedIn, SerpAPI) genutzt.",
"Datenquelle/Ziel: Website des Unternehmens. Kann durch 'website_lookup' oder 'check_urls' aktualisiert werden.",
"Datenquelle: Ort des Unternehmens aus CRM.",
"Datenquelle: Beschreibung aus CRM. Input für KI-Analysen.",
"Datenquelle: Branchenkategorie aus CRM. Referenz für KI-Branchenbewertung.",
"Datenquelle: Externe Branchenbeschreibung (z.B. Dealfront). Input für KI-Branchenbewertung.",
"Datenquelle: Recherchierte Anzahl Servicetechniker. Dient als Ground Truth für ML-Training und Validierung der KI-Schätzung.",
"Datenquelle: Umsatz aus CRM. Input für Konsolidierung und ML.",
"Datenquelle: Mitarbeiterzahl aus CRM. Input für Konsolidierung und ML.",
"Datenquelle: Alte/vorgeschlagene Wiki-URL aus CRM. Dient als initialer Input für Wiki-Prozess.",
"Ziel/Quelle: Finale, als relevant erachtete Wikipedia-URL. Wird von verschiedenen Modi befüllt/genutzt.",
"Quelle: Erster Absatz des Wikipedia-Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung.",
"Quelle: Aus Wikipedia-Infobox extrahierte Branche(n). Input für KI-Branchenbewertung.",
"Quelle: Aus Wikipedia-Infobox extrahierter Umsatz. Input für Konsolidierung und ML.",
"Quelle: Aus Wikipedia-Infobox extrahierte Mitarbeiterzahl. Input für Konsolidierung und ML.",
"Quelle: Wikipedia-Kategorien des Artikels (M). Input für KI-Analysen, z.B. Wiki-Verifizierung und Branchenbewertung.",
"Ziel: Ergebnis der ChatGPT-Konsistenzprüfung für Wiki-Artikel (M). Status '?' triggert erneute Prüfung im Modus 'wiki_verify'.",
"Ziel: Begründung von ChatGPT, falls Wiki-Artikel (M) als inkonsistent bewertet wurde.",
"Ziel: Von ChatGPT vorgeschlagene alternative Wiki-URL. Wird von Modus 'update_wiki_suggestions' verarbeitet.",
"Ziel/Info: Wird aktuell primär geleert. Könnte für detaillierte Begründungen bei URL-Abweichungen (z.B. CRM-Vorschlag vs. finaler URL) genutzt werden.",
"Ziel: Von ChatGPT final vorgeschlagene Branche gemäß Zielschema. Hauptziel der Branchenklassifizierung.",
"Ziel: Ergebnis des Abgleichs zwischen KI-Branchenvorschlag (W) und CRM-Branche (G).",
"Ziel: Von ChatGPT generierte Begründung für den Branchenvorschlag (W).",
"Ziel: Ergebnis der FSM-Relevanzprüfung durch ChatGPT. (Platzhalter)",
"Ziel: Begründung von ChatGPT für die FSM-Relevanz. (Platzhalter)",
"Ziel: Von ChatGPT geschätzte Mitarbeiterzahl. (Platzhalter)",
"Ziel: Konsistenzprüfung der KI-Mitarbeiterschätzung. (Platzhalter)",
"Ziel: Begründung von ChatGPT bei Abweichung der Mitarbeiterschätzung. (Platzhalter)",
"Ziel: Von ChatGPT geschätzte Anzahl Servicetechniker. (Platzhalter)",
"Ziel: Begründung von ChatGPT bei Abweichung der Technikerzahl-Schätzung. (Platzhalter)",
"Ziel: Von ChatGPT geschätzter Umsatz. (Platzhalter)",
"Ziel: Begründung von ChatGPT bei Abweichung der Umsatzschätzung. (Platzhalter)",
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Serviceleiter) via SerpAPI.",
"Ziel: Anzahl gefundener LinkedIn-Kontakte (IT-Leiter) via SerpAPI.",
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Management) via SerpAPI.",
"Ziel: Anzahl gefundener LinkedIn-Kontakte (Disponent) via SerpAPI.",
"System: Timestamp der letzten Kontaktsuche (Modus 'contacts'). Steuert Wiederholung.",
"System: Timestamp der letzten Wikipedia-Suche/Extraktion (Modi 'wiki', 'full_run', 'reeval', 'wiki_reextract_missing_an'). Steuert Wiederholung.",
"System: Timestamp der letzten übergreifenden ChatGPT-Evaluation (Modi 'chat', 'full_run', 'reeval', 'branch_eval'). Steuert Wiederholung.",
"System: Skriptversion, die die Zeile zuletzt signifikant bearbeitet hat.",
"System: Verbrauchte Tokens für OpenAI-Aufrufe für diese Zeile. (Implementierung ausstehend)",
"Ziel: Rohtext der Website. Input für Zusammenfassung (AS).",
"Ziel: KI-generierte Zusammenfassung des Website-Rohtextes (AR). Input für Branchenbewertung (W).",
"System: Timestamp des letzten Website-Scraping/Summarization-Versuchs. Steuert Wiederholung.",
"Ziel: Vom ML-Modell vorhergesagter Bucket für die Anzahl der Servicetechniker.",
"Ziel: Konsolidierter Umsatz (Wiki-Wert > CRM-Wert). Input für ML-Modell.",
"Ziel: Konsolidierte Mitarbeiterzahl (Wiki-Wert > CRM-Wert). Input für ML-Modell.",
"System: Timestamp der letzten Wiki-Verifizierung durch ChatGPT (Modus 'wiki_verify'). Steuert Wiederholung.",
"System: Timestamp der letzten SerpAPI-Suche nach einer fehlenden Wiki-URL (Modi 'find_wiki_serp', 'check_urls'). Steuert Wiederholung."
]
]
# Stellen Sie sicher, dass die Anzahl der Spalten in allen Header-Zeilen gleich ist
num_cols = len(new_headers[0])
if not all(len(row) == num_cols for row in new_headers):
# Logge einen kritischen Fehler, aber versuche trotzdem zu schreiben
logger.critical(f"FEHLER in alignment_demo: Die Anzahl der Spalten in den Header-Zeilen ist nicht konsistent! Erwartet {num_cols} pro Zeile.")
# Finden Sie die maximale Anzahl Spalten, um den Bereich zu bestimmen, falls inkonsistent
num_cols = max(len(row) for row in new_headers)
logger.critical(f"FEHLER in alignment_demo: Die Anzahl der Spalten in den Header-Zeilen ist nicht konsistent! Erwartet {num_cols} Spalten pro Zeile, aber Längen sind: {[len(row) for row in new_headers]}.")
# Finden Sie die maximale Anzahl Spalten, um den Bereich zumindest grob zu bestimmen, falls inkonsistent
num_cols = max(len(row) for row in new_headers) if new_headers else 0
if num_cols == 0:
logger.error("FEHLER: Konnte keine Spaltenanzahl für Alignment-Demo Header bestimmen.")
return
# Hilfsfunktion zum Konvertieren des 1-basierten Spaltenindex in Buchstaben (A, B, AA, ...)
def colnum_string(n):
@@ -2476,15 +2607,10 @@ def alignment_demo(sheet):
logger.info(f"Schreibe Alignment-Demo Header in Bereich {header_range}...")
try:
# Fuehren Sie das Update durch
# sheet.update direkt ist einfacher fuer einen einzelnen grossen Bereich.
# value_input_option='USER_ENTERED' stellt sicher, dass Werte wie sie sind eingetragen werden.
sheet.update(values=new_headers, range_name=header_range, value_input_option='USER_ENTERED')
logger.info(f"Alignment-Demo Header erfolgreich geschrieben in Bereich {header_range}.")
except Exception as e:
# Fange Fehler beim Schreiben ab und logge sie
logger.error(f"FEHLER beim Schreiben der Alignment-Demo Header in Bereich {header_range}: {e}")
# Logge den Traceback fuer detaillierte Fehlerinformationen
logger.debug(traceback.format_exc())