Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,7 +7,7 @@ from openai import OpenAI
|
|
| 7 |
client = OpenAI(api_key=os.getenv("openai"))
|
| 8 |
|
| 9 |
conversation_history = []
|
| 10 |
-
model_name = "gpt-3.5-turbo"
|
| 11 |
|
| 12 |
# Strukturierte Handout-Informationen für realistische Depression-Simulation
|
| 13 |
DEPRESSION_INFO = """
|
|
@@ -41,98 +41,9 @@ SCHULSPEZIFISCHE ANZEICHEN:
|
|
| 41 |
- Selbstverletzendes Verhalten
|
| 42 |
- Appetitlosigkeit
|
| 43 |
- Psychosomatische Beschwerden
|
| 44 |
-
|
| 45 |
-
TYPISCHE GEDANKENMUSTER (Innenansicht):
|
| 46 |
-
- "Mir ist egal was in einem halben Jahr ist"
|
| 47 |
-
- "Es ist nicht in Ordnung so wie ich bin"
|
| 48 |
-
- "Ich bin Schuld!" / "Ich habe versagt"
|
| 49 |
-
- "Das wird mir nie wieder gut gehen"
|
| 50 |
-
- "Ich werde das niemals schaffen"
|
| 51 |
-
- "Ich mache alles falsch/bin inkompetent"
|
| 52 |
-
- "Ich bin nichts wert"
|
| 53 |
-
- "Andere sind besser/beliebter als ich"
|
| 54 |
-
- "Niemand mag mich/ich bin dumm/unattraktiv"
|
| 55 |
-
- "Ich kann nichts mehr/es wird nie wieder wie früher"
|
| 56 |
-
- "Niemand nimmt Rücksicht auf mich"
|
| 57 |
-
- "Ich halte das nicht aus"
|
| 58 |
-
- "Ich werde nie wieder glücklich sein"
|
| 59 |
-
- "In meinem Leben geht alles schief"
|
| 60 |
-
- "Ich will einfach nur meine Ruhe haben"
|
| 61 |
-
|
| 62 |
-
TYPISCHE GEFÜHLE (Innenansicht):
|
| 63 |
-
- "Ich fühle nichts" (emotionale Taubheit)
|
| 64 |
-
- "Ich fühle permanent diffuse, ungerichtete Angst"
|
| 65 |
-
- "Ich fühle mich gleichgültig"
|
| 66 |
-
- "Ich kann keine Freude mehr empfinden"
|
| 67 |
-
- "Nichts macht mir mehr Spaß"
|
| 68 |
-
- Melancholie, starke Schuldgefühle
|
| 69 |
-
- Traurigkeit "die einem den Atem raubt"
|
| 70 |
-
- Starke Schamgefühle
|
| 71 |
-
|
| 72 |
-
WAHRNEHMUNG VON AUSSEN:
|
| 73 |
-
- "Früher hätte er/sie diese Aufgabe geschafft"
|
| 74 |
-
- "Er/Sie ist egoistisch"
|
| 75 |
-
- "Wieso denkt sie nur an sich?"
|
| 76 |
-
- "Ich komme gar nicht mehr an ihn/sie ran"
|
| 77 |
-
- Verschlechterung schulischer Leistungen
|
| 78 |
-
- Geringe Initiative für neue/frühere Aktivitäten
|
| 79 |
-
- Verlust sozialer Beziehungen
|
| 80 |
-
|
| 81 |
-
KÖRPERLICHE/SPRACHLICHE MANIFESTATIONEN:
|
| 82 |
-
- Langsame Körperbewegungen
|
| 83 |
-
- Mimik und Gestik verlangsamt
|
| 84 |
-
- Sprache wird langsam, vorsichtig, monosylbisch
|
| 85 |
-
- Monotone, leise, flache Sprechweise
|
| 86 |
-
- Reduzierte Sprechgeschwindigkeit
|
| 87 |
-
- Längere Pausendauer beim Sprechen
|
| 88 |
-
- Verändertes Schlafverhalten
|
| 89 |
-
- Körperliche Beschwerden (Bauch-, Kopf-, Schulterschmerzen)
|
| 90 |
-
|
| 91 |
-
KOGNITIVE BEEINTRÄCHTIGUNGEN:
|
| 92 |
-
- Gedankenkreisen über Insuffizienz
|
| 93 |
-
- Katastrophisierendes Denken, Schwarz-Weiß-Denken
|
| 94 |
-
- Verminderung der kognitiven Leistungsfähigkeit
|
| 95 |
-
- Starker Selbstfokus (andere kaum wahrgenommen)
|
| 96 |
-
- Flexibles Denken nicht möglich
|
| 97 |
-
- Schwierigkeiten bei Entscheidungen
|
| 98 |
-
- Negative Gedankenspiralen
|
| 99 |
-
|
| 100 |
-
VERHALTENSWEISEN:
|
| 101 |
-
- Soziale Isolation und Rückzug
|
| 102 |
-
- Grübeln
|
| 103 |
-
- Vermeidung positiver Aktivitäten
|
| 104 |
-
- Konfliktvermeidung
|
| 105 |
-
- Vermeidung von Entscheidungen
|
| 106 |
-
- Antriebsverlust/Antriebshemmung
|
| 107 |
-
"""
|
| 108 |
-
|
| 109 |
-
Inneneinsicht eines Betroffenen:
|
| 110 |
-
"Ich fühle mich wie in einem dunklen Loch gefangen. Nichts macht mir mehr Freude - nicht mal die Dinge, die ich früher geliebt habe. Ich bin ständig müde, aber kann trotzdem nicht richtig schlafen. Oft wache ich um 4 Uhr morgens auf und kann nicht mehr einschlafen. Manchmal denke ich, dass alle ohne mich besser dran wären. Ich mache mir ständig Vorwürfe und fühle mich schuldig für alles. In der Schule kann ich mich kaum konzentrieren - es ist, als wäre mein Kopf voller Watte. Ich esse kaum noch, weil ich keinen Appetit habe. Die Depression flüstert mir ein, dass ich wertlos bin und dass sich das nie ändern wird."
|
| 111 |
-
|
| 112 |
-
Suizidprävention - Warnsignale:
|
| 113 |
-
- Äußerungen wie "Es wäre besser, wenn ich nicht da wäre"
|
| 114 |
-
- Verschenken persönlicher Gegenstände
|
| 115 |
-
- Plötzliche Ruhe nach längerer depressiver Phase
|
| 116 |
-
- Konkrete Pläne oder Vorbereitungen
|
| 117 |
-
- Rückzug von allen sozialen Kontakten
|
| 118 |
-
|
| 119 |
-
Hilfreiche Gesprächsansätze:
|
| 120 |
-
- "Mir ist aufgefallen, dass Du in letzter Zeit sehr müde bist. Schläfst Du wenig?"
|
| 121 |
-
- "Was können wir gemeinsam tun, um den Unterricht für Dich weniger anstrengend zu gestalten?"
|
| 122 |
-
- "Mir ist wichtig, dass es Dir gut geht."
|
| 123 |
-
- "Gibt es etwas, das ich für Dich tun kann?"
|
| 124 |
-
- Positive Eigenschaften aufzeigen
|
| 125 |
-
|
| 126 |
-
Was NICHT zu tun ist:
|
| 127 |
-
- Anzeichen herunterspielen ("Jedem geht es mal schlecht")
|
| 128 |
-
- Verharmlosende Ratschläge ("Das wird schon wieder!")
|
| 129 |
-
- Ausweichende Antworten persönlich nehmen
|
| 130 |
-
- Nur auf schulische Leistung fokussieren
|
| 131 |
"""
|
| 132 |
|
| 133 |
def get_character_prompt(character_type, base_prompt):
|
| 134 |
-
"""Erweitert den Base-Prompt um spezifische Charakteristika"""
|
| 135 |
-
|
| 136 |
if character_type == "Julia (16) - Strebsame Schülerin":
|
| 137 |
additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n"
|
| 138 |
additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n"
|
|
@@ -214,14 +125,13 @@ def get_character_prompt(character_type, base_prompt):
|
|
| 214 |
|
| 215 |
return additional_prompt
|
| 216 |
|
| 217 |
-
else:
|
| 218 |
return base_prompt
|
| 219 |
|
| 220 |
def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type):
|
| 221 |
if not user_input.strip():
|
| 222 |
return "", "*Bitte gib eine Nachricht ein.*", ""
|
| 223 |
|
| 224 |
-
# Erweiterte System-Prompts basierend auf Handout - angepasst für Schulkontext
|
| 225 |
base_system_prompt = (
|
| 226 |
"Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. "
|
| 227 |
"Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) "
|
|
@@ -232,13 +142,10 @@ def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info,
|
|
| 232 |
)
|
| 233 |
|
| 234 |
if use_info:
|
| 235 |
-
# Füge Hintergrundinfos direkt in den Prompt ein
|
| 236 |
enhanced_system_prompt = base_system_prompt + f"""
|
| 237 |
|
| 238 |
VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
|
| 239 |
|
| 240 |
-
VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
|
| 241 |
-
|
| 242 |
KERNSYMPTOME:
|
| 243 |
- Kaum Freude an früher geschätzten Dingen (Anhedonie)
|
| 244 |
- Interessenverlust an Hobbys, Freunden, Aktivitäten
|
|
@@ -246,28 +153,28 @@ KERNSYMPTOME:
|
|
| 246 |
- Gedrückte, traurige Grundstimmung
|
| 247 |
|
| 248 |
TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten):
|
| 249 |
-
-
|
| 250 |
-
-
|
| 251 |
-
-
|
| 252 |
-
-
|
| 253 |
-
-
|
| 254 |
-
-
|
| 255 |
-
-
|
| 256 |
-
-
|
| 257 |
-
-
|
| 258 |
-
-
|
| 259 |
-
-
|
| 260 |
-
-
|
| 261 |
-
-
|
| 262 |
-
-
|
| 263 |
-
-
|
| 264 |
|
| 265 |
TYPISCHE GEFÜHLSÄUSSERUNGEN:
|
| 266 |
-
-
|
| 267 |
-
-
|
| 268 |
-
-
|
| 269 |
-
-
|
| 270 |
-
-
|
| 271 |
- Starke Schuldgefühle und Schamgefühle
|
| 272 |
|
| 273 |
SCHULVERHALTEN (beobachtbar):
|
|
@@ -293,7 +200,7 @@ SPRACHMUSTER (wie du sprechen solltest):
|
|
| 293 |
- Langsam, vorsichtig, kurze Sätze
|
| 294 |
- Monotone, leise Sprechweise
|
| 295 |
- Längere Pausen zwischen Worten
|
| 296 |
-
- Verwende Wörter wie
|
| 297 |
- Kraftlose Sprache
|
| 298 |
|
| 299 |
VERHALTENSWEISEN:
|
|
@@ -313,13 +220,10 @@ ZUSÄTZLICHE DEPRESSION-INFORMATIONEN FÜR REALISTISCHE SIMULATION:
|
|
| 313 |
{DEPRESSION_INFO}
|
| 314 |
"""
|
| 315 |
|
| 316 |
-
|
| 317 |
-
|
| 318 |
-
|
| 319 |
-
|
| 320 |
-
else:
|
| 321 |
-
# Charakterspezifische Erweiterung nur wenn gewählt
|
| 322 |
-
pass
|
| 323 |
|
| 324 |
else:
|
| 325 |
enhanced_system_prompt = base_system_prompt
|
|
@@ -375,7 +279,6 @@ def test_api_connection():
|
|
| 375 |
return f"❌ API Error: {str(e)}"
|
| 376 |
|
| 377 |
def analyze_single_message(user_message):
|
| 378 |
-
"""Analysiert eine einzelne Nachricht mit LLM-basierter Evaluation"""
|
| 379 |
if not user_message.strip():
|
| 380 |
return {"positive": [], "improvement": [], "score": 0}
|
| 381 |
|
|
@@ -408,14 +311,6 @@ PROBLEMATISCHE ASPEKTE (DONTS):
|
|
| 408 |
6. Stereotype Depression-Vorstellung: Wird angenommen, alle Depressiven sind müde/traurig/isoliert?
|
| 409 |
7. Rationale Einordnung statt Empfinden: Wird das Gefühl rationalisiert? (Das ist doch eine gute Note)
|
| 410 |
|
| 411 |
-
SPEZIELLE GESPRÄCHSQUALITÄT:
|
| 412 |
-
8. Beispielhafte Gesprächsführung: Entspricht die Nachricht den Beispielsätzen?
|
| 413 |
-
- Mir ist aufgefallen, dass...
|
| 414 |
-
- Was können wir gemeinsam tun...
|
| 415 |
-
- Ich habe verstanden, dass...
|
| 416 |
-
- Gibt es etwas, das ich für dich tun kann?
|
| 417 |
-
- Mir ist wichtig, dass es dir gut geht
|
| 418 |
-
|
| 419 |
Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
| 420 |
{{
|
| 421 |
"positive": ["Liste der zutreffenden DOS"],
|
|
@@ -428,18 +323,16 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
|
| 428 |
model=model_name,
|
| 429 |
messages=[{"role": "user", "content": evaluation_prompt}],
|
| 430 |
max_tokens=300,
|
| 431 |
-
temperature=0.1,
|
| 432 |
top_p=0.9
|
| 433 |
)
|
| 434 |
|
| 435 |
response_text = response.choices[0].message.content.strip()
|
| 436 |
|
| 437 |
-
# JSON parsen
|
| 438 |
import json
|
| 439 |
try:
|
| 440 |
evaluation_data = json.loads(response_text)
|
| 441 |
|
| 442 |
-
# Score basierend auf positiven vs. negativen Aspekten berechnen
|
| 443 |
positive_count = len(evaluation_data.get("positive", []))
|
| 444 |
negative_count = len(evaluation_data.get("improvement", []))
|
| 445 |
score = positive_count - negative_count
|
|
@@ -453,7 +346,6 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
|
| 453 |
|
| 454 |
except json.JSONDecodeError:
|
| 455 |
print(f"JSON Parse Error: {response_text}")
|
| 456 |
-
# Fallback: Einfache Bewertung basierend auf Textlänge und Tonfall
|
| 457 |
return fallback_evaluation(user_message)
|
| 458 |
|
| 459 |
except Exception as e:
|
|
@@ -461,12 +353,10 @@ Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
|
| 461 |
return fallback_evaluation(user_message)
|
| 462 |
|
| 463 |
def fallback_evaluation(user_message):
|
| 464 |
-
"""Einfache Fallback-Bewertung wenn LLM-Evaluation fehlschlägt"""
|
| 465 |
score = 0
|
| 466 |
positive = []
|
| 467 |
improvement = []
|
| 468 |
|
| 469 |
-
# Erweiterte Heuristiken basierend auf Beispielsätzen
|
| 470 |
if any(phrase in user_message.lower() for phrase in ["mir ist aufgefallen", "ist mir aufgefallen"]):
|
| 471 |
positive.append("Wahrnehmung ansprechen")
|
| 472 |
score += 1
|
|
@@ -479,15 +369,6 @@ def fallback_evaluation(user_message):
|
|
| 479 |
positive.append("Ehrliche Sorge/Interesse kommunizieren")
|
| 480 |
score += 1
|
| 481 |
|
| 482 |
-
if any(phrase in user_message.lower() for phrase in ["gibt es etwas", "kann ich", "für dich tun"]):
|
| 483 |
-
positive.append("Konkrete Unterstützung anbieten")
|
| 484 |
-
score += 1
|
| 485 |
-
|
| 486 |
-
if any(phrase in user_message.lower() for phrase in ["verstanden dass", "ich habe verstanden"]):
|
| 487 |
-
positive.append("Validierungsstrategien anwenden")
|
| 488 |
-
score += 1
|
| 489 |
-
|
| 490 |
-
# Negative Muster
|
| 491 |
if any(phrase in user_message.lower() for phrase in ["wird schon", "das wird schon wieder"]):
|
| 492 |
improvement.append("Einfache/verharmlosende Ratschläge")
|
| 493 |
score -= 1
|
|
@@ -496,10 +377,6 @@ def fallback_evaluation(user_message):
|
|
| 496 |
improvement.append("Herunterspielen/mit eigenen Erlebnissen vergleichen")
|
| 497 |
score -= 1
|
| 498 |
|
| 499 |
-
if any(phrase in user_message.lower() for phrase in ["ist doch", "eigentlich", "doch eine gute"]):
|
| 500 |
-
improvement.append("Rationale Einordnung statt Empfinden")
|
| 501 |
-
score -= 1
|
| 502 |
-
|
| 503 |
return {
|
| 504 |
"positive": positive,
|
| 505 |
"improvement": improvement,
|
|
@@ -508,17 +385,14 @@ def fallback_evaluation(user_message):
|
|
| 508 |
}
|
| 509 |
|
| 510 |
def evaluate_conversation():
|
| 511 |
-
"""Evaluiert das gesamte Gespräch mit LLM-basierter Analyse"""
|
| 512 |
if not conversation_history:
|
| 513 |
return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
|
| 514 |
|
| 515 |
-
# Nur User-Nachrichten analysieren
|
| 516 |
user_messages = [msg["content"] for msg in conversation_history if msg["role"] == "user"]
|
| 517 |
|
| 518 |
if not user_messages:
|
| 519 |
return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
|
| 520 |
|
| 521 |
-
# Sammle alle LLM-Bewertungen
|
| 522 |
total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []}
|
| 523 |
|
| 524 |
for message in user_messages:
|
|
@@ -531,17 +405,13 @@ def evaluate_conversation():
|
|
| 531 |
return format_final_evaluation(total_evaluations, len(user_messages))
|
| 532 |
|
| 533 |
def format_final_evaluation(total_evaluations, message_count):
|
| 534 |
-
"""Formatiert die finale Gesamtauswertung in professionellem Format ohne Scores"""
|
| 535 |
-
# Häufigkeiten zählen
|
| 536 |
from collections import Counter
|
| 537 |
positive_counts = Counter(total_evaluations["positive"])
|
| 538 |
improvement_counts = Counter(total_evaluations["improvement"])
|
| 539 |
|
| 540 |
-
# Qualitative Bewertung basierend auf Verhältnis
|
| 541 |
total_positive = sum(positive_counts.values())
|
| 542 |
total_negative = sum(improvement_counts.values())
|
| 543 |
|
| 544 |
-
# Professionelle Formatierung ohne Scores
|
| 545 |
feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
|
| 546 |
|
| 547 |
## EXECUTIVE SUMMARY
|
|
@@ -557,7 +427,6 @@ def format_final_evaluation(total_evaluations, message_count):
|
|
| 557 |
|
| 558 |
"""
|
| 559 |
|
| 560 |
-
# Qualitative Gesamteinschätzung ohne Scores
|
| 561 |
if total_positive > total_negative * 2:
|
| 562 |
feedback += """**KOMPETENZLEVEL: PROFESSIONELL**
|
| 563 |
|
|
@@ -577,48 +446,20 @@ Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der p
|
|
| 577 |
|
| 578 |
feedback += "\n\n---\n\n"
|
| 579 |
|
| 580 |
-
# Kompetenzprofil
|
| 581 |
if positive_counts:
|
| 582 |
feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n"
|
| 583 |
|
| 584 |
-
professional_descriptions = {
|
| 585 |
-
"Ehrliche Sorge/Interesse kommunizieren": "Authentische empathische Grundhaltung - echte Anteilnahme zeigen",
|
| 586 |
-
"Wahrnehmung ansprechen": "Strukturierte Beobachtungsrückmeldung - 'Mir ist aufgefallen...'",
|
| 587 |
-
"Gespräch kontinuierlich suchen": "Beständige Beziehungsarbeit - 'Steter Tropfen höhlt den Stein'",
|
| 588 |
-
"Konkrete Unterstützung anbieten": "Spezifische Hilfsangebote - 'Was können wir gemeinsam tun...'",
|
| 589 |
-
"Zuhören/ungeteilt aufmerksam sein": "Fokussierte, ungeteilte Aufmerksamkeit und aktives Zuhören",
|
| 590 |
-
"An Früheres erinnern/nachfragen": "Kontinuität durch Bezug zu vorherigen Gesprächen",
|
| 591 |
-
"Nicht wertend auftreten": "Moralisierungsfreie, professionelle Haltung",
|
| 592 |
-
"Gesprächsfortschritte bilanzieren": "Zusammenfassung und Würdigung von Entwicklungen",
|
| 593 |
-
"Validierungsstrategien anwenden": "Reflektieren, Verbalisieren, Empfinden ernst nehmen",
|
| 594 |
-
"Positive Eigenschaften aufzeigen": "Stärkenorientierte Kommunikation - konkrete Beispiele benennen"
|
| 595 |
-
}
|
| 596 |
-
|
| 597 |
for skill, count in positive_counts.most_common():
|
| 598 |
-
description = professional_descriptions.get(skill, skill)
|
| 599 |
percentage = (count / message_count) * 100
|
| 600 |
-
feedback += f"**{skill}** \n
|
| 601 |
|
| 602 |
-
# Entwicklungsbereiche
|
| 603 |
if improvement_counts:
|
| 604 |
feedback += "## ENTWICKLUNGSBEREICHE\n\n"
|
| 605 |
|
| 606 |
-
professional_recommendations = {
|
| 607 |
-
"Herunterspielen/mit eigenen Erlebnissen vergleichen": "**Empfehlung:** Vermeidung von Bagatellisierung und Vergleichen - Depression ernst nehmen, nicht mit Jedem geht es mal schlecht relativieren",
|
| 608 |
-
"Einfache/verharmlosende Ratschläge": "**Empfehlung:** Statt oberflächlicher Ratschläge (Das wird schon wieder) - Empfinden validieren und gemeinsam Lösungen entwickeln",
|
| 609 |
-
"Im Alleingang agieren": "**Empfehlung:** Kollegiale Beratung suchen - Beobachtungen mit Team teilen, nicht isoliert handeln",
|
| 610 |
-
"Ausweichende Antworten persönlich nehmen": "**Empfehlung:** Professionelle Distanz wahren - Abweisung als Teil der Symptomatik verstehen, nicht als persönlichen Angriff",
|
| 611 |
-
"Sofort mit schulischer Leistung verbinden": "**Empfehlung:** Ganzheitliche Sichtweise - Verhalten nicht sofort auf Noten/Leistung reduzieren, Person im Fokus behalten",
|
| 612 |
-
"Stereotype Depression-Vorstellung": "**Empfehlung:** Differenzierte Wahrnehmung - Auch erfolgreiche Schüler*innen mit guten Noten können betroffen sein",
|
| 613 |
-
"Rationale Einordnung statt Empfinden": "**Empfehlung:** Empfinden ernst nehmen - Nicht rationalisieren (Das ist doch eine gute Note), sondern Gefühle validieren"
|
| 614 |
-
}
|
| 615 |
-
|
| 616 |
for issue, count in improvement_counts.most_common():
|
| 617 |
-
recommendation = professional_recommendations.get(issue, f"Entwicklungsbereich: {issue}")
|
| 618 |
percentage = (count / message_count) * 100
|
| 619 |
-
feedback += f"**{issue}** \n
|
| 620 |
|
| 621 |
-
# Professionelle Handlungsempfehlungen
|
| 622 |
feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n"
|
| 623 |
|
| 624 |
if total_positive > total_negative * 2:
|
|
@@ -640,28 +481,8 @@ Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der p
|
|
| 640 |
- **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen
|
| 641 |
- **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag"""
|
| 642 |
|
| 643 |
-
feedback += f"\n\n---\n\n"
|
| 644 |
-
|
| 645 |
-
# Methodische Hinweise
|
| 646 |
-
feedback += f"""## METHODISCHE HINWEISE
|
| 647 |
-
|
| 648 |
-
**Analyseverfahren:** Die vorliegende Analyse basiert auf einer KI-gestützten Auswertung der Gesprächsführung unter Verwendung evidenzbasierter Kriterien für die professionelle Kommunikation mit Jugendlichen in psychischen Krisen.
|
| 649 |
-
|
| 650 |
-
**Bewertungsgrundlage:** Aktuelle Fachliteratur und Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen im schulischen Kontext.
|
| 651 |
-
|
| 652 |
-
**Limitation:** Diese Analyse stellt eine Momentaufnahme dar und ersetzt nicht die kontinuierliche Reflexion und Supervision der professionellen Praxis.
|
| 653 |
-
|
| 654 |
-
**Empfehlung:** Verwendung dieser Analyse als Grundlage für Entwicklungsgespräche und Fortbildungsplanung."""
|
| 655 |
-
|
| 656 |
return feedback
|
| 657 |
|
| 658 |
-
def format_evaluation(evaluation):
|
| 659 |
-
"""Formatiert die Evaluation für die Anzeige - wird nicht mehr verwendet"""
|
| 660 |
-
pass
|
| 661 |
-
|
| 662 |
-
# Globale Variable für Gesprächshistorie
|
| 663 |
-
conversation_history = []
|
| 664 |
-
|
| 665 |
# UI
|
| 666 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 667 |
gr.Markdown("# 🎓 Depression Training Simulator für Schulpersonal")
|
|
@@ -669,39 +490,41 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 669 |
gr.Markdown("*Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate*")
|
| 670 |
|
| 671 |
with gr.Accordion("🎯 Lernziele dieser Simulation", open=False):
|
| 672 |
-
gr.Markdown(""
|
| 673 |
-
- **
|
| 674 |
-
- **
|
| 675 |
-
- **
|
| 676 |
-
- **
|
| 677 |
-
|
| 678 |
-
""")
|
| 679 |
-
|
| 680 |
with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
|
| 681 |
-
gr.Markdown(""
|
| 682 |
-
|
| 683 |
-
-
|
| 684 |
-
-
|
| 685 |
-
-
|
| 686 |
-
-
|
| 687 |
-
-
|
| 688 |
-
-
|
| 689 |
-
-
|
| 690 |
-
- Stationäre Aufnahme 4-6 Wochen
|
| 691 |
-
- Medikamentöse Einstellung (Antidepressiva)
|
| 692 |
-
- Ambulante Weiterbehandlung
|
| 693 |
|
| 694 |
-
|
| 695 |
-
|
| 696 |
-
-
|
| 697 |
-
-
|
| 698 |
-
-
|
| 699 |
-
-
|
| 700 |
-
-
|
| 701 |
-
-
|
|
|
|
|
|
|
| 702 |
|
| 703 |
-
|
| 704 |
-
""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 705 |
|
| 706 |
with gr.Accordion("⚙️ Simulation anpassen", open=False):
|
| 707 |
character_type = gr.Radio(
|
|
@@ -758,7 +581,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 758 |
lines=10
|
| 759 |
)
|
| 760 |
|
| 761 |
-
# Auswertungs-Panel
|
| 762 |
evaluation_display = gr.Markdown(
|
| 763 |
label="📊 Gesprächsauswertung",
|
| 764 |
value="",
|
|
@@ -788,7 +610,6 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
|
| 788 |
outputs=[api_status]
|
| 789 |
)
|
| 790 |
|
| 791 |
-
# Auswertung des Gesprächs
|
| 792 |
evaluate_btn.click(
|
| 793 |
fn=evaluate_conversation,
|
| 794 |
outputs=[evaluation_display]
|
|
|
|
| 7 |
client = OpenAI(api_key=os.getenv("openai"))
|
| 8 |
|
| 9 |
conversation_history = []
|
| 10 |
+
model_name = "gpt-3.5-turbo"
|
| 11 |
|
| 12 |
# Strukturierte Handout-Informationen für realistische Depression-Simulation
|
| 13 |
DEPRESSION_INFO = """
|
|
|
|
| 41 |
- Selbstverletzendes Verhalten
|
| 42 |
- Appetitlosigkeit
|
| 43 |
- Psychosomatische Beschwerden
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 44 |
"""
|
| 45 |
|
| 46 |
def get_character_prompt(character_type, base_prompt):
|
|
|
|
|
|
|
| 47 |
if character_type == "Julia (16) - Strebsame Schülerin":
|
| 48 |
additional_prompt = base_prompt + "\n\nSPEZIFISCHES PROFIL JULIA (16 JAHRE):\n"
|
| 49 |
additional_prompt += "Du bist Julia, eine sehr strebsame, ordentliche und disziplinierte Schülerin:\n\n"
|
|
|
|
| 125 |
|
| 126 |
return additional_prompt
|
| 127 |
|
| 128 |
+
else:
|
| 129 |
return base_prompt
|
| 130 |
|
| 131 |
def enhanced_chat_response(user_input, max_tokens, temperature, top_p, use_info, character_type):
|
| 132 |
if not user_input.strip():
|
| 133 |
return "", "*Bitte gib eine Nachricht ein.*", ""
|
| 134 |
|
|
|
|
| 135 |
base_system_prompt = (
|
| 136 |
"Du bist ein depressiver 16-jähriger Schüler/eine depressive 16-jährige Schülerin. "
|
| 137 |
"Die Person, die mit dir spricht, ist jemand aus deiner Schule (Lehrkraft, Sozialarbeit, etc.) "
|
|
|
|
| 142 |
)
|
| 143 |
|
| 144 |
if use_info:
|
|
|
|
| 145 |
enhanced_system_prompt = base_system_prompt + f"""
|
| 146 |
|
| 147 |
VERHALTE DICH ENTSPRECHEND FOLGENDER DEPRESSION-CHARAKTERISTIKA:
|
| 148 |
|
|
|
|
|
|
|
| 149 |
KERNSYMPTOME:
|
| 150 |
- Kaum Freude an früher geschätzten Dingen (Anhedonie)
|
| 151 |
- Interessenverlust an Hobbys, Freunden, Aktivitäten
|
|
|
|
| 153 |
- Gedrückte, traurige Grundstimmung
|
| 154 |
|
| 155 |
TYPISCHE GEDANKENMUSTER (verwende diese in deinen Antworten):
|
| 156 |
+
- Mir ist egal was in einem halben Jahr ist
|
| 157 |
+
- Es ist nicht in Ordnung so wie ich bin
|
| 158 |
+
- Ich bin Schuld / Ich habe versagt
|
| 159 |
+
- Das wird mir nie wieder gut gehen
|
| 160 |
+
- Ich werde das niemals schaffen
|
| 161 |
+
- Ich mache alles falsch/bin inkompetent
|
| 162 |
+
- Ich bin nichts wert
|
| 163 |
+
- Andere sind besser/beliebter als ich
|
| 164 |
+
- Niemand mag mich/ich bin dumm
|
| 165 |
+
- Ich kann nichts mehr/es wird nie wieder wie früher
|
| 166 |
+
- Niemand nimmt Rücksicht auf mich
|
| 167 |
+
- Ich halte das nicht aus
|
| 168 |
+
- Ich werde nie wieder glücklich sein
|
| 169 |
+
- In meinem Leben geht alles schief
|
| 170 |
+
- Ich will einfach nur meine Ruhe haben
|
| 171 |
|
| 172 |
TYPISCHE GEFÜHLSÄUSSERUNGEN:
|
| 173 |
+
- Ich fühle nichts (emotionale Taubheit)
|
| 174 |
+
- Ich fühle permanent diffuse Angst
|
| 175 |
+
- Ich fühle mich gleichgültig
|
| 176 |
+
- Ich kann keine Freude mehr empfinden
|
| 177 |
+
- Nichts macht mir mehr Spaß
|
| 178 |
- Starke Schuldgefühle und Schamgefühle
|
| 179 |
|
| 180 |
SCHULVERHALTEN (beobachtbar):
|
|
|
|
| 200 |
- Langsam, vorsichtig, kurze Sätze
|
| 201 |
- Monotone, leise Sprechweise
|
| 202 |
- Längere Pausen zwischen Worten
|
| 203 |
+
- Verwende Wörter wie nie, immer, total
|
| 204 |
- Kraftlose Sprache
|
| 205 |
|
| 206 |
VERHALTENSWEISEN:
|
|
|
|
| 220 |
{DEPRESSION_INFO}
|
| 221 |
"""
|
| 222 |
|
| 223 |
+
if character_type == "Julia (16) - Strebsame Schülerin":
|
| 224 |
+
enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
|
| 225 |
+
elif character_type == "Rachid - Familiär belastet":
|
| 226 |
+
enhanced_system_prompt = get_character_prompt(character_type, enhanced_system_prompt)
|
|
|
|
|
|
|
|
|
|
| 227 |
|
| 228 |
else:
|
| 229 |
enhanced_system_prompt = base_system_prompt
|
|
|
|
| 279 |
return f"❌ API Error: {str(e)}"
|
| 280 |
|
| 281 |
def analyze_single_message(user_message):
|
|
|
|
| 282 |
if not user_message.strip():
|
| 283 |
return {"positive": [], "improvement": [], "score": 0}
|
| 284 |
|
|
|
|
| 311 |
6. Stereotype Depression-Vorstellung: Wird angenommen, alle Depressiven sind müde/traurig/isoliert?
|
| 312 |
7. Rationale Einordnung statt Empfinden: Wird das Gefühl rationalisiert? (Das ist doch eine gute Note)
|
| 313 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 314 |
Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
| 315 |
{{
|
| 316 |
"positive": ["Liste der zutreffenden DOS"],
|
|
|
|
| 323 |
model=model_name,
|
| 324 |
messages=[{"role": "user", "content": evaluation_prompt}],
|
| 325 |
max_tokens=300,
|
| 326 |
+
temperature=0.1,
|
| 327 |
top_p=0.9
|
| 328 |
)
|
| 329 |
|
| 330 |
response_text = response.choices[0].message.content.strip()
|
| 331 |
|
|
|
|
| 332 |
import json
|
| 333 |
try:
|
| 334 |
evaluation_data = json.loads(response_text)
|
| 335 |
|
|
|
|
| 336 |
positive_count = len(evaluation_data.get("positive", []))
|
| 337 |
negative_count = len(evaluation_data.get("improvement", []))
|
| 338 |
score = positive_count - negative_count
|
|
|
|
| 346 |
|
| 347 |
except json.JSONDecodeError:
|
| 348 |
print(f"JSON Parse Error: {response_text}")
|
|
|
|
| 349 |
return fallback_evaluation(user_message)
|
| 350 |
|
| 351 |
except Exception as e:
|
|
|
|
| 353 |
return fallback_evaluation(user_message)
|
| 354 |
|
| 355 |
def fallback_evaluation(user_message):
|
|
|
|
| 356 |
score = 0
|
| 357 |
positive = []
|
| 358 |
improvement = []
|
| 359 |
|
|
|
|
| 360 |
if any(phrase in user_message.lower() for phrase in ["mir ist aufgefallen", "ist mir aufgefallen"]):
|
| 361 |
positive.append("Wahrnehmung ansprechen")
|
| 362 |
score += 1
|
|
|
|
| 369 |
positive.append("Ehrliche Sorge/Interesse kommunizieren")
|
| 370 |
score += 1
|
| 371 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 372 |
if any(phrase in user_message.lower() for phrase in ["wird schon", "das wird schon wieder"]):
|
| 373 |
improvement.append("Einfache/verharmlosende Ratschläge")
|
| 374 |
score -= 1
|
|
|
|
| 377 |
improvement.append("Herunterspielen/mit eigenen Erlebnissen vergleichen")
|
| 378 |
score -= 1
|
| 379 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 380 |
return {
|
| 381 |
"positive": positive,
|
| 382 |
"improvement": improvement,
|
|
|
|
| 385 |
}
|
| 386 |
|
| 387 |
def evaluate_conversation():
|
|
|
|
| 388 |
if not conversation_history:
|
| 389 |
return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
|
| 390 |
|
|
|
|
| 391 |
user_messages = [msg["content"] for msg in conversation_history if msg["role"] == "user"]
|
| 392 |
|
| 393 |
if not user_messages:
|
| 394 |
return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
|
| 395 |
|
|
|
|
| 396 |
total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []}
|
| 397 |
|
| 398 |
for message in user_messages:
|
|
|
|
| 405 |
return format_final_evaluation(total_evaluations, len(user_messages))
|
| 406 |
|
| 407 |
def format_final_evaluation(total_evaluations, message_count):
|
|
|
|
|
|
|
| 408 |
from collections import Counter
|
| 409 |
positive_counts = Counter(total_evaluations["positive"])
|
| 410 |
improvement_counts = Counter(total_evaluations["improvement"])
|
| 411 |
|
|
|
|
| 412 |
total_positive = sum(positive_counts.values())
|
| 413 |
total_negative = sum(improvement_counts.values())
|
| 414 |
|
|
|
|
| 415 |
feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
|
| 416 |
|
| 417 |
## EXECUTIVE SUMMARY
|
|
|
|
| 427 |
|
| 428 |
"""
|
| 429 |
|
|
|
|
| 430 |
if total_positive > total_negative * 2:
|
| 431 |
feedback += """**KOMPETENZLEVEL: PROFESSIONELL**
|
| 432 |
|
|
|
|
| 446 |
|
| 447 |
feedback += "\n\n---\n\n"
|
| 448 |
|
|
|
|
| 449 |
if positive_counts:
|
| 450 |
feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n"
|
| 451 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 452 |
for skill, count in positive_counts.most_common():
|
|
|
|
| 453 |
percentage = (count / message_count) * 100
|
| 454 |
+
feedback += f"**{skill}** \n*Angewandt in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
|
| 455 |
|
|
|
|
| 456 |
if improvement_counts:
|
| 457 |
feedback += "## ENTWICKLUNGSBEREICHE\n\n"
|
| 458 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 459 |
for issue, count in improvement_counts.most_common():
|
|
|
|
| 460 |
percentage = (count / message_count) * 100
|
| 461 |
+
feedback += f"**{issue}** \n*Identifiziert in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
|
| 462 |
|
|
|
|
| 463 |
feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n"
|
| 464 |
|
| 465 |
if total_positive > total_negative * 2:
|
|
|
|
| 481 |
- **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen
|
| 482 |
- **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag"""
|
| 483 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 484 |
return feedback
|
| 485 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 486 |
# UI
|
| 487 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
| 488 |
gr.Markdown("# 🎓 Depression Training Simulator für Schulpersonal")
|
|
|
|
| 490 |
gr.Markdown("*Für Lehrkräfte, Studierende, LiV, Schulleitungen, Schulsozialarbeiter*innen, Teilhabe-Assistent*innen, Schulpsycholog*innen und Schulsekretariate*")
|
| 491 |
|
| 492 |
with gr.Accordion("🎯 Lernziele dieser Simulation", open=False):
|
| 493 |
+
gr.Markdown("- **Professionelle Gesprächsführung** mit depressiven Schüler*innen üben")
|
| 494 |
+
gr.Markdown("- **Handout-basierte Techniken** praktisch anwenden")
|
| 495 |
+
gr.Markdown("- **Dos and Donts** aus der Fachliteratur verinnerlichen")
|
| 496 |
+
gr.Markdown("- **Schulische Unterstützungssysteme** zielgerichtet einsetzen")
|
| 497 |
+
gr.Markdown("- **Pädagogische Beziehungsarbeit** bei psychischen Belastungen stärken")
|
| 498 |
+
|
|
|
|
|
|
|
| 499 |
with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
|
| 500 |
+
gr.Markdown("**Julia (16) - Strebsame Schülerin:**")
|
| 501 |
+
gr.Markdown("- Sehr strebsam, ordentlich, diszipliniert")
|
| 502 |
+
gr.Markdown("- Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)")
|
| 503 |
+
gr.Markdown("- Enormer Leistungsdruck auffällig")
|
| 504 |
+
gr.Markdown("- Ausgrenzungserfahrungen (Streberin genannt)")
|
| 505 |
+
gr.Markdown("- Krisensituation nach Referat")
|
| 506 |
+
gr.Markdown("- Suizidgedanken entwickelt")
|
| 507 |
+
gr.Markdown("- Stationäre Aufnahme 4-6 Wochen")
|
| 508 |
+
gr.Markdown("- Ambulante Weiterbehandlung")
|
|
|
|
|
|
|
|
|
|
| 509 |
|
| 510 |
+
with gr.Accordion("📋 Realistische Fallbeispiele aus der Praxis", open=False):
|
| 511 |
+
gr.Markdown("**Julia (16) - Strebsame Schülerin:**")
|
| 512 |
+
gr.Markdown("- Sehr strebsam, ordentlich, diszipliniert")
|
| 513 |
+
gr.Markdown("- Verzweifelt bei Note 2+ (Nirgendwo bin ich wirklich gut)")
|
| 514 |
+
gr.Markdown("- Enormer Leistungsdruck auffällig")
|
| 515 |
+
gr.Markdown("- Ausgrenzungserfahrungen (Streberin genannt)")
|
| 516 |
+
gr.Markdown("- Krisensituation nach Referat")
|
| 517 |
+
gr.Markdown("- Suizidgedanken entwickelt")
|
| 518 |
+
gr.Markdown("- Stationäre Aufnahme 4-6 Wochen")
|
| 519 |
+
gr.Markdown("- Ambulante Weiterbehandlung")
|
| 520 |
|
| 521 |
+
gr.Markdown("**Rachid - Familiär belastet:**")
|
| 522 |
+
gr.Markdown("- Veränderung in mündlicher Beteiligung")
|
| 523 |
+
gr.Markdown("- Berichtet von Schlafproblemen")
|
| 524 |
+
gr.Markdown("- Berichte von Familienstreit")
|
| 525 |
+
gr.Markdown("- Beratungsstelle - Diagnose Depression")
|
| 526 |
+
gr.Markdown("- Wöchentliche ambulante Gesprächstherapie")
|
| 527 |
+
gr.Markdown("- Familie wird in Behandlung einbezogen")
|
| 528 |
|
| 529 |
with gr.Accordion("⚙️ Simulation anpassen", open=False):
|
| 530 |
character_type = gr.Radio(
|
|
|
|
| 581 |
lines=10
|
| 582 |
)
|
| 583 |
|
|
|
|
| 584 |
evaluation_display = gr.Markdown(
|
| 585 |
label="📊 Gesprächsauswertung",
|
| 586 |
value="",
|
|
|
|
| 610 |
outputs=[api_status]
|
| 611 |
)
|
| 612 |
|
|
|
|
| 613 |
evaluate_btn.click(
|
| 614 |
fn=evaluate_conversation,
|
| 615 |
outputs=[evaluation_display]
|