File size: 5,816 Bytes
e431be9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
import streamlit as st
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline
import torch

# Titel der Anwendung mit erklärender Unterzeile
st.title("🤖 Marketing Text Generator")
st.markdown("*Ein KI-Tool für kreative Marketing-Texte mit verschiedenen Sprachmodellen*")

# Konfiguration der verfügbaren Modelle
MODELS = {
    "GPT-2 (schnell & ressourcensparend)": "gpt2",
    "Mistral-7B (ausgewogen)": "mistralai/Mistral-7B-v0.1",
    "LLAMA-2 (leistungsstark)": "meta-llama/Llama-2-7b-hf",
    "Falcon (kreativ)": "tiiuae/falcon-7b"
}

@st.cache_resource
def load_model(model_name):
    """
    Lädt das ausgewählte Modell und den zugehörigen Tokenizer.
    Verwendet Caching für bessere Performance.
    """
    try:
        if model_name == "gpt2":
            # GPT-2 ist einfacher zu laden und benötigt weniger Ressourcen
            return pipeline('text-generation', model=model_name, device=-1)
        else:
            # Fortgeschrittene Modelle benötigen spezielle Konfiguration
            tokenizer = AutoTokenizer.from_pretrained(model_name)
            model = AutoModelForCausalLM.from_pretrained(
                model_name,
                device_map="auto",
                trust_remote_code=True,
                load_in_8bit=True  # Speicheroptimierung
            )
            return (model, tokenizer)
    except Exception as e:
        st.error(f"Fehler beim Laden des Modells: {str(e)}")
        return None

def generate_text(model_name, prompt, max_length=200):
    """
    Generiert Text basierend auf dem ausgewählten Modell und Prompt.
    Behandelt verschiedene Modelltypen unterschiedlich.
    """
    try:
        if model_name == "gpt2":
            generator = load_model(model_name)
            response = generator(prompt, max_length=max_length, num_return_sequences=1)
            return response[0]['generated_text']
        else:
            model, tokenizer = load_model(model_name)
            inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
            
            with torch.no_grad():
                outputs = model.generate(
                    **inputs,
                    max_length=max_length,
                    num_return_sequences=1,
                    temperature=0.7,  # Kreativität kontrollieren
                    top_p=0.9        # Vielfalt der Ausgabe steuern
                )
            
            return tokenizer.decode(outputs[0], skip_special_tokens=True)
    except Exception as e:
        st.error(f"Fehler bei der Textgenerierung: {str(e)}")
        return None

def main():
    # Seitenleiste für Modellauswahl und Erklärungen
    with st.sidebar:
        st.header("Modell-Einstellungen")
        selected_model = st.selectbox(
            "Wählen Sie ein Sprachmodell:",
            list(MODELS.keys()),
            help="Verschiedene Modelle haben unterschiedliche Stärken und Performance-Eigenschaften"
        )
        
        st.markdown("---")
        st.markdown("""
        **Modell-Informationen:**
        - GPT-2: Schnell, aber basic
        - Mistral: Guter Allrounder
        - LLAMA-2: Sehr leistungsfähig
        - Falcon: Besonders kreativ
        """)

    # Hauptbereich für Eingabe und Generierung
    with st.form("text_generation_form"):
        # Strukturierte Eingabefelder
        col1, col2 = st.columns(2)
        with col1:
            product_name = st.text_input(
                "Produktname",
                help="Name des Produkts, für das Text generiert werden soll"
            )
        with col2:
            target_audience = st.text_input(
                "Zielgruppe",
                help="Beschreiben Sie Ihre Zielgruppe"
            )
        
        key_features = st.text_area(
            "Hauptmerkmale",
            help="Listen Sie die wichtigsten Eigenschaften des Produkts auf (durch Kommas getrennt)"
        )
        
        tone_options = ["Professionell", "Casual", "Luxuriös", "Jugendlich", "Technisch"]
        tone = st.select_slider(
            "Tonalität",
            options=tone_options,
            value="Professionell"
        )
        
        submit_button = st.form_submit_button("Text generieren")

    if submit_button:
        if not product_name or not key_features:
            st.warning("Bitte füllen Sie mindestens Produktname und Hauptmerkmale aus.")
            return

        # Fortschrittsanzeige
        with st.spinner(f'Generiere Text mit {selected_model.split(" ")[0]}...'):
            # Marketing-spezifischer Prompt
            prompt = f"""
            Erstelle einen überzeugenden Marketing-Text mit folgendem Kontext:
            Produkt: {product_name}
            Zielgruppe: {target_audience}
            Hauptmerkmale: {key_features}
            Tonalität: {tone}
            
            Der Text sollte die USPs hervorheben und die Zielgruppe direkt ansprechen.
            """
            
            # Modellname aus dem Dictionary abrufen
            model_name = MODELS[selected_model]
            response = generate_text(model_name, prompt)
            
            if response:
                st.success("Text wurde generiert!")
                st.markdown("### Generierter Marketing-Text:")
                st.markdown(response)
                
                # Zusätzliche Aktionen anbieten
                col1, col2 = st.columns(2)
                with col1:
                    if st.button("Text kopieren"):
                        st.text_area("Kopieren Sie den Text:", value=response)
                with col2:
                    st.download_button(
                        "Als TXT herunterladen",
                        response,
                        file_name="marketing_text.txt"
                    )

if __name__ == "__main__":
    main()