CoCoGames commited on
Commit
10d3da5
·
verified ·
1 Parent(s): 0a727b5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +109 -75
app.py CHANGED
@@ -1,24 +1,83 @@
1
  import gradio as gr
 
2
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
3
  import re
 
4
 
5
- # 1. KONFIGURATION
6
  # Ersetzen Sie dies durch den tatsächlichen Pfad oder Namen Ihres Modells auf Hugging Face
7
  MODEL_NAME = "CocoEntertainment/CocoAi-1PTE"
 
 
 
 
8
  DESCRIPTION_TEXT = """
9
- Willkommen bei CocoAi.
10
- Hier kannst du auf Deutsch mir CocoAi chatten.
11
- CocoAi ist ein Mistral 7B Modell (finegetuned)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12
  """
13
 
14
- # 2. MODELL LADEN (WICHTIG: ANPASSEN)
15
- # Dies ist der Teil, den Sie möglicherweise anpassen müssen,
16
- # abhängig davon, wie Ihr Modell geladen wird (z.B. mit vordefiniertem Prompt-Template).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
17
  try:
18
- # Versucht, das Modell zu laden. Dies könnte fehlschlagen, wenn das Modell sehr groß ist oder
19
- # nicht auf der kostenlosen CPU-Hardware läuft.
20
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
21
- model = AutoModelForCausalLM.from_pretrained(MODEL_NAME)
 
 
 
 
 
 
 
 
 
 
22
 
23
  # Erstellt eine Pipeline für die Textgenerierung
24
  coco_pipe = pipeline(
@@ -26,102 +85,77 @@ try:
26
  model=model,
27
  tokenizer=tokenizer,
28
  max_new_tokens=256,
29
- # Weitere Parameter nach Bedarf
30
  )
31
 
32
- print(f"Modell '{MODEL_NAME}' erfolgreich geladen.")
33
 
34
  except Exception as e:
35
- # Platzhalter, wenn das Laden des Modells fehlschlägt (z.B. Modell ist nicht öffentlich oder zu groß)
36
- print(f"Fehler beim Laden des Modells {MODEL_NAME}: {e}. Verwende GPT-2 als Platzhalter.")
37
- coco_pipe = pipeline("text-generation", model="gpt2")
38
-
39
-
40
- # 3. HILFSFUNKTION ZUR ANPASSUNG DER SYNTAX
41
- # Diese Funktion konvertiert die von Ihnen definierte Syntax in Standard-Markdown,
42
- # damit Gradio sie korrekt darstellen kann.
43
- def convert_to_gradio_markdown(text):
44
- # 1. Inline-Code/Monospace (sehr spezifische Behandlung, da es die anderen Syntaxen stören kann)
45
- text = re.sub(r"'''(.*?)'''", r"`\1`", text, flags=re.DOTALL) # Code-Block (Gradio nutzt ```)
46
- text = re.sub(r"'(.*?)'", r"`\1`", text) # Inline Text (Gradio nutzt `)
47
-
48
- # 2. Fett und Kursiv (***Text example***)
49
- text = re.sub(r"\*\*\*(.*?)\*\*\*", r"***\1***", text)
50
-
51
- # 3. Kursiv (**Text example**) -> Gradio/Standard Markdown nutzt *...* oder _..._ für Kursiv
52
- # Hier nehmen wir an, dass **Text example** in IHRER Syntax Kursiv ist
53
- text = re.sub(r"\*\*(.*?)\*\*", r"*\1*", text)
54
-
55
- # 4. Fett (*Text example*) -> Gradio/Standard Markdown nutzt **...** für Fett
56
- # Hier nehmen wir an, dass *Text example* in IHRER Syntax Fett ist
57
- text = re.sub(r"\*(.*?)\*", r"**\1**", text)
58
 
59
- # 5. Header (Wird 1:1 übernommen, da #Header Standard ist)
60
- # 6. Zeilenumbruch ( /n )
61
- text = text.replace("/n", "\n")
62
-
63
- return text
64
 
65
- # 4. CHAT-LOGIK
66
  def generate_response(message, chat_history):
67
- # 1. Konvertiere die Historie in ein Format, das Ihr Modell versteht (optional)
68
- # In diesem Beispiel verwenden wir einfach nur die aktuelle Nachricht.
69
-
70
- # 2. Generiere die Antwort
71
- # Führen Sie hier IHR Modell aus. Die generierte Antwort sollte IHRER CocoAi-Markdown-Syntax folgen!
72
 
73
- # Beispiel-Antwort (Bitte ersetzen Sie dies durch die ECHTE Ausgabe Ihres Modells)
74
- if "hallo" in message.lower():
75
- raw_response = "*Hallo!* Ich bin CocoAi-1PT. Wie kann ich dir behilflich sein?"
76
- elif "syntax" in message.lower():
77
- raw_response = "Gerne erkläre ich die Formatierung! /n *Fett* mit einem Stern. **Kursiv** mit zwei Sternen. /n Ich kann auch Code wie 'print('Hello')' darstellen."
78
- elif "code" in message.lower():
79
- raw_response = "Hier ist ein Beispiel für einen Code-Block: '''def meine_funktion():/n return 'Success' '''"
80
- else:
81
- # Führen Sie die eigentliche Modell-Pipeline aus
82
- # Sie müssen das Prompt-Format Ihres Modells anpassen (z.B. ChatML, Alpaca, etc.)
83
- prompt = f"User: {message}\nCocoAi:"
 
 
84
 
85
- try:
86
- # Beispiel für Pipeline-Ausführung
87
- model_output = coco_pipe(prompt, num_return_sequences=1, do_sample=True)[0]['generated_text']
88
-
89
- # Entferne den eingegebenen Prompt-Teil aus der Ausgabe
90
- raw_response = model_output.replace(prompt, "", 1).strip()
91
-
92
- except Exception as e:
93
- raw_response = f"Entschuldigung, beim Generieren der Antwort ist ein Fehler aufgetreten: {e}"
94
-
95
-
96
- # 3. Konvertiere die rohe Antwort in Gradio-kompatibles Markdown
97
  formatted_response = convert_to_gradio_markdown(raw_response)
98
 
99
- # 4. Füge die Nachricht zur Historie hinzu
100
  chat_history.append((message, formatted_response))
101
  return chat_history, ""
102
 
103
- # 5. GRADIO OBERFLÄCHE
 
104
  # Der Tab für die Beschreibung
105
  description_tab = gr.Markdown(DESCRIPTION_TEXT)
106
 
107
  # Der Tab für den Chat
108
  with gr.Blocks() as chat_tab:
109
- gr.Markdown("# 💬 Chat mit CocoAi-1PT")
110
 
111
- # Die Haupt-Chat-Komponente von Gradio
112
  chatbot = gr.Chatbot(
113
  label="CocoAi Chat",
114
  height=500,
 
 
115
  )
116
 
117
- # Das Eingabefeld
118
  msg = gr.Textbox(
119
  show_label=False,
120
  placeholder="Geben Sie Ihre Nachricht hier ein...",
121
  lines=1
122
  )
123
 
124
- # Buttons
125
  with gr.Row():
126
  submit_btn = gr.Button("Senden", variant="primary", scale=2)
127
  clear_btn = gr.Button("Chat leeren", scale=1)
 
1
  import gradio as gr
2
+ import torch
3
  from transformers import AutoTokenizer, AutoModelForCausalLM, pipeline
4
  import re
5
+ import os
6
 
7
+ # --- 1. KONFIGURATION ---
8
  # Ersetzen Sie dies durch den tatsächlichen Pfad oder Namen Ihres Modells auf Hugging Face
9
  MODEL_NAME = "CocoEntertainment/CocoAi-1PTE"
10
+
11
+ # Setzt den Datentyp auf float16 (halbe Präzision), um den Speicherbedarf beim Laden zu minimieren.
12
+ DTYPE = torch.float16
13
+
14
  DESCRIPTION_TEXT = """
15
+ # 🤖 Willkommen bei CocoAi
16
+
17
+ ## Ein Chatbot von CocoEntertainment
18
+
19
+ Hier kannst du auf Deutsch mit **CocoAi** chatten.
20
+
21
+ CocoAi ist ein **Mistral 7B** Modell, das spezifisch für Unterhaltung und kreative Inhalte feingetuned und quantisiert wurde, um eine effiziente Nutzung zu ermöglichen.
22
+
23
+ ### 💡 CocoAi Markdown Syntax (wie die Antworten formatiert werden)
24
+ Das Modell antwortet unter Verwendung der folgenden speziellen Formatierungsregeln. Das Interface konvertiert diese in Standard-Markdown zur Anzeige:
25
+
26
+ * **\*Text example\*** = Fett (**Bold**)
27
+ * **\*\*Text example\*\* ** = Kursiv (*Italic*)
28
+ * **\*\*\*Text example\*\*\* ** = Fett und Kursiv (***Bold and Italic***)
29
+ * **#Text example** = Haupttitel (Sehr groß)
30
+ * **/n** = Zeilenumbruch
31
+ * **'Text example'** = Inline-Text/Code (Monospace)
32
+ * **'''Text example'''** = Code-Block (Block Monospace)
33
+
34
  """
35
 
36
+ # --- 2. HILFSFUNKTION ZUR ANPASSUNG DER SYNTAX ---
37
+ def convert_to_gradio_markdown(text):
38
+ """Konvertiert die CocoAi-Markdown-Syntax in Gradio-kompatibles Standard-Markdown."""
39
+
40
+ # 1. Code-Block ('''Text example''' -> ```Text example```)
41
+ # Re.DOTALL erlaubt es, über Zeilenumbrüche hinweg zu matchen
42
+ text = re.sub(r"'''(.*?)'''", r"```\1```", text, flags=re.DOTALL)
43
+
44
+ # 2. Inline Text ('Text example' -> `Text example`)
45
+ text = re.sub(r"'(.*?)'", r"`\1`", text)
46
+
47
+ # 3. Fett und Kursiv (***Text example*** -> ***Text example***)
48
+ # Standard-Markdown wird hier beibehalten.
49
+
50
+ # 4. Kursiv (**Text example** -> *Text example*)
51
+ # Wenn **Ihr** Modell **kursiv** mit **zwei** Sternen markiert (Abweichung vom Standard).
52
+ # Hier nehmen wir an, dass Sie die Standard-Logik von *fett* (CocoAi:*) und *kursiv* (CocoAi:**) invertieren wollen.
53
+ text = re.sub(r"\*\*(.*?)\*\*", r"*\1*", text)
54
+
55
+ # 5. Fett (*Text example* -> **Text example**)
56
+ # Wenn **Ihr** Modell **fett** mit **einem** Stern markiert.
57
+ text = re.sub(r"\*(.*?)\*", r"**\1**", text)
58
+
59
+ # 6. Zeilenumbruch (/n -> \n)
60
+ text = text.replace("/n", "\n")
61
+
62
+ return text
63
+
64
+ # --- 3. MODELL LADEN (SPEICHEROPTIMIERT) ---
65
+ # Führen Sie den Ladevorgang nur einmal durch
66
  try:
67
+ print(f"--- Starte Ladevorgang für {MODEL_NAME} ---")
68
+
69
  tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)
70
+
71
+ # Lädt das Modell:
72
+ # - device_map="auto": Essentiell, um das Modell automatisch auf den begrenzten RAM aufzuteilen.
73
+ # - torch_dtype=DTYPE: Erzwingt das Laden mit halber Präzision (Float16) zur Speichereinsparung.
74
+ model = AutoModelForCausalLM.from_pretrained(
75
+ MODEL_NAME,
76
+ torch_dtype=DTYPE,
77
+ device_map="auto",
78
+ # Falls Ihr Modell spezifische Konfigurationsdateien enthält
79
+ trust_remote_code=True,
80
+ )
81
 
82
  # Erstellt eine Pipeline für die Textgenerierung
83
  coco_pipe = pipeline(
 
85
  model=model,
86
  tokenizer=tokenizer,
87
  max_new_tokens=256,
88
+ model_kwargs={"torch_dtype": DTYPE, "device_map": "auto"}
89
  )
90
 
91
+ print(f"Modell '{MODEL_NAME}' erfolgreich geladen und Pipeline erstellt.")
92
 
93
  except Exception as e:
94
+ # DIESER BLOCK WIRD BEI SPEICHERFEHLERN AUSGELÖST
95
+ print(f"FATALER FEHLER beim Laden des Modells {MODEL_NAME}: {e}")
96
+ print("--- Verwende GPT-2 als langsamen Platzhalter ---")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
 
98
+ # Sicherstellung eines funktionierenden Platzhalters
99
+ coco_pipe = pipeline("text-generation", model="gpt2")
 
 
 
100
 
101
+ # --- 4. CHAT-LOGIK ---
102
  def generate_response(message, chat_history):
103
+ """Generiert die Antwort des Chatbots."""
 
 
 
 
104
 
105
+ # Hier müssten Sie das Prompt-Template Ihres Mistral-Modells anwenden (z.B. ChatML, Alpaca, etc.)
106
+ # Dies ist ein generisches Beispiel:
107
+ prompt = f"### Instruction: Beantworte die folgende Frage als CocoAi und verwende die CocoAi Markdown Syntax. ###\n\nUser: {message}\n\nCocoAi:"
108
+
109
+ try:
110
+ # Generierung mit der Pipeline
111
+ model_output = coco_pipe(
112
+ prompt,
113
+ num_return_sequences=1,
114
+ do_sample=True,
115
+ temperature=0.7,
116
+ top_p=0.9
117
+ )
118
 
119
+ # Extrahieren des Texts und Entfernen des Prompts
120
+ raw_response = model_output[0]['generated_text']
121
+
122
+ # WICHTIG: Nur der Teil nach "CocoAi:" ist die eigentliche Antwort
123
+ if "CocoAi:" in raw_response:
124
+ raw_response = raw_response.split("CocoAi:", 1)[-1].strip()
125
+
126
+ except Exception as e:
127
+ raw_response = f"Entschuldigung, beim Generieren der Antwort ist ein technischer Fehler aufgetreten: /n'Fehler: {e}'"
128
+
129
+
130
+ # 2. Konvertiere die rohe Antwort in Gradio-kompatibles Markdown
131
  formatted_response = convert_to_gradio_markdown(raw_response)
132
 
133
+ # 3. Füge die Nachricht zur Historie hinzu
134
  chat_history.append((message, formatted_response))
135
  return chat_history, ""
136
 
137
+ # --- 5. GRADIO OBERFLÄCHE ---
138
+
139
  # Der Tab für die Beschreibung
140
  description_tab = gr.Markdown(DESCRIPTION_TEXT)
141
 
142
  # Der Tab für den Chat
143
  with gr.Blocks() as chat_tab:
144
+ gr.Markdown(f"# 💬 Chat mit CocoAi ({MODEL_NAME})")
145
 
 
146
  chatbot = gr.Chatbot(
147
  label="CocoAi Chat",
148
  height=500,
149
+ # Wenn Sie die Syntax-Regeln im Chat sehen wollen, lassen Sie die Markdown-Verarbeitung zu:
150
+ render_markdown=True
151
  )
152
 
 
153
  msg = gr.Textbox(
154
  show_label=False,
155
  placeholder="Geben Sie Ihre Nachricht hier ein...",
156
  lines=1
157
  )
158
 
 
159
  with gr.Row():
160
  submit_btn = gr.Button("Senden", variant="primary", scale=2)
161
  clear_btn = gr.Button("Chat leeren", scale=1)