Final Pitch Generation - The Elegance Update

- REFACTOR: Der FSM-Pitch-Prompt wurde final überarbeitet, um der KI maximale stilistische Freiheit für eine elegante, partnerschaftliche Tonalität zu geben.
- FIX: Die "FEHLER_DATEN"-Regel wurde entfernt, um sicherzustellen, dass für jedes Unternehmen ein Pitch generiert wird, auch bei dünnerer Datenlage.
- Die generierten Pitches sind nun optimal für die direkte Verwendung in der Marketing-Automation, mit einer hohen Erfolgsquote und exzellenter Tonalität.
This commit is contained in:
2025-07-21 13:44:23 +00:00
parent 11e34beb41
commit 3eba023ebe

View File

@@ -1031,8 +1031,8 @@ def generate_fsm_pitch(
techniker_bucket_ml, techniker_bucket_ml,
): ):
""" """
Generiert einen FSM-Pitch basierend auf dem finalen Master-Prompt (v2.3.3). Generiert einen FSM-Pitch mit maximaler stilistischer Qualität und einer hohen
Liefert einen strategischen, positiv formulierten Satz für die E-Mail-Ansprache. Erfolgsquote, basierend auf dem finalen Master-Prompt (v2.3.4).
""" """
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -1041,7 +1041,7 @@ def generate_fsm_pitch(
if website_summary and '**GESCHÄFTSMODELL**' in website_summary: if website_summary and '**GESCHÄFTSMODELL**' in website_summary:
try: try:
summary_text = website_summary.split('Zusammenfassung:')[1].split('**FSM-POTENZIAL**')[0].strip() 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 except IndexError: pass
elif website_summary and 'k.a.' not in website_summary.lower(): elif website_summary and 'k.a.' not in website_summary.lower():
parts.append(f"Zusammenfassung der Website: {website_summary}") parts.append(f"Zusammenfassung der Website: {website_summary}")
@@ -1052,10 +1052,9 @@ def generate_fsm_pitch(
combined = "\n".join(parts) combined = "\n".join(parts)
if not combined: return "FEHLER (Mangelnde Daten)" 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 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 = "" personal_info = ""
try: try:
tech_val = int(anzahl_techniker or 0) 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" personal_info = f"Ihrem Unternehmen mit über {int(round(ma_val, -2))} Mitarbeitern"
except (ValueError, TypeError): pass except (ValueError, TypeError): pass
# 4. Der finale, polierte MASTER-PROMPT # 4. Der finale, eleganteste Prompt
prompt_parts = [ 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.", "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.",
"Aufgabe:",
"Formuliere EINEN EINZIGEN, flüssig lesbaren Satz (ca. 2035 Wörter), der eine operative Kernkompetenz des Unternehmens beobachtet und deren Wichtigkeit für den Geschäftserfolg hervorhebt.",
"", "",
"--- Tonalität & Stil (SEHR WICHTIG) ---", "--- Denkprozess & Stilvorgaben ---",
"• Absolut NICHT werblich, sondern partnerschaftlich und beobachtend.", "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').",
"• Beginne den Satz entweder mit 'Angesichts Ihrer Spezialisierung auf...' oder 'Für ein Unternehmen wie [Kurzname], das...'.", "2. **Identifiziere den Hebel:** Was ist der entscheidende Erfolgsfaktor für diese Tätigkeit? (z.B. 'reibungslose Planung', 'effiziente Koordination', 'schnelle Reaktionszeiten').",
"• Der Satz muss eine positive operative Herausforderung implizieren (z.B. 'ist die Effizienz entscheidend' statt 'ist Ineffizienz ein Problem').", "3. **Formuliere den Satz (ca. 20-35 Wörter):**",
"• Verwende IMMER den bereitgestellten 'Kurznamen', niemals die volle Firmierung.", " - 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) ---", "--- Exzellente Beispiele für die Zielsprache ---",
"1. Analysiere die Beschreibung, um die **spezifischste Service-Tätigkeit** zu finden (z.B. 'Installation von Glasfaseranschlüssen', 'Wartung von Produktionsanlagen').", "• 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.",
"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.", "• 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 ---", "--- Wichtige Regel ---",
"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.", "**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'.",
"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",
"", "",
"--- Unternehmenskontext für deine Aufgabe ---", "--- Unternehmenskontext für deine Aufgabe ---",
f"Kurzname des Unternehmens: {display_name}", f"Kurzname des Unternehmens: {display_name}",
f"Branche: {ki_branche}",
f"Beschreibung:\n{combined}", f"Beschreibung:\n{combined}",
f"Personalinfo für den Satz: {personal_info if personal_info else 'Keine Angabe'}", f"Personalinfo für den Satz: {personal_info if personal_info else 'Keine Angabe'}",
"", "",
"--- Deine Ausgabe ---", "--- 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) prompt = "\n".join(prompt_parts)
try: try:
fsm_pitch = call_openai_chat(prompt, temperature=0.6, model="gpt-4o") fsm_pitch = call_openai_chat(prompt, temperature=0.7, model="gpt-4o")
if not fsm_pitch or "FEHLER_DATEN" in fsm_pitch: if not fsm_pitch or len(fsm_pitch.split()) < 7:
logger.warning(f"KI konnte keinen validen FSM-Pitch für {company_name} generieren (Grund: Mangelnde/unspezifische Daten).") logger.warning(f"KI konnte keinen validen FSM-Pitch für {company_name} generieren (Antwort zu kurz).")
return "FEHLER (Mangelnde Daten)" return "FEHLER (KI-Antwort unzureichend)"
return fsm_pitch.strip().replace('"', '') return fsm_pitch.strip().replace('"', '')
except Exception as e: except Exception as e:
logger.error(f"Fehler bei der Generierung des FSM-Pitches für {company_name}: {e}") logger.error(f"Fehler bei der Generierung des FSM-Pitches für {company_name}: {e}")