From 560320e273345d933bd35d0eefd237250bdad123 Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 7 Nov 2025 11:21:57 +0100 Subject: [PATCH] Refactor(data_processor): Remove obsolete version of process_verification_batch --- data_processor.py | 194 ---------------------------------------------- 1 file changed, 194 deletions(-) diff --git a/data_processor.py b/data_processor.py index 4df0266a..5ea47606 100644 --- a/data_processor.py +++ b/data_processor.py @@ -1622,200 +1622,6 @@ class DataProcessor: answers[row_num] = "FEHLER: Antwort nicht geparst" return answers - def process_verification_batch( - self, - start_sheet_row=None, - end_sheet_row=None, - limit=None): - """ - Batch-Prozess nur fuer Wikipedia-Verifizierung. - """ - self.logger.info( - f"Starte Wikipedia-Verifizierungsmodus (Batch). Bereich: {start_sheet_row if start_sheet_row else 'Start'}-{end_sheet_row if end_sheet_row else 'Ende'}, Limit: {limit if limit else 'Unbegrenzt'}") - - if start_sheet_row is None: - start_data_index = self.sheet_handler.get_start_row_index( - check_column_key="Wiki Verif. Timestamp") - if start_data_index == -1: - return - start_sheet_row = start_data_index + self.sheet_handler._header_rows + 1 - else: - if not self.sheet_handler.load_data(): - return - - all_data = self.sheet_handler.get_all_data_with_headers() - header_rows = self.sheet_handler._header_rows - total_sheet_rows = len(all_data) - if end_sheet_row is None: - end_sheet_row = total_sheet_rows - if start_sheet_row > end_sheet_row or start_sheet_row > total_sheet_rows: - return - - # ... (Implementation of task collection, batching, and updating remains similar to the original code) ... - # This is a simplified placeholder as the logic is very long and - # already captured in the original file. - """ - Verarbeitet einen Batch von Wikipedia-Verifizierungsanfragen ueber OpenAI. - Sammelt die Ergebnisse und gibt sie zurueck. Aktualisiert NICHT das Sheet direkt. - - Args: - batch_data (list): Liste von Dictionaries, jedes enthaelt: - {'row_num': int, 'company_name': str, 'crm_desc': str, - 'wiki_url': str, 'wiki_paragraph': str, 'wiki_categories': str} - - Returns: - dict: Ein Dictionary, das Zeilennummern auf die rohe ChatGPT-Antwort mappt. - z.B. {2122: "OK", 2123: "X | ..."} - Bei Fehlern oder fehlenden Antworten wird ein Fehlerstring verwendet. - Wirft Exception bei endgueltigen API-Fehlern nach Retries. - """ - # Verwenden Sie logger, da das Logging jetzt konfiguriert ist - if not batch_data: - return {} # Gebe leeres Dictionary zurueck, wenn keine Tasks da sind - - self.logger.debug( - f"Sende OpenAI-Batch fuer Wiki-Verifizierung ({len(batch_data)} Zeilen, Start: {batch_data[0]['row_num'] if batch_data else 'N/A'})...") # <<< GEÄNDERT - - # --- Prompt Erstellung --- - # Verwenden Sie klare Anweisungen und das definierte Antwortformat. - # Vermeiden Sie Umlaute im Prompt, um Encoding-Probleme zu minimieren. - aggregated_prompt = ( - "Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln fuer Unternehmen. " - "Fuer jeden der folgenden Eintraege pruefe, ob der vorhandene Wikipedia-Artikel (URL, Absatz, Kategorien) plausibel zum Firmennamen und zur Beschreibung passt. " - "Gib das Ergebnis fuer jeden Eintrag ausschliesslich im folgenden Format auf einer neuen Zeile aus:\n" - "Eintrag : \n\n" - "Moegliche Antworten:\n" - "- 'OK' (wenn der Artikel gut passt)\n" - "- 'X | Alternativer Artikel: | Begruendung: ' (wenn der Artikel nicht passt, aber ein besserer gefunden wurde)\n" - "- 'X | Kein passender Artikel gefunden | Begruendung: ' (wenn der Artikel nicht passt und kein besserer gefunden wurde)\n" - # Der Fall "Kein Wikipedia-Eintrag vorhanden" wird vom Skript VOR diesem Call behandelt - # und sollte hier nicht vom KI-Modell generiert werden. - "Stelle sicher, dass du nur EINE Zeile pro Eintrag im Format 'Eintrag X: Antwort' ausgibst.\n\n" - "Eintraege zur Pruefung:\n" - "--------------------\n" - ) - - # Fuegen Sie die Daten fuer jeden Eintrag im Batch hinzu. - # Kuerzen Sie die Beschreibungen und Kategorien, um das Prompt-Limit zu reduzieren. - # Stellen Sie sicher, dass die Werte Strings sind und "k.A." richtig - # behandelt wird. - max_desc_length = 200 # Maximale Laenge fuer Beschreibungsteile im Prompt - for item in batch_data: - row_num = item['row_num'] - # Holen und Kuerzen Sie die Werte sicher. Ersetzen Sie None durch - # "k.A.". - company_name = str(item.get('company_name', 'k.A.')) - crm_desc = str(item.get('crm_desc', 'k.A.')) - wiki_url = str(item.get('wiki_url', 'k.A.')) - wiki_paragraph = str(item.get('wiki_paragraph', 'k.A.')) - wiki_categories = str(item.get('wiki_categories', 'k.A.')) - - # Kuerzen Sie die Laengen und fuegen Sie "..." hinzu, wenn gekuerzt - # wurde. - crm_desc_short = crm_desc[:max_desc_length] + \ - '...' if len(crm_desc) > max_desc_length else crm_desc - wiki_paragraph_short = wiki_paragraph[:max_desc_length] + '...' if len( - wiki_paragraph) > max_desc_length else wiki_paragraph - wiki_categories_short = wiki_categories[:max_desc_length] + '...' if len( - wiki_categories) > max_desc_length else wiki_categories - - entry_text = ( - f"Eintrag {row_num}:\n" - f" Firmenname: {company_name}\n" - f" CRM-Beschreibung: {crm_desc_short}\n" - f" Wikipedia-URL: {wiki_url}\n" - f" Wiki-Absatz: {wiki_paragraph_short}\n" - f" Wiki-Kategorien: {wiki_categories_short}\n" - f"----\n" - ) - aggregated_prompt += entry_text - - # Fuegen Sie den Abschluss des Prompts hinzu. - aggregated_prompt += "--------------------\nBitte nur die 'Eintrag X: Antwort'-Zeilen ausgeben." - - # Optional: Token zaehlen fuer den Prompt. - # try: prompt_tokens = token_count(aggregated_prompt, model=getattr(Config, 'TOKEN_MODEL', 'gpt-3.5-turbo')); self.logger.debug(f"Geschaetzt Prompt-Tokens fuer Batch: {prompt_tokens}."); - # except Exception as e_tc: self.logger.debug(f"Fehler beim - # Token-Zaehlen: {e_tc}"); - - # --- ChatGPT Aufruf --- - # call_openai_chat (Block 8) nutzt den retry_on_failure Decorator und wirft bei endgueltigem Fehler eine Exception. - # Der retry_on_failure Decorator auf dieser Funktion faengt die Exception - # von call_openai_chat und fuehrt die Retries fuer die GESAMTE - # Batch-Funktion durch. - chat_response = None - try: - # Rufe die zentrale OpenAI Chat API Funktion auf (Block 8). - # Standard Temperatur 0.0 fuer Klassifizierung/Verifizierung. - chat_response = call_openai_chat( - aggregated_prompt, temperature=0.0) - # Wenn call_openai_chat erfolgreich ist, gibt es den String zurueck. - # Exceptions werden nach Retries von call_openai_chat geworfen und - # vom aeusseren retry_on_failure dieser Funktion gefangen. - - if not chat_response: - # Dieser Fall sollte nach der Aenderung in call_openai_chat - # (wirft Exception) nicht mehr auftreten. - self.logger.error( - "call_openai_chat gab unerwarteterweise None zurueck fuer Wiki-Verifizierungs-Batch.") # <<< GEÄNDERT - # Werfen Sie eine spezifische Exception, damit der aeussere - # Decorator sie faengt. - raise openai.error.APIError( - "Keine Antwort von OpenAI erhalten fuer Wiki-Verifizierungs-Batch.") - - except Exception as e: - # Wenn call_openai_chat oder der aeussere retry_on_failure eine Exception wirft (nach Retries) - # Die Exception wird hier gefangen, bevor sie an den Aufrufer - # (process_verification_batch) weitergeleitet wird. - self.logger.error( - f"Endgueltiger FEHLER beim OpenAI-Batch-Aufruf fuer Wiki-Verifizierung (innerhalb Batch Decorator): {e}") # <<< GEÄNDERT - # Logge den Traceback - self.logger.debug(traceback.format_exc()) # <<< GEÄNDERT - # Geben Sie ein Dictionary zurueck, das signalisiert, dass fuer - # alle Zeilen im Batch ein Fehler aufgetreten ist - return { - item['row_num']: f"FEHLER API: {str(e)[:100]}" for item in batch_data} - - # --- Antwort parsen --- - answers = {} # Initialisieren Sie das Ergebnis-Dictionary - # Liste der Zeilennummern, die im ursprünglichen Batch angefragt wurden - original_batch_row_nums = {item['row_num'] for item in batch_data} - lines = chat_response.strip().split('\n') - parsed_count = 0 - for line in lines: - # Matcht "Eintrag :" und den Rest der Zeile - match = re.match(r"Eintrag (\d+): (.*)", line.strip()) - if match: - row_num = int(match.group(1)) - answer_text = match.group(2).strip() - # Pruefen Sie, ob die Zeilennummer im urspruenglichen Batch - # angefragt wurde - if row_num in original_batch_row_nums: - answers[row_num] = answer_text - parsed_count += 1 - # else: self.logger.debug(f"Warnung: Antwort fuer unerwartete - # Zeilennummer {row_num} im Batch erhalten: - # {answer_text[:100]}...") # Zu viel Laerm (gekuerzt loggen) - - # Logge das Ergebnis des Parsens - self.logger.debug( - f"OpenAI-Batch-Antwort geparst: {parsed_count} von {len(original_batch_row_nums)} Zeilen erfolgreich zugeordnet.") # <<< GEÄNDERT - - # Fuegen Sie einen Fehlerwert fuer Zeilen hinzu, die nicht geparst - # werden konnten (z.B. falsches Antwortformat) - if parsed_count < len(original_batch_row_nums): - self.logger.warning( - f"Nicht alle Zeilen aus dem Batch ({len(original_batch_row_nums)}) konnten in der OpenAI-Antwort ({len(lines)} Zeilen) geparst werden.") # <<< GEÄNDERT - # Logge den Anfang der unvollstaendigen Antwort auf Debug - self.logger.debug( - f"Unerwartete Antwortteile (erste 500 Zeichen): {chat_response[:500]}") # <<< GEÄNDERT - for row_num in original_batch_row_nums: - if row_num not in answers: - answers[row_num] = "FEHLER: Antwort nicht geparst" - - # Die 'answers' Dictionary enthaelt nun Ergebnisse fuer alle Zeilen, - # entweder geparst oder mit einem Fehlerstring. - return answers # Rueckgabe des Dictionarys mit Ergebnissen oder Fehlern # --- Methode fuer den Wiki-Verifizierungs-Batchmodus (AX) --- # Diese Methode koordiniert die Auswahl der Zeilen, die Batch-Verarbeitung durch OpenAI,