File size: 3,002 Bytes
bf9d5da
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
# Use a pipeline as a high-level helper
from transformers import pipeline
import torch

from transformers import AutoTokenizer, AutoModelForCausalLM

pipe = pipeline("text-generation", model="openai-community/gpt2")


# Titel der App
st.title("GPT-2 Kampfsimulator")

# Modell und Tokenizer laden
@st.cache_resource
def load_model():
    try:
        tokenizer = AutoTokenizer.from_pretrained("openai-community/gpt2")
        model = AutoModelForCausalLM.from_pretrained("openai-community/gpt2")
        # Setze das Modell in den Evaluierungsmodus
        model.eval()
        return model, tokenizer
    except Exception as e:
        st.error(f"Fehler beim Laden des Modells: {str(e)}")
        return None, None

model, tokenizer = load_model()
st.write("Modell und Tokenizer erfolgreich geladen.")

# Eingabe für den Benutzer
user_input = st.text_input(
    "Beschreibe den Kampf:",
    "Ein Schwertkämpfer trifft auf einen Bogenschützen in einer Arena."
)

# Konfigurationsoptionen
col1, col2 = st.columns(2)
with col1:
    temperature = st.slider("Kreativität (Temperature)", 0.1, 1.0, 0.7)
    max_length = st.slider("Maximale Textlänge", 50, 200, 100)
with col2:
    num_sequences = st.slider("Anzahl der Generierungen", 1, 3, 1)

# Textgenerierung starten
if st.button("Kampf simulieren"):
    if model and tokenizer:
        try:
            # Füge einen Kontext hinzu
            prompt = f"In einem epischen Kampf: {user_input}\nDer Kampf beginnt:"
            
            # Tokenisierung mit Padding
            inputs = tokenizer(prompt, return_tensors="pt", padding=True)
            
            # Generierung mit mehr Parametern
            outputs = model.generate(
                inputs["input_ids"],
                max_length=max_length,
                num_return_sequences=num_sequences,
                temperature=temperature,
                pad_token_id=tokenizer.eos_token_id,
                no_repeat_ngram_size=2,
                do_sample=True,
                top_k=50,
                top_p=0.95
            )
            
            # Ausgabe der generierten Texte
            for idx, output in enumerate(outputs):
                generated_text = tokenizer.decode(output, skip_special_tokens=True)
                st.markdown(f"**Kampfszenario {idx + 1}:**")
                st.text_area(
                    label=f"Generierter Text {idx + 1}",
                    value=generated_text,
                    height=150
                )
        
        except Exception as e:
            st.error(f"Fehler bei der Textgenerierung: {str(e)}")
    else:
        st.error("Modell konnte nicht geladen werden. Bitte überprüfen Sie die Installation.")

# Füge Hinweise hinzu
st.markdown("""
---
**Hinweise:**
- Die "Kreativität" steuert, wie kreativ/zufällig die Ausgabe sein soll
- Die "Maximale Textlänge" bestimmt die maximale Anzahl der generierten Token
- "Anzahl der Generierungen" erstellt mehrere Varianten des Kampfes
""")