Refactor(data_processor): Remove obsolete version of process_verification_batch

This commit is contained in:
2025-11-07 11:21:57 +01:00
parent a4664ea5c4
commit 560320e273

View File

@@ -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 <Zeilennummer>: <Antwort>\n\n"
"Moegliche Antworten:\n"
"- 'OK' (wenn der Artikel gut passt)\n"
"- 'X | Alternativer Artikel: <URL> | Begruendung: <Kurze Begruendung>' (wenn der Artikel nicht passt, aber ein besserer gefunden wurde)\n"
"- 'X | Kein passender Artikel gefunden | Begruendung: <Kurze 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 <Zeilennummer>:" 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,