helpers.py aktualisiert

This commit is contained in:
2025-07-20 12:38:45 +00:00
parent df52c9ab7e
commit 9cc58ca294

View File

@@ -845,97 +845,7 @@ def summarize_wikipedia_article(full_text, company_name):
return "FEHLER (API-Fehler bei Zusammenfassung)"
@retry_on_failure
def summarize_batch_openai(tasks_data):
"""
Fasst eine Liste von Rohtexten in einem einzigen OpenAI API Call zusammen.
Args:
tasks_data (list): Eine Liste von Dictionaries, jedes enthaelt:
{'row_num': int, 'raw_text': str}
Returns:
dict: Ein Dictionary, das Zeilennummern auf ihre Zusammenfassungen mappt.
"""
logger = logging.getLogger(__name__)
if not tasks_data: return {}
valid_tasks = [t for t in tasks_data if t.get("raw_text") and str(t["raw_text"]).strip().lower() not in ["k.a.", "k.a. (nur cookie-banner erkannt)", "k.a. (fehler)"]]
if not valid_tasks:
logger.debug("Keine gueltigen Rohtexte fuer Batch-Zusammenfassung gefunden.")
return {t['row_num']: "k.A. (Kein gueltiger Rohtext im Batch)" for t in tasks_data}
logger.debug(f"Starte Batch-Zusammenfassung fuer {len(valid_tasks)} gueltige Texte (Zeilen: {[t['row_num'] for t in valid_tasks]})...")
prompt_parts = [
"Du bist ein KI-Assistent, der Webinhalte analysiert.",
"Fasse fuer JEDEN der folgenden Texte einer Unternehmenswebsite praegnant zusammen. ",
"Konzentriere dich dabei auf:\n"
"- Haupttaetigkeitsfeld des Unternehmens\n"
"- Wichtigste Produkte und/oder Dienstleistungen\n"
"- Zielgruppe (falls erkennbar)\n\n"
"Gib das Ergebnis fuer JEDEN Text im folgenden Format aus, auf einer neuen Zeile:\n"
"RESULTAT <Zeilennummer>: <Zusammenfassung fuer diese Zeilennummer>\n\n",
"Halte jede Zusammenfassung kurz, max. 100 Woerter.\n\n",
"--- Texte zur Zusammenfassung ---"
]
text_block = ""
row_numbers_in_batch = []
max_chars_per_single_text_in_batch = 1500
for task in valid_tasks:
row_num = task['row_num']
raw_text = str(task['raw_text'])
raw_text_short = raw_text[:max_chars_per_single_text_in_batch]
entry_text = f"\n--- TEXT Zeile {row_num} ---\n{raw_text_short}\n--- ENDE TEXT Zeile {row_num} ---\n"
text_block += entry_text
row_numbers_in_batch.append(row_num)
if not row_numbers_in_batch:
logger.debug("Keine Zeilen uebrig fuer OpenAI Prompt nach Filterung/Kuerzung im Batch.")
return {t['row_num']: "k.A. (Kein Rohtext im Batch)" for t in tasks_data}
prompt_parts.append(text_block)
prompt_parts.append("\n--- Ende der Texte ---")
prompt_parts.append("\nBitte gib NUR die 'RESULTAT <Zeilennummer>: ...' Zeilen zurueck.")
final_prompt = "\n".join(prompt_parts)
chat_response = None
try:
chat_response = call_openai_chat(final_prompt, temperature=0.2)
if not chat_response:
raise openai.error.APIError("Keine Antwort von OpenAI erhalten fuer Batch-Zusammenfassung.")
except Exception as e:
logger.error(f"Endgueltiger FEHLER beim OpenAI-Batch-Aufruf fuer Zusammenfassung: {e}")
return {row_num: f"FEHLER API: {str(e)[:100]}" for row_num in row_numbers_in_batch}
summaries = {}
lines = chat_response.strip().split('\n')
parsed_count = 0
for line in lines:
match = re.match(r"RESULTAT (\d+): (.*)", line.strip())
if match:
row_num = int(match.group(1))
summary_text = match.group(2).strip()
if row_num in row_numbers_in_batch:
summaries[row_num] = summary_text
parsed_count += 1
logger.debug(f"Batch-Zusammenfassung: {parsed_count} von {len(row_numbers_in_batch)} Zeilen erfolgreich geparst.")
if parsed_count < len(row_numbers_in_batch):
logger.warning(f"Nicht alle Zeilen aus dem Batch ({len(row_numbers_in_batch)}) konnten in der OpenAI-Antwort ({len(lines)} Zeilen) geparst werden.")
logger.debug(f"Unerwartete Antwortteile (erste 500 Zeichen): {chat_response[:500]}")
for row_num in row_numbers_in_batch:
if row_num not in summaries:
summaries[row_num] = "FEHLER: Antwort nicht geparst"
original_row_nums = {t['row_num'] for t in tasks_data}
for row_num in original_row_nums:
if row_num not in summaries:
summaries[row_num] = "k.A. (Kein gueltiger Rohtext im Batch)"
return summaries
# ==============================================================================
# 9. OPENAI API WRAPPER (BRANCH EVALUATION)