This commit is contained in:
2025-04-10 10:32:56 +00:00
parent e64ad336fe
commit d6fcc2f8c0

View File

@@ -533,21 +533,21 @@ class DataProcessor:
# ==================== NEUE FUNKTION: process_verification_only ==================== # ==================== NEUE FUNKTION: process_verification_only ====================
def process_verification_only(): def process_verification_only():
""" """
Überarbeiteter BatchProzess (Modus 51): Überarbeiteter BatchProzess (Version 1.5.7, Modus 51):
- Fragt in der Konsole ab, wie viele Zeilen insgesamt verarbeitet werden sollen. - Fragt in der Konsole ab, wie viele Zeilen insgesamt verarbeitet werden sollen.
- Alle Zeilen, bei denen Spalte AO (Index 40) nicht vorhanden oder leer ist, werden verarbeitet. - Ermittelt die Gesamtzahl der Zeilen (exkl. Header) und protokolliert diesen Wert.
- Die zu verarbeitenden Zeilen werden in Paketen der Größe Config.BATCH_SIZE (z.B. 10 Zeilen) gebündelt. - Alle Zeilen, bei denen Spalte AO (Index 40) entweder gar nicht vorhanden oder leer ist, werden verarbeitet.
- Für jedes Batch wird ein aggregierter Prompt erstellt, an ChatGPT gesendet und die aggregierte Antwort - Diese Zeilen werden in Paketen der Größe Config.BATCH_SIZE (z.B. 10 Zeilen) gebündelt.
- Für jedes Batch wird ein aggregierter Prompt erstellt, an ChatGPT gesendet und die Antwort
zeilenweise geparst. zeilenweise geparst.
- Die Ergebnisse werden in den Spalten S bis Y geschrieben: - Die Ergebnisse werden in den Spalten S bis Y geschrieben:
S: Wiki-Validierung (z.B. "OK" oder "X") S: Wiki-Validierung ("OK" oder "X")
T: Alternativer Wiki-Artikel (URL oder "Kein Wikipedia-Eintrag vorhanden.") T: Alternativer Wiki-Artikel (URL oder "Kein Wikipedia-Eintrag vorhanden.")
U: Wiki-Erklärung / Begründung U: Wiki-Erklärung / Begründung
V, W, X, Y: Platzhalter (leer) VY: Platzhalter (leer)
- Umfassendes Logging informiert über Batch, Zeilennummern, Token-Zahl etc. - Umfangreiche Log-Ausgaben unterstützen die Fehlerdiagnose.
""" """
debug_print("Starte Verifizierungsmodus (Modus 51) im Batch-Prozess...") debug_print("Starte Verifizierungsmodus (Modus 51) im Batch-Prozess (Version 1.5.7)...")
# Abfrage: Wie viele Zeilen sollen insgesamt verarbeitet werden?
try: try:
total_rows = int(input("Wie viele Zeilen sollen insgesamt bearbeitet werden? ")) total_rows = int(input("Wie viele Zeilen sollen insgesamt bearbeitet werden? "))
except Exception as e: except Exception as e:
@@ -559,24 +559,29 @@ def process_verification_only():
sh = gc.open_by_url(Config.SHEET_URL) sh = gc.open_by_url(Config.SHEET_URL)
main_sheet = sh.sheet1 main_sheet = sh.sheet1
data = main_sheet.get_all_values() data = main_sheet.get_all_values()
available_total = len(data) - 1 # ohne Header
debug_print(f"Anzahl Zeilen (exkl. Header): {available_total}")
if total_rows is not None:
available_rows = min(total_rows, available_total)
else:
available_rows = available_total
# Bestimme die Anzahl der zu verarbeitenden Zeilen (ohne Header) if available_rows <= 0:
available_rows = len(data) - 1 debug_print("Keine Zeilen zum Verarbeiten gefunden.")
if total_rows is not None and total_rows < available_rows: return
available_rows = total_rows
batch_size = Config.BATCH_SIZE # z.B. 10, einstellbar in der Config batch_size = Config.BATCH_SIZE # z. B. 10, einstellbar in der Config
batches = [] batches = []
row_numbers = [] row_numbers = []
# Verarbeite jede Zeile (Index ab 2, da Header in Zeile 1)
for i, row in enumerate(data[1:], start=2): for i, row in enumerate(data[1:], start=2):
if i > available_rows + 1: # +1 wegen Header if i > available_rows + 1:
break break
# Überspringe Zeilen, bei denen Spalte AO (Index 40) existiert und nicht leer ist. # Wenn die Zeile mindestens 41 Spalten hat und in Spalte AO (Index 40) bereits ein Wert steht, überspringe sie.
if len(row) >= 41 and row[40].strip() != "": if len(row) >= 41 and row[40].strip() != "":
debug_print(f"Zeile {i} wird übersprungen, da Spalte AO bereits gefüllt ist.")
continue continue
# Nimm diese Zeile in den Batch auf keine weiteren Bedingungen! # Aufnahme der Zeile in das aktuelle Batch (unabhängig von weiteren Bedingungen)
entry_text = ( entry_text = (
f"Eintrag {i}:\n" f"Eintrag {i}:\n"
f"Firmenname: {row[1] if len(row) > 1 else ''}\n" f"Firmenname: {row[1] if len(row) > 1 else ''}\n"
@@ -588,7 +593,6 @@ def process_verification_only():
) )
batches.append(entry_text) batches.append(entry_text)
row_numbers.append(i) row_numbers.append(i)
if len(batches) == batch_size: if len(batches) == batch_size:
aggregated_prompt = ( aggregated_prompt = (
"Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. " "Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. "
@@ -602,12 +606,10 @@ def process_verification_only():
) )
aggregated_prompt += "\n".join(batches) aggregated_prompt += "\n".join(batches)
debug_print(f"Verarbeite Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.") debug_print(f"Verarbeite Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.")
agg_token_count = "n.v."
if tiktoken: if tiktoken:
try: try:
enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL) enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL)
agg_token_count = len(enc.encode(aggregated_prompt)) debug_print(f"Token-Zahl für aktuellen Batch: {len(enc.encode(aggregated_prompt))}")
debug_print(f"Token-Zahl für aktuellen Batch: {agg_token_count}")
except Exception as e: except Exception as e:
debug_print(f"Fehler beim Token-Counting: {e}") debug_print(f"Fehler beim Token-Counting: {e}")
try: try:
@@ -663,6 +665,7 @@ def process_verification_only():
time.sleep(Config.RETRY_DELAY) time.sleep(Config.RETRY_DELAY)
batches = [] batches = []
row_numbers = [] row_numbers = []
if batches: if batches:
aggregated_prompt = ( aggregated_prompt = (
"Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. " "Du bist ein Experte in der Verifizierung von Wikipedia-Artikeln für Unternehmen. "
@@ -672,12 +675,10 @@ def process_verification_only():
) )
aggregated_prompt += "\n".join(batches) aggregated_prompt += "\n".join(batches)
debug_print(f"Verarbeite letztes Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.") debug_print(f"Verarbeite letztes Batch für Zeilen {row_numbers[0]} bis {row_numbers[-1]}.")
agg_token_count = "n.v."
if tiktoken: if tiktoken:
try: try:
enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL) enc = tiktoken.encoding_for_model(Config.TOKEN_MODEL)
agg_token_count = len(enc.encode(aggregated_prompt)) debug_print(f"Token-Zahl für letztes Batch: {len(enc.encode(aggregated_prompt))}")
debug_print(f"Token-Zahl für letztes Batch: {agg_token_count}")
except Exception as e: except Exception as e:
debug_print(f"Fehler beim Token-Counting im letzten Batch: {e}") debug_print(f"Fehler beim Token-Counting im letzten Batch: {e}")
try: try:
@@ -734,6 +735,7 @@ def process_verification_only():
debug_print("Verifizierungs-Batch abgeschlossen.") debug_print("Verifizierungs-Batch abgeschlossen.")
# ==================== List Metatitel, Description und Überschriften aus Websiten aus ==================== # ==================== List Metatitel, Description und Überschriften aus Websiten aus ====================
def scrape_website_details(url): def scrape_website_details(url):
""" """