diff --git a/helpers.py b/helpers.py index d8592d44..1ee59b56 100644 --- a/helpers.py +++ b/helpers.py @@ -788,35 +788,69 @@ def call_openai_chat(prompt, temperature=0.3, model=None): @retry_on_failure -def summarize_website_content(raw_text, company_name_for_context="einem Unternehmen"): +def summarize_website_content(raw_text, company_name): """ - Fasst den Rohtext einer Website mit OpenAI zusammen. - Nutzt nun den Firmennamen für besseren Kontext. + Analysiert den Rohtext einer Website, um sowohl das Kerngeschäft als auch + die Relevanz für Field Service Management zu verstehen. + Gibt eine strukturierte, zweiteilige Zusammenfassung zurück. """ logger = logging.getLogger(__name__) - if not raw_text or len(raw_text) < 100 or raw_text.lower().strip().startswith('k.a.'): - logger.debug(f"Überspringe Website-Zusammenfassung für '{company_name_for_context}', Text zu kurz oder 'k.A.'.") + if not raw_text or len(raw_text.split()) < 50: + logger.debug(f"Rohtext für {company_name} zu kurz ({len(raw_text.split())} Wörter), überspringe Zusammenfassung.") return "k.A. (Text zu kurz)" - # NEUER, KONTEXTBEZOGENER PROMPT - prompt = ( - f"Du bist ein Wirtschaftsanalyst. Deine Aufgabe ist es, den Kern eines Unternehmens zu erfassen.\n" - f"Fasse den folgenden Rohtext der Website für das Unternehmen '{company_name_for_context}' prägnant zusammen.\n" - "Konzentriere dich ausschließlich auf die folgenden drei Punkte:\n" - "- Was ist das Haupttätigkeitsfeld?\n" - "- Was sind die wichtigsten Produkte und/oder Dienstleistungen?\n" - "- Wer ist die primäre Zielgruppe (z.B. B2B, B2C, spezifische Industrien)?\n\n" - "Website-Text:\n" - f"```\n{raw_text[:4000]}\n```\n\n" # Längenlimit leicht erhöht - "Zusammenfassung (max. 100 Wörter):" - ) + max_tokens_for_summary = 10000 + truncated_text = raw_text[:max_tokens_for_summary] + + # --- SICHERE PROMPT-ERSTELLUNG AUS EINER LISTE --- + # Diese Methode ist immun gegen Copy-Paste-Fehler mit unsichtbaren Zeichen. + prompt_parts = [ + "**Rolle:** Du bist ein erfahrener B2B-Marktanalyst.", + f"**Aufgabe:** Analysiere den Website-Text des Unternehmens '{company_name}' und erstelle ein prägnantes Dossier.", + "", + "**Deine Analyse besteht aus ZWEI TEILEN:**", + "", + "**TEIL 1: Geschäftsmodell-Analyse**", + "1. Identifiziere die Kernprodukte und/oder Dienstleistungen des Unternehmens.", + "2. Fasse in 2-3 prägnanten Sätzen zusammen, was das Unternehmen macht und für welche Kunden.", + "", + "**TEIL 2: Field Service Management (FSM) Potenzial-Analyse**", + "1. Scanne den Text gezielt nach Hinweisen auf einen technischen Außendienst (Schlüsselwörter: Service, Wartung, Reparatur, Montage, Installation, Techniker, Kundendienst vor Ort, Instandhaltung).", + "2. Bewerte das Potenzial für einen relevanten Außendienst (mind. 50 Techniker) auf einer Skala.", + "3. Extrahiere die 1-2 wichtigsten Sätze, die diese Service-Tätigkeiten belegen.", + "", + "**Antworte AUSSCHLIESSLICH im folgenden exakten Format:**", + "--- TEIL 1: GESCHAEFTSMODELL ---", + "Zusammenfassung: ", + "", + "--- TEIL 2: FSM-POTENZIAL ---", + "Service-Potenzial: ", + "Service-Beweise: ", + "", + "", + "**Hier ist der Website-Text:**", + "---", + truncated_text, + "---" + ] + prompt = "\n".join(prompt_parts) try: - summary = call_openai_chat(prompt, temperature=0.2, model="gpt-4o-mini") - return summary if summary else "k.A. (Zusammenfassung fehlgeschlagen)" + summary = call_openai_chat(prompt, temperature=0.1, model="gpt-4o-mini") + if not summary: + return "k.A. (API-Antwort leer)" + + # Formatierung für bessere Lesbarkeit im Sheet + summary = summary.replace("--- TEIL 1: GESCHAEFTSMODELL ---", "**GESCHÄFTSMODELL**") + summary = summary.replace("Zusammenfassung:", "Zusammenfassung:") + summary = summary.replace("--- TEIL 2: FSM-POTENZIAL ---", "\n\n**FSM-POTENZIAL**") + summary = summary.replace("Service-Potenzial:", "Potenzial:") + summary = summary.replace("Service-Beweise:", "Beweise:") + + return summary.strip() except Exception as e: - logger.error(f"Fehler bei der Website-Zusammenfassung für {company_name_for_context}: {e}") - return "FEHLER (API-Fehler bei Zusammenfassung)" + logger.error(f"Fehler bei der Website-Zusammenfassung für {company_name}: {e}") + return f"k.A. (Fehler bei Zusammenfassung: {e})" @retry_on_failure def summarize_wikipedia_article(full_text, company_name):