helpers.py aktualisiert
This commit is contained in:
90
helpers.py
90
helpers.py
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user