André Osyguß commited on
Commit
7def992
·
1 Parent(s): fc9fee2

add compression step

Browse files
Files changed (2) hide show
  1. app.py +121 -21
  2. test.py +5 -2
app.py CHANGED
@@ -17,19 +17,60 @@ except Exception as e:
17
  print(f"Fehler beim Laden des Modells: {e}")
18
  pipe = None
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  @spaces.GPU
21
- def chat_with_llm(message, history, system_prompt_text):
22
  """
23
- Verarbeitet die Benutzernachricht, fügt den Chat-Verlauf und den System-Prompt hinzu und
24
  generiert eine Antwort vom LLM.
25
  """
26
  if not pipe:
27
  return "Modell konnte nicht geladen werden. Bitte überprüfen Sie die Hardware-Konfiguration oder das Modell-Repository."
28
 
29
- # Den System-Prompt und den vorherigen Chat-Verlauf kombinieren
30
  full_prompt = f"{system_prompt_text}\n\n"
31
- for human, assistant in history:
32
- full_prompt += f"Benutzer: {human}\nAssistent: {assistant}\n"
 
 
 
 
 
33
 
34
  # Die aktuelle Nachricht hinzufügen
35
  full_prompt += f"Benutzer: {message}\nAssistent: "
@@ -60,23 +101,82 @@ def chat_with_llm(message, history, system_prompt_text):
60
 
61
  # Definition der Gradio-UI mit Blocks
62
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
63
- gr.Markdown("# GPT-OSS Chat mit Prompt-Engineering")
64
- gr.Markdown("Geben Sie unten einen Prompt-Kontext ein, um das Verhalten des LLM zu steuern. Schreiben Sie dann Ihre Nachricht in das Chat-Feld.")
65
-
66
- # Eingabefeld für den System-Prompt
67
- system_prompt_input = gr.Textbox(
68
- label="Prompt-Kontext (Optional)",
69
- placeholder="z. B. 'Sie sind ein Experte für das Schreiben von Gedichten.'",
70
- lines=3
71
- )
72
 
73
- # Die Chat-Oberfläche, die unsere Funktion verwendet
74
- chat_interface = gr.ChatInterface(
75
- fn=chat_with_llm,
76
- chatbot=gr.Chatbot(height=500),
77
- additional_inputs=[system_prompt_input],
78
- type='messages'
79
- )
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
 
81
  if __name__ == "__main__":
82
  demo.launch()
 
17
  print(f"Fehler beim Laden des Modells: {e}")
18
  pipe = None
19
 
20
+ @spaces.GPU
21
+ def compress_context(context_text, compression_prompt):
22
+ """
23
+ Komprimiert den gegebenen Kontext mit GPT-OSS basierend auf dem Komprimierungs-Prompt.
24
+ """
25
+ if not pipe:
26
+ return "Modell konnte nicht geladen werden. Bitte überprüfen Sie die Hardware-Konfiguration oder das Modell-Repository."
27
+
28
+ if not context_text.strip():
29
+ return ""
30
+
31
+ # Komprimierungs-Prompt mit Kontext kombinieren
32
+ full_prompt = f"{compression_prompt}\n\nKontext zu komprimieren:\n{context_text}\n\nKomprimierte Version:"
33
+
34
+ # Komprimierung generieren
35
+ outputs = pipe(
36
+ full_prompt,
37
+ max_new_tokens=200, # Mehr Tokens für Komprimierung
38
+ do_sample=True,
39
+ temperature=0.3, # Niedrigere Temperatur für konsistentere Komprimierung
40
+ top_k=50,
41
+ top_p=0.95,
42
+ pad_token_id=pipe.tokenizer.eos_token_id
43
+ )
44
+
45
+ # Extrahieren der komprimierten Version
46
+ response = outputs[0]["generated_text"]
47
+
48
+ # Nur die komprimierte Version extrahieren
49
+ if "Komprimierte Version:" in response:
50
+ compressed = response.split("Komprimierte Version:")[-1].strip()
51
+ else:
52
+ compressed = response.strip()
53
+
54
+ return compressed
55
+
56
  @spaces.GPU
57
+ def chat_with_llm(message, history, system_prompt_text, compressed_context):
58
  """
59
+ Verarbeitet die Benutzernachricht, fügt den Chat-Verlauf, System-Prompt und komprimierten Kontext hinzu und
60
  generiert eine Antwort vom LLM.
61
  """
62
  if not pipe:
63
  return "Modell konnte nicht geladen werden. Bitte überprüfen Sie die Hardware-Konfiguration oder das Modell-Repository."
64
 
65
+ # Den System-Prompt, komprimierten Kontext und den vorherigen Chat-Verlauf kombinieren
66
  full_prompt = f"{system_prompt_text}\n\n"
67
+ if compressed_context and compressed_context.strip():
68
+ full_prompt += f"Kontext: {compressed_context}\n\n"
69
+ for msg in history:
70
+ if msg['role'] == 'user':
71
+ full_prompt += f"Benutzer: {msg['content']}\n"
72
+ elif msg['role'] == 'assistant':
73
+ full_prompt += f"Assistent: {msg['content']}\n"
74
 
75
  # Die aktuelle Nachricht hinzufügen
76
  full_prompt += f"Benutzer: {message}\nAssistent: "
 
101
 
102
  # Definition der Gradio-UI mit Blocks
103
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
104
+ gr.Markdown("# GPT-OSS Context Compression Chat")
105
+ gr.Markdown("**Schritt 1:** Geben Sie Ihren Kontext ein und lassen Sie ihn komprimieren. **Schritt 2:** Chatten Sie mit dem komprimierten Kontext.")
 
 
 
 
 
 
 
106
 
107
+ # State für komprimierten Kontext
108
+ compressed_context_state = gr.State("")
109
+
110
+ with gr.Tab("1. Kontext Komprimierung"):
111
+ gr.Markdown("### Kontext eingeben und komprimieren")
112
+
113
+ # Eingabefeld für den ursprünglichen Kontext
114
+ context_input = gr.Textbox(
115
+ label="Kontext zum Komprimieren",
116
+ placeholder="Geben Sie hier Ihren langen Kontext ein (z.B. Dokument, Artikel, etc.)...",
117
+ lines=10,
118
+ max_lines=20
119
+ )
120
+
121
+ # Komprimierungs-Prompt (von dir definiert)
122
+ compression_prompt_input = gr.Textbox(
123
+ label="Komprimierungs-Prompt",
124
+ value="Fasse den folgenden Text präzise und strukturiert zusammen. Behalte alle wichtigen Informationen, Fakten und Details bei, aber entferne Redundanzen und unwichtige Füllwörter. Die Zusammenfassung soll als Kontext für weitere Gespräche dienen.",
125
+ lines=4
126
+ )
127
+
128
+ compress_btn = gr.Button("Kontext komprimieren", variant="primary")
129
+
130
+ # Ausgabe der Komprimierung
131
+ compressed_output = gr.Textbox(
132
+ label="Komprimierter Kontext",
133
+ lines=6,
134
+ interactive=False
135
+ )
136
+
137
+ # Komprimierungs-Event
138
+ compress_btn.click(
139
+ fn=compress_context,
140
+ inputs=[context_input, compression_prompt_input],
141
+ outputs=[compressed_output]
142
+ ).then(
143
+ fn=lambda x: x, # Kopiere komprimierten Kontext in State
144
+ inputs=[compressed_output],
145
+ outputs=[compressed_context_state]
146
+ )
147
+
148
+ with gr.Tab("2. Chat mit Kontext"):
149
+ gr.Markdown("### Chat mit dem komprimierten Kontext")
150
+
151
+ # Anzeige des aktuellen komprimierten Kontexts
152
+ current_context_display = gr.Textbox(
153
+ label="Aktueller komprimierter Kontext",
154
+ lines=4,
155
+ interactive=False,
156
+ value="Noch kein Kontext komprimiert. Wechseln Sie zu Tab 1."
157
+ )
158
+
159
+ # System-Prompt für Chat
160
+ system_prompt_input = gr.Textbox(
161
+ label="System-Prompt (Optional)",
162
+ placeholder="z. B. 'Sie sind ein hilfsreicher Assistent.'",
163
+ lines=2
164
+ )
165
+
166
+ # Chat-Interface
167
+ chat_interface = gr.ChatInterface(
168
+ fn=chat_with_llm,
169
+ chatbot=gr.Chatbot(height=400),
170
+ additional_inputs=[system_prompt_input, compressed_context_state],
171
+ type='messages'
172
+ )
173
+
174
+ # Update der Kontext-Anzeige wenn sich der State ändert
175
+ compressed_context_state.change(
176
+ fn=lambda x: x if x else "Noch kein Kontext komprimiert. Wechseln Sie zu Tab 1.",
177
+ inputs=[compressed_context_state],
178
+ outputs=[current_context_display]
179
+ )
180
 
181
  if __name__ == "__main__":
182
  demo.launch()
test.py CHANGED
@@ -28,8 +28,11 @@ def chat_with_llm(message, history, system_prompt_text):
28
 
29
  # Den System-Prompt und den vorherigen Chat-Verlauf kombinieren
30
  full_prompt = f"{system_prompt_text}\n\n"
31
- for human, assistant in history:
32
- full_prompt += f"Benutzer: {human}\nAssistent: {assistant}\n"
 
 
 
33
 
34
  # Die aktuelle Nachricht hinzufügen
35
  full_prompt += f"Benutzer: {message}\nAssistent: "
 
28
 
29
  # Den System-Prompt und den vorherigen Chat-Verlauf kombinieren
30
  full_prompt = f"{system_prompt_text}\n\n"
31
+ for msg in history:
32
+ if msg['role'] == 'user':
33
+ full_prompt += f"Benutzer: {msg['content']}\n"
34
+ elif msg['role'] == 'assistant':
35
+ full_prompt += f"Assistent: {msg['content']}\n"
36
 
37
  # Die aktuelle Nachricht hinzufügen
38
  full_prompt += f"Benutzer: {message}\nAssistent: "