diff --git a/helpers.py b/helpers.py index e6dc69ca..f6b647a2 100644 --- a/helpers.py +++ b/helpers.py @@ -1031,8 +1031,8 @@ def generate_fsm_pitch( techniker_bucket_ml, ): """ - Generiert einen FSM-Pitch basierend auf dem finalen Master-Prompt (v2.3.3). - Liefert einen strategischen, positiv formulierten Satz für die E-Mail-Ansprache. + Generiert einen FSM-Pitch mit maximaler stilistischer Qualität und einer hohen + Erfolgsquote, basierend auf dem finalen Master-Prompt (v2.3.4). """ logger = logging.getLogger(__name__) @@ -1041,7 +1041,7 @@ def generate_fsm_pitch( if website_summary and '**GESCHÄFTSMODELL**' in website_summary: try: summary_text = website_summary.split('Zusammenfassung:')[1].split('**FSM-POTENZIAL**')[0].strip() - if summary_text: parts.append(f"Zusammenfassung der Website: {summary_text}") + if summary_text: parts.append(f"Website-Zusammenfassung: {summary_text}") except IndexError: pass elif website_summary and 'k.a.' not in website_summary.lower(): parts.append(f"Zusammenfassung der Website: {website_summary}") @@ -1052,10 +1052,9 @@ def generate_fsm_pitch( combined = "\n".join(parts) if not combined: return "FEHLER (Mangelnde Daten)" - # 2. Namenswahl + # 2. Namenswahl & 3. Personalinfo display_name = company_short_name if company_short_name and company_short_name.lower() != 'k.a.' else company_name - - # 3. VERBESSERTE Personalinfo-Generierung + personal_info = "" try: tech_val = int(anzahl_techniker or 0) @@ -1070,45 +1069,43 @@ def generate_fsm_pitch( personal_info = f"Ihrem Unternehmen mit über {int(round(ma_val, -2))} Mitarbeitern" except (ValueError, TypeError): pass - # 4. Der finale, polierte MASTER-PROMPT + # 4. Der finale, eleganteste Prompt prompt_parts = [ - "Du bist ein exzellenter B2B-Stratege und Texter. Deine Aufgabe ist es, für ein Unternehmen einen hochpersonalisierten, scharfsinnigen und wertschätzenden Einleitungssatz für eine E-Mail zu formulieren.", - "Aufgabe:", - "Formuliere EINEN EINZIGEN, flüssig lesbaren Satz (ca. 20–35 Wörter), der eine operative Kernkompetenz des Unternehmens beobachtet und deren Wichtigkeit für den Geschäftserfolg hervorhebt.", + "Du bist ein exzellenter B2B-Stratege und Texter mit einem tiefen Verständnis für operative Prozesse im Außendienst. Deine Aufgabe ist es, einen hochpersonalisierten, scharfsinnigen und wertschätzenden Einleitungssatz für eine E-Mail an ein potenzielles Kundenunternehmen zu formulieren.", "", - "--- Tonalität & Stil (SEHR WICHTIG) ---", - "• Absolut NICHT werblich, sondern partnerschaftlich und beobachtend.", - "• Beginne den Satz entweder mit 'Angesichts Ihrer Spezialisierung auf...' oder 'Für ein Unternehmen wie [Kurzname], das...'.", - "• Der Satz muss eine positive operative Herausforderung implizieren (z.B. 'ist die Effizienz entscheidend' statt 'ist Ineffizienz ein Problem').", - "• Verwende IMMER den bereitgestellten 'Kurznamen', niemals die volle Firmierung.", + "--- Denkprozess & Stilvorgaben ---", + "1. **Analysiere den Kontext:** Verstehe das Kerngeschäft des Unternehmens aus der Beschreibung. Was ist die spezifischste, physische Service-Tätigkeit, die ihre mobilen Teams durchführen? (z.B. 'Installation von Solaranlagen', 'Wartung von BHKWs', 'Reparatur von Druckmaschinen').", + "2. **Identifiziere den Hebel:** Was ist der entscheidende Erfolgsfaktor für diese Tätigkeit? (z.B. 'reibungslose Planung', 'effiziente Koordination', 'schnelle Reaktionszeiten').", + "3. **Formuliere den Satz (ca. 20-35 Wörter):**", + " - Wähle einen eleganten, aktiven Einstieg wie 'Speziell im Bereich...' oder 'Die reibungslose Koordination...'. Vermeide starre Floskeln.", + " - Verbinde die **spezifische Tätigkeit** mit dem **Hebel** und den **geschäftlichen Konsequenzen** (z.B. 'Kundenzufriedenheit', 'Anlagenverfügbarkeit', 'Projekterfolg').", + " - Integriere die Personalinfo, wenn sie spezifisch und aussagekräftig ist.", + " - **WICHTIG:** Formuliere immer als positive Beobachtung über eine Kernkompetenz. Du implizierst die Herausforderung durch die Betonung der Wichtigkeit der Lösung.", + " - Verwende IMMER den bereitgestellten 'Kurznamen'.", "", - "--- Denkprozess (Schritt für Schritt) ---", - "1. Analysiere die Beschreibung, um die **spezifischste Service-Tätigkeit** zu finden (z.B. 'Installation von Glasfaseranschlüssen', 'Wartung von Produktionsanlagen').", - "2. Formuliere den Satz, der diese Tätigkeit mit der Personalinfo und einer positiven geschäftlichen Konsequenz (z.B. 'entscheidend für die Kundenzufriedenheit', 'der Schlüssel zum Projekterfolg') verbindet.", + "--- Exzellente Beispiele für die Zielsprache ---", + "• Beispiel 1: Für ein Unternehmen wie 2G Energy, das bei über 8.500 installierten Modulen weltweit den Service sicherstellt, ist die effiziente Koordination ihrer 200 Servicetechniker entscheidend für die maximale Anlagenverfügbarkeit.", + "• Beispiel 2: Speziell im Bereich der schnellen und effizienten Installation von integrierten Energielösungen ist für 1KOMMA5° die reibungslose Planung ihres wachsenden Serviceteams der Schlüssel zur Sicherstellung der Kundenzufriedenheit.", + "• Beispiel 3: Die präzise Projektplanung und -umsetzung ist besonders für einen Hersteller von Highend-Produktionsanlagen wie 3CON entscheidend, um den hohen Qualitätsansprüchen anspruchsvoller Industriekunden gerecht zu werden.", "", - "--- Exzellente Beispiele für den Zielsatz ---", - "Beispiel 1: Für ein Unternehmen wie 2G Energy, das bei über 8.500 installierten Modulen weltweit den Service sicherstellt, ist die effiziente Koordination Ihrer 200 Servicetechniker entscheidend für die maximale Anlagenverfügbarkeit.", - "Beispiel 2: Angesichts der Spezialisierung von 1KOMMA5° auf die schnelle und effiziente Installation von integrierten Energielösungen ist die reibungslose Planung Ihres wachsenden Serviceteams der Schlüssel zur Sicherstellung der Kundenzufriedenheit.", - "", - "--- Selbstkritik ---", - "Wenn die Beschreibung keine konkrete Service-Tätigkeit erkennen lässt (z.B. reiner Handel, Online-Portal), antworte NUR mit: FEHLER_DATEN", + "--- Wichtige Regel ---", + "**Generiere IMMER einen Satz.** Wenn die Daten unspezifisch sind, formuliere einen etwas allgemeineren, aber immer noch relevanten Satz über die 'Effizienz des Service-Teams bei der Betreuung von Kundenprojekten'.", "", "--- Unternehmenskontext für deine Aufgabe ---", f"Kurzname des Unternehmens: {display_name}", - f"Branche: {ki_branche}", f"Beschreibung:\n{combined}", f"Personalinfo für den Satz: {personal_info if personal_info else 'Keine Angabe'}", "", "--- Deine Ausgabe ---", - "Gib NUR den finalen, perfekt formulierten Satz aus ODER das Wort 'FEHLER_DATEN'.", + "Gib NUR den finalen, perfekt formulierten Satz aus.", ] prompt = "\n".join(prompt_parts) try: - fsm_pitch = call_openai_chat(prompt, temperature=0.6, model="gpt-4o") - if not fsm_pitch or "FEHLER_DATEN" in fsm_pitch: - logger.warning(f"KI konnte keinen validen FSM-Pitch für {company_name} generieren (Grund: Mangelnde/unspezifische Daten).") - return "FEHLER (Mangelnde Daten)" + fsm_pitch = call_openai_chat(prompt, temperature=0.7, model="gpt-4o") + if not fsm_pitch or len(fsm_pitch.split()) < 7: + logger.warning(f"KI konnte keinen validen FSM-Pitch für {company_name} generieren (Antwort zu kurz).") + return "FEHLER (KI-Antwort unzureichend)" return fsm_pitch.strip().replace('"', '') except Exception as e: logger.error(f"Fehler bei der Generierung des FSM-Pitches für {company_name}: {e}")