diff --git a/helpers.py b/helpers.py index 95122bff..11cdf301 100644 --- a/helpers.py +++ b/helpers.py @@ -1031,8 +1031,8 @@ def generate_fsm_pitch( techniker_bucket_ml, ): """ - Generiert einen maßgeschneiderten, positiv formulierten Satz, der eine operative - Service-Herausforderung impliziert und für die Kundenansprache geeignet ist (v2.2.6). + Generiert einen maßgeschneiderten, strategischen Satz, der eine operative + Herausforderung impliziert und für die E-Mail-Ansprache geeignet ist (v2.2.7). """ logger = logging.getLogger(__name__) @@ -1043,8 +1043,7 @@ def generate_fsm_pitch( summary_text = website_summary.split('Zusammenfassung:')[1].split('**FSM-POTENZIAL**')[0].strip() if summary_text: beschreibung_kombiniert.append(f"Website-Zusammenfassung: {summary_text}") - except IndexError: - pass # Ignoriere Formatierungsfehler, fahre mit anderen Daten fort + except IndexError: pass if wiki_absatz and 'k.a.' not in wiki_absatz.lower(): beschreibung_kombiniert.append(f"Wikipedia-Einleitung: {wiki_absatz}") @@ -1055,16 +1054,15 @@ def generate_fsm_pitch( logger.warning(f"Zu wenige Informationen für FSM-Pitch bei {company_name}.") return "FEHLER (Mangelnde Daten)" - # 2. Namenswahl + # 2. Namenswahl und 3. Personalinfo (bleibt unverändert) display_name = company_short_name if company_short_name and company_short_name.lower() != 'k.a.' else company_name - - # 3. Personalinfo + def round_number(n): if n < 100: return n if n < 1000: return int(round(n / 50.0)) * 50 return int(round(n / 100.0)) * 100 - personal_info = "in einem Unternehmen Ihrer Größe" + personal_info = "" # Wir machen es optional try: tech = int(anzahl_techniker or 0) ma = int(anzahl_ma or 0) @@ -1075,41 +1073,42 @@ def generate_fsm_pitch( elif ma > 0: personal_info = f"bei über {round_number(ma)} Mitarbeitern" except (ValueError, TypeError): - logger.debug("Keine validen MA/Techniker-Zahlen für Pitch.") + pass - # 4. Der finale, positiv formulierte Prompt + # 4. Der finale, strategische und positiv formulierte Prompt prompt_parts = [ "Du bist ein B2B-Stratege, der die operativen Hebel eines Unternehmens im technischen Außendienst versteht.", - "Aufgabe: Formuliere EINEN EINZIGEN, positiv-beobachtenden Satz (ca. 20-35 Wörter), der die zentrale operative Herausforderung im Service subtil andeutet, indem er die Wichtigkeit ihrer Lösung betont.", + "Aufgabe: Formuliere EINEN EINZIGEN, positiv-beobachtenden Satz (ca. 20-35 Wörter), der die zentrale operative Herausforderung im Service subtil andeutet, indem er die Wichtigkeit der Lösung betont.", "", "--- Tonalität & Stil ---", - "- Formuliere als scharfsinnige Beobachtung, nicht als Problem.", + "- Formuliere als scharfsinnige Beobachtung, nicht als Problem ('Für ein Unternehmen wie X ist Y entscheidend, um Z zu erreichen').", "- Der Satz muss direkt als erster Absatz in einer E-Mail an das Unternehmen funktionieren.", - "- Fokus auf die geschäftlichen Konsequenzen (z.B. 'entscheidend für den Projekterfolg', 'unerlässlich für die Kundenzufriedenheit').", + "- Beziehe die Personalinfo (falls vorhanden) elegant in den Satz ein.", "", "--- Inferenz-Regeln (um die Kernaussage zu finden) ---", "1. **Hersteller von Anlagen/Maschinen:** Betone die Wichtigkeit der **'effizienten Inbetriebnahme'** oder der **'maximalen Anlagenverfügbarkeit (Uptime)'**.", - "2. **Installateur/Dienstleister mit vielen Standorten/Partnern:** Betone die Wichtigkeit der **'Standardisierung der Servicequalität'** über alle Standorte hinweg.", - "3. **Reiner Reparaturservice:** Betone die Wichtigkeit der **'schnellen Reaktionszeiten'** und der **'Einhaltung von Service-Levels'**.", - "4. **Wenn unspezifisch:** Formuliere einen etwas allgemeineren, aber immer noch relevanten Satz über die 'Effizienz des Service-Teams'.", + "2. **Installateur/Dienstleister (viele Standorte/Partner):** Betone die Wichtigkeit der **'gleichbleibend hohen Servicequalität'** über alle Standorte hinweg.", + "3. **Reparaturservice:** Betone die Wichtigkeit der **'schnellen Reaktionszeiten'** und der **'Einhaltung von Service-Levels'**.", + "", + "--- Selbstkritik-Regel (WICHTIG) ---", + "Wenn die Beschreibung so allgemein ist, dass keine der Inferenz-Regeln spezifisch angewendet werden kann (z.B. reiner Handel, Online-Portal), antworte NUR mit dem Wort 'FEHLER_DATEN'.", "", "--- Unternehmenskontext ---", f"Kurzname des Unternehmens: {display_name}", f"KI-validierte Branche: {ki_branche}", f"Beschreibung: {final_beschreibung}", - f"Personalinfo für den Satz: {personal_info}", + f"Personalinfo: {personal_info if personal_info else 'Keine Angabe'}", "", "--- Deine Aufgabe ---", - "Gib NUR den finalen, positiv formulierten Satz aus.", + "Gib NUR den finalen, positiv formulierten Satz aus ODER das Wort 'FEHLER_DATEN'.", ] prompt = "\n".join(prompt_parts) try: fsm_pitch = call_openai_chat(prompt, temperature=0.6, model="gpt-4o") - # Wir entfernen die "FEHLER_DATEN"-Prüfung, um die Trefferquote zu erhöhen - if not fsm_pitch: - logger.warning(f"KI konnte keinen FSM-Pitch für {company_name} generieren (leere Antwort).") - return "FEHLER (API-Antwort leer)" + 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)" return fsm_pitch.strip().replace('"', '') except Exception as e: logger.error(f"Fehler bei der Generierung des FSM-Pitches für {company_name}: {e}")