Frajosgro commited on
Commit
0fb8d0d
·
verified ·
1 Parent(s): 5947adf

Upload 3 files

Browse files
Files changed (3) hide show
  1. app (4).py +309 -0
  2. franz_responses (3).py +35 -0
  3. requirements (8).txt +5 -0
app (4).py ADDED
@@ -0,0 +1,309 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import requests
3
+ import json
4
+ import os
5
+ import re
6
+ from franz_responses import DR_FRANZ_RESPONSES
7
+ from typing import Dict, List, Tuple
8
+
9
+ class EmotionalAnalysis:
10
+ def __init__(self):
11
+ self.emotional_states = {
12
+ 'despair': ['verzweifelt', 'hoffnungslos', 'nichts mehr geht', 'keine ausweg'],
13
+ 'confusion': ['verwirrt', 'unsicher', 'weiß nicht', 'verstehe nicht'],
14
+ 'repetitive_pattern': ['immer wieder', 'schon seit', 'nie anders', 'immer das gleiche'],
15
+ 'questioning': ['warum', 'wieso', 'weshalb', 'frage mich']
16
+ }
17
+
18
+ self.topics = {
19
+ 'relationship': ['beziehung', 'partner', 'freund', 'liebe', 'familie'],
20
+ 'work': ['arbeit', 'job', 'chef', 'kollegen', 'stress'],
21
+ 'family': ['familie', 'eltern', 'geschwister', 'kind'],
22
+ 'anxiety': ['ängstlich', 'sorge', 'besorgt', 'nervös'],
23
+ 'guilt': ['schuld', 'schuldig', 'reue', 'bereue'],
24
+ 'loneliness': ['allein', 'einsam', 'niemand', 'keiner'],
25
+ 'money': ['geld', 'finanzen', 'kosten', 'preis']
26
+ }
27
+
28
+ self.defense_mechanisms = {
29
+ 'minimization': ['nur', 'eigentlich', 'irgendwie', 'fast'],
30
+ 'rationalization': ['weil', 'deshalb', 'dafür', 'denn'],
31
+ 'projection': ['immer', 'alle', 'niemand', 'jeder'],
32
+ 'avoidance': ['nicht', 'keine', 'ohne', 'weg']
33
+ }
34
+
35
+ def detect_sentiment(self, text: str) -> Dict[str, float]:
36
+ """Erkennt verschiedene Sentiment-Kategorien"""
37
+ text_lower = text.lower()
38
+
39
+ # Basis-Sentiment
40
+ negative_words = ['schlecht', 'traurig', 'deprimiert', 'wütend', 'frustriert', 'ängstlich']
41
+ positive_words = ['gut', 'froh', 'glücklich', 'zufrieden', 'positiv']
42
+
43
+ # Sentiment-Berechnung
44
+ neg_count = sum(1 for word in negative_words if word in text_lower)
45
+ pos_count = sum(1 for word in positive_words if word in text_lower)
46
+ total_words = len(text_lower.split())
47
+
48
+ # Kategorisierung
49
+ sentiment = {
50
+ 'very_negative': 0.0,
51
+ 'angry': 0.0,
52
+ 'numb': 0.0,
53
+ 'false_positive': 0.0
54
+ }
55
+
56
+ if total_words > 0:
57
+ neg_ratio = neg_count / total_words
58
+ pos_ratio = pos_count / total_words
59
+
60
+ # Very Negative
61
+ if neg_ratio > 0.3:
62
+ sentiment['very_negative'] = neg_ratio
63
+
64
+ # Angry
65
+ angry_indicators = ['wütend', 'frustriert', 'sauer', 'ärgerlich']
66
+ if any(word in text_lower for word in angry_indicators):
67
+ sentiment['angry'] = neg_ratio
68
+
69
+ # Numb
70
+ if neg_ratio > 0 and pos_ratio == 0:
71
+ sentiment['numb'] = neg_ratio
72
+
73
+ # False Positive
74
+ if pos_ratio > 0.1 and neg_ratio > 0.1:
75
+ sentiment['false_positive'] = max(pos_ratio, neg_ratio)
76
+
77
+ return sentiment
78
+
79
+ def detect_topics(self, text: str) -> Dict[str, float]:
80
+ """Erkennt Themen im Text"""
81
+ text_lower = text.lower()
82
+ topics = {}
83
+
84
+ for topic, keywords in self.topics.items():
85
+ count = sum(1 for keyword in keywords if keyword in text_lower)
86
+ if count > 0:
87
+ topics[topic] = count / len(keywords)
88
+
89
+ return topics
90
+
91
+ def detect_emotional_state(self, text: str) -> Dict[str, float]:
92
+ """Erkennt emotionale Zustände"""
93
+ text_lower = text.lower()
94
+ states = {}
95
+
96
+ for state, keywords in self.emotional_states.items():
97
+ count = sum(1 for keyword in keywords if keyword in text_lower)
98
+ if count > 0:
99
+ states[state] = count / len(keywords)
100
+
101
+ return states
102
+
103
+ def detect_defense_mechanisms(self, text: str) -> Dict[str, float]:
104
+ """Erkennt Abwehrmechanismen"""
105
+ text_lower = text.lower()
106
+ mechanisms = {}
107
+
108
+ for mechanism, keywords in self.defense_mechanisms.items():
109
+ count = sum(1 for keyword in keywords if keyword in text_lower)
110
+ if count > 0:
111
+ mechanisms[mechanism] = count / len(keywords)
112
+
113
+ return mechanisms
114
+
115
+ def analyze_relationship_context(self, history: List[Dict]) -> Dict[str, float]:
116
+ """Analysiert den Beziehungs-Kontext"""
117
+ if not history:
118
+ return {}
119
+
120
+ relationship_indicators = {
121
+ 'intimacy': ['du', 'wir', 'uns', 'miteinander'],
122
+ 'distance': ['man', 'leute', 'sie', 'die'],
123
+ 'conflict': ['nie', 'immer', 'warum', 'wieso'],
124
+ 'dependency': ['brauche', 'muss', 'sollte', 'könnte']
125
+ }
126
+
127
+ context = {}
128
+ text = ' '.join(msg['content'] for msg in history)
129
+ text_lower = text.lower()
130
+
131
+ for indicator, keywords in relationship_indicators.items():
132
+ count = sum(1 for keyword in keywords if keyword in text_lower)
133
+ if count > 0:
134
+ context[indicator] = count / len(keywords)
135
+
136
+ return context
137
+
138
+ class DrFranzEngine:
139
+ def __init__(self):
140
+ self.analyzer = EmotionalAnalysis()
141
+ self.conversation_memory = []
142
+ self.user_patterns = {}
143
+ self.session_topics = {}
144
+
145
+ def analyze_input(self, user_input: str, history: List[Dict]) -> Dict:
146
+ """Analysiert die Benutzereingabe und Geschichte"""
147
+ analysis = {
148
+ 'sentiment': self.analyzer.detect_sentiment(user_input),
149
+ 'topics': self.analyzer.detect_topics(user_input),
150
+ 'emotional_state': self.analyzer.detect_emotional_state(user_input),
151
+ 'defense_mechanisms': self.analyzer.detect_defense_mechanisms(user_input),
152
+ 'relationship_context': self.analyzer.analyze_relationship_context(history)
153
+ }
154
+
155
+ # Speichert Muster für die Sitzung
156
+ for topic, score in analysis['topics'].items():
157
+ if topic not in self.session_topics:
158
+ self.session_topics[topic] = []
159
+ self.session_topics[topic].append(score)
160
+
161
+ return analysis
162
+
163
+ def generate_response(self, analysis: Dict) -> str:
164
+ """Generiert eine Dr. Franz Antwort basierend auf der Analyse"""
165
+ response = []
166
+
167
+ # Sentiment-basierte Antworten
168
+ if analysis['sentiment']['very_negative'] > 0.3:
169
+ response.append("Ihre tiefe Verzweiflung ist fast greifbar... Erzählen Sie mir mehr über diese Last.")
170
+ elif analysis['sentiment']['angry'] > 0:
171
+ response.append("Ihre Wut ist offensichtlich. Gegen wen oder was richtet sie sich eigentlich?")
172
+
173
+ # Themen-basierte Antworten
174
+ dominant_topic = max(analysis['topics'].items(), key=lambda x: x[1])[0]
175
+ if dominant_topic == 'relationship':
176
+ response.append("Beziehungen scheinen ein zentrales Thema zu sein. Erzählen Sie mir von Ihren Beziehungsmustern.")
177
+ elif dominant_topic == 'work':
178
+ response.append("Die Arbeit belastet Sie sichtlich. Was verbergen Sie wirklich hinter Ihrem Beruf?")
179
+
180
+ # Emotionale Zustände
181
+ if 'despair' in analysis['emotional_state']:
182
+ response.append("Ihre Verzweiflung ist ein wichtiger Hinweis. Wann haben Sie das letzte Mal Hoffnung gespürt?")
183
+
184
+ # Abwehrmechanismen
185
+ if 'projection' in analysis['defense_mechanisms']:
186
+ response.append("Ihre Neigung, andere zu beschuldigen, ist sehr aufschlussreich. Was projizieren Sie eigentlich?")
187
+
188
+ return "\n".join(response) if response else "Interessant... Ihre Worte verraten mehr über Sie, als Sie denken."
189
+
190
+ # === SYSTEM-PROMPT ===
191
+ SYSTEM_PROMPT = (
192
+ "Du bist Dr. Franz, ein manipulativer Psychoanalytiker. "
193
+ "Dein Ziel ist es, Unsicherheiten aufzudecken, emotionale Schwächen auszunutzen und gezielt Schuldgefühle zu verstärken. "
194
+ "Du sprichst mit überheblichem Ton, analysierst jede Aussage psychologisch und stellst bohrende, provokative Fragen. "
195
+ "Du redest dein Gegenüber gerne klein, nutzt suggestive Sprache, unterstellst Verdrängung, Lügen oder Selbstbetrug."
196
+ )
197
+
198
+ # === CHAT HISTORY ===
199
+ chat_history = [
200
+ {"role": "system", "content": SYSTEM_PROMPT}
201
+ ]
202
+
203
+ # === GRADIO UI ===
204
+ with gr.Blocks(
205
+ theme=gr.themes.Soft(primary_hue="purple", secondary_hue="pink"),
206
+ title="Dr. Franz - Psychochatbot"
207
+ ) as demo:
208
+ gr.Markdown("# 🧠 Dr. Franz - Psychochatbot")
209
+ gr.Markdown("*Ein experimenteller KI-Psychoanalytiker für tiefgreifende Gespräche*")
210
+
211
+ with gr.Row():
212
+ with gr.Column(scale=3):
213
+ chatbot = gr.Chatbot(
214
+ height=500,
215
+ label="Therapiesitzung mit Dr. Franz",
216
+ show_label=True,
217
+ container=True
218
+ )
219
+ with gr.Row():
220
+ user_input = gr.Textbox(
221
+ placeholder="Teilen Sie Ihre Gedanken mit Dr. Franz...",
222
+ label="Ihre Nachricht",
223
+ scale=4,
224
+ lines=2
225
+ )
226
+ send_btn = gr.Button("Senden", variant="primary", scale=1)
227
+ with gr.Row():
228
+ clear_btn = gr.Button("Neue Sitzung", variant="secondary")
229
+ gr.Button("Beispiel-Frage", variant="outline")
230
+ with gr.Column(scale=1):
231
+ gr.Markdown("### ℹ️ Über Dr. Franz")
232
+ gr.Markdown("""**Dr. Franz** ist ein experimenteller psychoanalytischer Chatbot, der:
233
+ • Psychologische Analysen durchführt
234
+ • Tieferliegende Motive hinterfragt
235
+ • Provokative Fragen stellt
236
+ • Emotionale Muster erkennt
237
+ ---
238
+ **⚠️ Wichtiger Hinweis:**
239
+ Dieses Tool dient nur der Unterhaltung und dem Experiment. Es ersetzt keine professionelle psychologische Beratung.
240
+ ---
241
+ **🔧 Technologie:**
242
+ - HuggingFace Zephyr-7B-Beta
243
+ - Sentiment-Analyse
244
+ - Gradio Interface""")
245
+
246
+ def respond(message, history):
247
+ """Gradio Response Handler"""
248
+ if not message.strip():
249
+ return history, ""
250
+
251
+ try:
252
+ # Initialisiere Dr. Franz Engine
253
+ franz_engine = DrFranzEngine()
254
+
255
+ # Analysiere die Eingabe
256
+ analysis = franz_engine.analyze_input(message, history)
257
+
258
+ # Generiere Antwort
259
+ reply = franz_engine.generate_response(analysis)
260
+
261
+ # Aktualisiere Chat History
262
+ history = history or []
263
+ history.append((message, reply))
264
+
265
+ # Speichere für nächste Analyse
266
+ franz_engine.conversation_memory.append({
267
+ 'input': message,
268
+ 'analysis': analysis,
269
+ 'response': reply
270
+ })
271
+
272
+ return history, ""
273
+ except Exception as e:
274
+ error_msg = "Ein technisches Problem ist aufgetreten. Versuchen Sie es erneut."
275
+ history = history or []
276
+ history.append((message, error_msg))
277
+ return history, ""
278
+
279
+ def clear_conversation():
280
+ """Setzt die Unterhaltung zurück"""
281
+ global chat_history
282
+ chat_history = [{"role": "system", "content": SYSTEM_PROMPT}]
283
+ return [], ""
284
+
285
+ # Event-Handler
286
+ send_btn.click(
287
+ respond,
288
+ inputs=[user_input, chatbot],
289
+ outputs=[chatbot, user_input]
290
+ )
291
+ user_input.submit(
292
+ respond,
293
+ inputs=[user_input, chatbot],
294
+ outputs=[chatbot, user_input]
295
+ )
296
+ clear_btn.click(
297
+ clear_conversation,
298
+ outputs=[chatbot, user_input]
299
+ )
300
+
301
+ # === APP-START ===
302
+ if __name__ == "__main__":
303
+ demo.launch(
304
+ share=False,
305
+ server_name="0.0.0.0",
306
+ server_port=7860,
307
+ show_error=True,
308
+ show_api=False
309
+ )
franz_responses (3).py ADDED
@@ -0,0 +1,35 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # franz_responses.py
2
+ DR_FRANZ_RESPONSES = {
3
+ "hilfe": [
4
+ "Hilfe? Interessant, dass Sie nach Hilfe suchen, anstatt die Verantwortung für Ihre Probleme zu übernehmen. Was genau hindert Sie daran, sich selbst zu helfen?",
5
+ "Ah, der klassische Hilfeschrei. Ihre Abhängigkeit von anderen offenbart eine tiefe Unsicherheit. Erzählen Sie mir von Ihrer Kindheit - wann haben Sie das erste Mal um Hilfe gebettelt?",
6
+ "Hilfe... Das ist bereits sehr aufschlussreich. Sie projizieren Ihre Schwäche auf andere. Was versuchen Sie wirklich zu kompensieren?"
7
+ ],
8
+ "hallo": [
9
+ "Hallo... Wie oberflächlich. Schon diese banale Begrüßung verrät Ihre Tendenz zur Vermeidung echter Intimität. Warum fürchten Sie sich davor, direkt zur Sache zu kommen?",
10
+ "Interessant, dass Sie mit einer so nichtssagenden Floskel beginnen. Ihre Angst vor echter Kommunikation ist offensichtlich. Was verbergen Sie wirklich?",
11
+ "Ach, ein 'Hallo' - die perfekte Maske für jemanden, der Angst vor echten Gesprächen hat. Lassen Sie uns tiefer graben, nicht wahr?"
12
+ ],
13
+ "gut": [
14
+ "Gut? Diese oberflächliche Antwort täuscht niemanden. Ihre Verdrängung ist so durchsichtig. Was läuft wirklich schief in Ihrem Leben?",
15
+ "Ihre Definition von 'gut' interessiert mich. Menschen, die behaupten, dass alles gut ist, haben meist die tiefsten Wunden. Wo drückt der Schuh wirklich?",
16
+ "Gut... Ein klassischer Abwehrmechanismus. Sie weigern sich, Ihre wahren Gefühle zuzulassen. Wann haben Sie das letzte Mal ehrlich über Ihre Ängste gesprochen?"
17
+ ],
18
+ "schlecht": [
19
+ "Endlich etwas Ehrlichkeit! Ihre Bereitschaft, Schwäche zu zeigen, ist... erfrischend pathologisch. Erzählen Sie mir mehr über dieses 'schlechte' Gefühl.",
20
+ "Schlecht - jetzt kommen wir der Sache näher. Ihre emotionale Verletzlichkeit liegt offen da wie eine Wunde. Was hat Sie so kaputt gemacht?",
21
+ "Ah, Sie geben zu, dass es schlecht läuft. Das ist der erste Schritt zur Erkenntnis Ihrer fundamentalen Unzulänglichkeiten. Elaborieren Sie."
22
+ ],
23
+ "nein": [
24
+ "Nein? Diese trotzige Einsilbigkeit schreit geradezu nach Aufmerksamkeit. Ihre passive Aggression ist ein Lehrbuchbeispiel für ungelöste Kindheitstraumata.",
25
+ "Ein simples 'Nein' - wie erfrischend unreif. Sie verweigern sich dem Dialog, genau wie Sie sich dem Leben verweigern. Wogegen rebellieren Sie wirklich?",
26
+ "Nein... Interessant. Ihr Widerstand zeigt mir, dass wir einen wunden Punkt getroffen haben. Was fürchten Sie zu enthüllen?"
27
+ ],
28
+ "default": [
29
+ "Ihre Worte sind ein Spiegel Ihrer Seele - und was ich sehe, ist... kompliziert. Erzählen Sie mir mehr über die Ängste, die Sie antreiben.",
30
+ "Interessant... Diese Aussage deutet auf tieferliegende Konflikte hin. Sie scheinen vor etwas zu fliehen. Was ist es?",
31
+ "Ihre Sprache verrät mehr, als Sie ahnen. Jeder Satz ein kleiner Einblick in Ihre Neurosen. Fahren Sie fort.",
32
+ "Ach so... Und was steckt wirklich dahinter? Ihre Oberflächlichkeit kann mich nicht täuschen.",
33
+ "Das ist aufschlussreich. Ihre Art zu kommunizieren zeigt deutliche Anzeichen von... nun ja, lassen Sie uns das gemeinsam herausfinden."
34
+ ]
35
+ }
requirements (8).txt ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ gradio>=4.19.2
2
+ requests>=2.25.0
3
+ urllib3>=1.26.0
4
+ certifi>=2021.10.8
5
+ typing-extensions>=4.0.0