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:
55
helpers.py
55
helpers.py
@@ -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. 20–35 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}")
|
||||||
|
|||||||
Reference in New Issue
Block a user