Refactor(data_processor): Remove obsolete version of process_verification_batch
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user