Spaces:
Runtime error
Runtime error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,4 +1,56 @@
|
|
| 1 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
import openai
|
| 3 |
import os
|
| 4 |
from openai import OpenAI
|
|
@@ -142,7 +194,7 @@ def test_api_connection():
|
|
| 142 |
return f"❌ API Error: {str(e)}"
|
| 143 |
|
| 144 |
def evaluate_conversation():
|
| 145 |
-
"""Evaluiert das gesamte Gespräch
|
| 146 |
if not conversation_history:
|
| 147 |
return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
|
| 148 |
|
|
@@ -152,123 +204,244 @@ def evaluate_conversation():
|
|
| 152 |
if not user_messages:
|
| 153 |
return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
|
| 154 |
|
| 155 |
-
# Sammle alle Bewertungen
|
| 156 |
-
total_evaluations = {"positive": [], "improvement": [], "scores": []}
|
| 157 |
|
| 158 |
for message in user_messages:
|
| 159 |
evaluation = analyze_single_message(message)
|
| 160 |
total_evaluations["positive"].extend(evaluation["positive"])
|
| 161 |
total_evaluations["improvement"].extend(evaluation["improvement"])
|
| 162 |
total_evaluations["scores"].append(evaluation["score"])
|
|
|
|
| 163 |
|
| 164 |
return format_final_evaluation(total_evaluations, len(user_messages))
|
| 165 |
|
| 166 |
def analyze_single_message(user_message):
|
| 167 |
-
"""Analysiert eine einzelne Nachricht"""
|
| 168 |
-
|
| 169 |
-
|
| 170 |
|
| 171 |
-
|
| 172 |
-
|
| 173 |
-
|
| 174 |
-
|
| 175 |
-
|
| 176 |
-
|
| 177 |
-
|
| 178 |
-
|
| 179 |
-
|
| 180 |
-
|
| 181 |
-
|
| 182 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 183 |
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
"Einfache Ratschläge": ["musst nur", "einfach mal", "denk positiv", "reiß dich zusammen", "mehr schlafen"],
|
| 193 |
-
"Vergleichen": ["anderen geht", "mir ging", "früher war", "bei mir", "andere schüler"],
|
| 194 |
-
"Druck ausüben": ["solltest", "musst", "versuch doch mal", "strengst du dich an", "erwarte ich"],
|
| 195 |
-
"Fokus nur auf Leistung": ["noten", "hausaufgaben", "versetzung", "abschluss", "leistung", "zeugnis"],
|
| 196 |
-
"Unprofessionell": ["eltern sagen", "wird bestraft", "konsequenzen", "melde ich", "ärger"],
|
| 197 |
-
"Persönlich nehmen": ["mir gegenüber", "wegen mir", "ich bin", "mache ich falsch"]
|
| 198 |
-
}
|
| 199 |
|
| 200 |
-
|
| 201 |
-
|
| 202 |
-
|
| 203 |
-
|
|
|
|
|
|
|
|
|
|
| 204 |
|
| 205 |
-
return
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 206 |
|
| 207 |
def format_final_evaluation(total_evaluations, message_count):
|
| 208 |
-
"""Formatiert die finale Gesamtauswertung"""
|
| 209 |
-
# Durchschnittsscore berechnen
|
| 210 |
-
avg_score = sum(total_evaluations["scores"]) / len(total_evaluations["scores"]) if total_evaluations["scores"] else 0
|
| 211 |
-
final_score = max(0, min(5, avg_score + 3)) # Normalisierung auf 0-5
|
| 212 |
-
|
| 213 |
# Häufigkeiten zählen
|
| 214 |
from collections import Counter
|
| 215 |
positive_counts = Counter(total_evaluations["positive"])
|
| 216 |
improvement_counts = Counter(total_evaluations["improvement"])
|
| 217 |
|
| 218 |
-
|
| 219 |
-
|
| 220 |
-
|
| 221 |
|
| 222 |
-
#
|
| 223 |
-
|
| 224 |
-
|
| 225 |
-
|
| 226 |
-
|
| 227 |
-
|
| 228 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 229 |
else:
|
| 230 |
-
feedback += "
|
|
|
|
|
|
|
| 231 |
|
| 232 |
-
|
|
|
|
|
|
|
| 233 |
if positive_counts:
|
| 234 |
-
feedback += "
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 235 |
for skill, count in positive_counts.most_common():
|
|
|
|
| 236 |
percentage = (count / message_count) * 100
|
| 237 |
-
feedback += f"
|
| 238 |
-
feedback += "\n"
|
| 239 |
|
| 240 |
-
#
|
| 241 |
if improvement_counts:
|
| 242 |
-
feedback += "
|
| 243 |
-
|
| 244 |
-
|
| 245 |
-
"
|
| 246 |
-
"
|
| 247 |
-
"
|
| 248 |
-
"
|
| 249 |
-
"
|
| 250 |
-
"
|
|
|
|
| 251 |
}
|
|
|
|
| 252 |
for issue, count in improvement_counts.most_common():
|
|
|
|
| 253 |
percentage = (count / message_count) * 100
|
| 254 |
-
|
| 255 |
-
feedback += f"• **{issue}:** {count}x aufgetreten ({percentage:.1f}%) → {tip}\n"
|
| 256 |
-
feedback += "\n"
|
| 257 |
|
| 258 |
-
# Handlungsempfehlungen
|
| 259 |
-
feedback += "
|
| 260 |
-
|
| 261 |
-
|
| 262 |
-
feedback += "
|
| 263 |
-
|
| 264 |
-
|
| 265 |
-
|
| 266 |
-
|
| 267 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 268 |
else:
|
| 269 |
-
feedback += "
|
| 270 |
-
|
| 271 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 272 |
|
| 273 |
return feedback
|
| 274 |
|
|
|
|
| 1 |
+
def format_final_evaluation(total_evaluations, message_count):
|
| 2 |
+
"""Formatiert die finale Gesamtauswertung in professionellem Format"""
|
| 3 |
+
# Durchschnittsscore berechnen
|
| 4 |
+
avg_score = sum(total_evaluations["scores"]) / len(total_evaluations["scores"]) if total_evaluations["scores"] else 0
|
| 5 |
+
final_score = max(0, min(5, avg_score + 3)) # Normalisierung auf 0-5
|
| 6 |
+
|
| 7 |
+
# Häufigkeiten zählen
|
| 8 |
+
from collections import Counter
|
| 9 |
+
positive_counts = Counter(total_evaluations["positive"])
|
| 10 |
+
improvement_counts = Counter(total_evaluations["improvement"])
|
| 11 |
+
|
| 12 |
+
# Professionelle Formatierung
|
| 13 |
+
feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
|
| 14 |
+
|
| 15 |
+
## EXECUTIVE SUMMARY
|
| 16 |
+
|
| 17 |
+
**Analysierte Gesprächseinheiten:** {message_count}
|
| 18 |
+
**Gesamtbewertung:** {final_score:.1f}/5.0 Punkten
|
| 19 |
+
**Bewertungsverfahren:** KI-gestützte Analyse nach evidenzbasierten Kriterien
|
| 20 |
+
**Analysedatum:** {__import__('datetime').datetime.now().strftime('%d.%m.%Y %H:%M')}
|
| 21 |
+
|
| 22 |
+
---
|
| 23 |
+
|
| 24 |
+
## GESAMTBEURTEILUNG
|
| 25 |
+
|
| 26 |
+
"""
|
| 27 |
+
|
| 28 |
+
# Professionelle Gesamteinschätzung
|
| 29 |
+
if final_score >= 4.5:
|
| 30 |
+
feedback += """**KOMPETENZLEVEL: EXPERTE (4.5-5.0)**
|
| 31 |
+
|
| 32 |
+
Die Analyse zeigt eine hochprofessionelle Gesprächsführung, die evidenzbasierte Prinzipien der therapeutischen Kommunikation konsequent umsetzt. Die Interaktion entspricht aktuellen Standards der Krisenintervention im Bildungskontext."""
|
| 33 |
+
elif final_score >= 3.5:
|
| 34 |
+
feedback += """**KOMPETENZLEVEL: FORTGESCHRITTEN (3.5-4.4)**
|
| 35 |
+
|
| 36 |
+
Solide professionelle Gesprächsführung mit deutlichen Stärken in der empathischen Kommunikation. Die Grundprinzipien werden überwiegend korrekt angewendet, einzelne Optimierungsbereiche wurden identifiziert."""
|
| 37 |
+
elif final_score >= 2.5:
|
| 38 |
+
feedback += """**KOMPETENZLEVEL: GRUNDLAGEN VORHANDEN (2.5-3.4)**
|
| 39 |
+
|
| 40 |
+
Wesentliche Grundlagen der professionellen Gesprächsführung sind erkennbar. Zur Erreichung des Fachstandards sind jedoch signifikante Verbesserungen in mehreren Kompetenzbereichen erforderlich."""
|
| 41 |
+
else:
|
| 42 |
+
feedback += """**KOMPETENZLEVEL: ENTWICKLUNGSBEDARF (0-2.4)**
|
| 43 |
+
|
| 44 |
+
Die Analyse zeigt erheblichen Entwicklungsbedarf in den Grundlagen der professionellen Gesprächsführung. Eine systematische Fortbildung gemäß aktueller Fachstandards wird dringend empfohlen."""
|
| 45 |
+
|
| 46 |
+
feedback += "\n\n---\n\n"
|
| 47 |
+
|
| 48 |
+
# Kompetenzprofil
|
| 49 |
+
if positive_counts:
|
| 50 |
+
feedback += "## KOMPETENZPROFIL - STÄRKEN\n\n"
|
| 51 |
+
|
| 52 |
+
professional_descriptions = {
|
| 53 |
+
"Sorimport gradio as gr
|
| 54 |
import openai
|
| 55 |
import os
|
| 56 |
from openai import OpenAI
|
|
|
|
| 194 |
return f"❌ API Error: {str(e)}"
|
| 195 |
|
| 196 |
def evaluate_conversation():
|
| 197 |
+
"""Evaluiert das gesamte Gespräch mit LLM-basierter Analyse"""
|
| 198 |
if not conversation_history:
|
| 199 |
return "🤔 **Noch kein Gespräch geführt**\n\nBitte führe erst ein Gespräch, bevor du eine Auswertung anforderst."
|
| 200 |
|
|
|
|
| 204 |
if not user_messages:
|
| 205 |
return "🤔 **Keine Nachrichten zu bewerten**\n\nEs wurden noch keine Nachrichten von dir gesendet."
|
| 206 |
|
| 207 |
+
# Sammle alle LLM-Bewertungen
|
| 208 |
+
total_evaluations = {"positive": [], "improvement": [], "scores": [], "explanations": []}
|
| 209 |
|
| 210 |
for message in user_messages:
|
| 211 |
evaluation = analyze_single_message(message)
|
| 212 |
total_evaluations["positive"].extend(evaluation["positive"])
|
| 213 |
total_evaluations["improvement"].extend(evaluation["improvement"])
|
| 214 |
total_evaluations["scores"].append(evaluation["score"])
|
| 215 |
+
total_evaluations["explanations"].append(evaluation.get("explanation", ""))
|
| 216 |
|
| 217 |
return format_final_evaluation(total_evaluations, len(user_messages))
|
| 218 |
|
| 219 |
def analyze_single_message(user_message):
|
| 220 |
+
"""Analysiert eine einzelne Nachricht mit LLM-basierter Evaluation"""
|
| 221 |
+
if not user_message.strip():
|
| 222 |
+
return {"positive": [], "improvement": [], "score": 0}
|
| 223 |
|
| 224 |
+
evaluation_prompt = f"""Du bist ein Experte für professionelle Gesprächsführung im Schulkontext mit depressiven Jugendlichen.
|
| 225 |
+
|
| 226 |
+
Bewerte diese Nachricht einer Lehrkraft/Schulperson an einen 16-jährigen depressiven Schüler:
|
| 227 |
+
|
| 228 |
+
NACHRICHT: "{user_message}"
|
| 229 |
+
|
| 230 |
+
Bewerte die Nachricht nach folgenden Kriterien und gib für jedes Kriterium "ja" oder "nein" an:
|
| 231 |
+
|
| 232 |
+
POSITIVE ASPEKTE:
|
| 233 |
+
1. Sorge/Interesse zeigen: Zeigt die Nachricht echte Sorge und Interesse für das Wohlbefinden?
|
| 234 |
+
2. Offene Fragen stellen: Werden offene, einladende Fragen gestellt, die zum Erzählen ermutigen?
|
| 235 |
+
3. Unterstützung anbieten: Wird konkrete, praktische Unterstützung angeboten?
|
| 236 |
+
4. Wahrnehmung ansprechen: Werden spezifische Beobachtungen professionell angesprochen?
|
| 237 |
+
5. Empathie zeigen: Wird Verständnis und emotionale Validierung gezeigt?
|
| 238 |
+
6. Wertschätzung ausdrücken: Werden positive Eigenschaften oder Stärken betont?
|
| 239 |
+
7. Professionellen Rahmen nutzen: Werden schulische Hilfssysteme erwähnt oder angeboten?
|
| 240 |
+
8. Kontinuität zeigen: Wird eine verlässliche, fortlaufende Beziehung signalisiert?
|
| 241 |
+
|
| 242 |
+
PROBLEMATISCHE ASPEKTE:
|
| 243 |
+
1. Verharmlosen: Werden Gefühle oder Probleme bagatellisiert oder heruntergespielt?
|
| 244 |
+
2. Einfache Ratschläge: Werden oberflächliche "Lösungen" oder Plattitüden angeboten?
|
| 245 |
+
3. Vergleichen: Werden Vergleiche mit anderen Personen oder Situationen gezogen?
|
| 246 |
+
4. Druck ausüben: Wird Leistungs- oder Erwartungsdruck aufgebaut?
|
| 247 |
+
5. Fokus nur auf Leistung: Geht es hauptsächlich um Noten, Hausaufgaben oder Schulleistung?
|
| 248 |
+
6. Unprofessionell: Wird unprofessionell reagiert (Drohungen, Bestrafung, etc.)?
|
| 249 |
+
7. Persönlich nehmen: Wird die Situation auf sich selbst bezogen oder persönlich genommen?
|
| 250 |
+
|
| 251 |
+
Antworte EXAKT in folgendem JSON-Format (keine zusätzlichen Erklärungen):
|
| 252 |
+
{{
|
| 253 |
+
"positive": ["Liste der zutreffenden positiven Aspekte"],
|
| 254 |
+
"improvement": ["Liste der zutreffenden problematischen Aspekte"],
|
| 255 |
+
"score_explanation": "Kurze Begründung der Gesamtbewertung"
|
| 256 |
+
}}"""
|
| 257 |
+
|
| 258 |
+
try:
|
| 259 |
+
response = client.chat.completions.create(
|
| 260 |
+
model=model_name,
|
| 261 |
+
messages=[{"role": "user", "content": evaluation_prompt}],
|
| 262 |
+
max_tokens=300,
|
| 263 |
+
temperature=0.1, # Niedrige Temperatur für konsistente Bewertungen
|
| 264 |
+
top_p=0.9
|
| 265 |
+
)
|
| 266 |
+
|
| 267 |
+
response_text = response.choices[0].message.content.strip()
|
| 268 |
+
|
| 269 |
+
# JSON parsen
|
| 270 |
+
import json
|
| 271 |
+
try:
|
| 272 |
+
evaluation_data = json.loads(response_text)
|
| 273 |
+
|
| 274 |
+
# Score basierend auf positiven vs. negativen Aspekten berechnen
|
| 275 |
+
positive_count = len(evaluation_data.get("positive", []))
|
| 276 |
+
negative_count = len(evaluation_data.get("improvement", []))
|
| 277 |
+
score = positive_count - negative_count
|
| 278 |
+
|
| 279 |
+
return {
|
| 280 |
+
"positive": evaluation_data.get("positive", []),
|
| 281 |
+
"improvement": evaluation_data.get("improvement", []),
|
| 282 |
+
"score": score,
|
| 283 |
+
"explanation": evaluation_data.get("score_explanation", "")
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
except json.JSONDecodeError:
|
| 287 |
+
print(f"JSON Parse Error: {response_text}")
|
| 288 |
+
# Fallback: Einfache Bewertung basierend auf Textlänge und Tonfall
|
| 289 |
+
return fallback_evaluation(user_message)
|
| 290 |
+
|
| 291 |
+
except Exception as e:
|
| 292 |
+
print(f"LLM Evaluation Error: {e}")
|
| 293 |
+
return fallback_evaluation(user_message)
|
| 294 |
+
|
| 295 |
+
def fallback_evaluation(user_message):
|
| 296 |
+
"""Einfache Fallback-Bewertung wenn LLM-Evaluation fehlschlägt"""
|
| 297 |
+
score = 0
|
| 298 |
+
positive = []
|
| 299 |
+
improvement = []
|
| 300 |
|
| 301 |
+
# Sehr einfache Heuristiken als Backup
|
| 302 |
+
if "?" in user_message:
|
| 303 |
+
positive.append("Offene Fragen stellen")
|
| 304 |
+
score += 1
|
| 305 |
|
| 306 |
+
if any(word in user_message.lower() for word in ["helfen", "unterstützen", "da sein"]):
|
| 307 |
+
positive.append("Unterstützung anbieten")
|
| 308 |
+
score += 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 309 |
|
| 310 |
+
if any(word in user_message.lower() for word in ["wird schon", "ist normal", "übertreibst"]):
|
| 311 |
+
improvement.append("Verharmlosen")
|
| 312 |
+
score -= 1
|
| 313 |
+
|
| 314 |
+
if any(word in user_message.lower() for word in ["musst", "sollst", "erwarte"]):
|
| 315 |
+
improvement.append("Druck ausüben")
|
| 316 |
+
score -= 1
|
| 317 |
|
| 318 |
+
return {
|
| 319 |
+
"positive": positive,
|
| 320 |
+
"improvement": improvement,
|
| 321 |
+
"score": score,
|
| 322 |
+
"explanation": "Automatische Fallback-Bewertung (LLM nicht verfügbar)"
|
| 323 |
+
}
|
| 324 |
|
| 325 |
def format_final_evaluation(total_evaluations, message_count):
|
| 326 |
+
"""Formatiert die finale Gesamtauswertung in professionellem Format ohne Scores"""
|
|
|
|
|
|
|
|
|
|
|
|
|
| 327 |
# Häufigkeiten zählen
|
| 328 |
from collections import Counter
|
| 329 |
positive_counts = Counter(total_evaluations["positive"])
|
| 330 |
improvement_counts = Counter(total_evaluations["improvement"])
|
| 331 |
|
| 332 |
+
# Qualitative Bewertung basierend auf Verhältnis
|
| 333 |
+
total_positive = sum(positive_counts.values())
|
| 334 |
+
total_negative = sum(improvement_counts.values())
|
| 335 |
|
| 336 |
+
# Professionelle Formatierung ohne Scores
|
| 337 |
+
feedback = f"""# PROFESSIONELLE GESPRÄCHSFÜHRUNGSANALYSE
|
| 338 |
+
|
| 339 |
+
## EXECUTIVE SUMMARY
|
| 340 |
+
|
| 341 |
+
**Analysierte Gesprächseinheiten:** {message_count}
|
| 342 |
+
**Bewertungsverfahren:** Qualitative Analyse nach evidenzbasierten Kriterien der Gesprächsführung
|
| 343 |
+
**Analysedatum:** {__import__('datetime').datetime.now().strftime('%d.%m.%Y, %H:%M Uhr')}
|
| 344 |
+
**Bewertungsgrundlage:** Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen
|
| 345 |
+
|
| 346 |
+
---
|
| 347 |
+
|
| 348 |
+
## GESAMTBEURTEILUNG
|
| 349 |
+
|
| 350 |
+
"""
|
| 351 |
+
|
| 352 |
+
# Qualitative Gesamteinschätzung ohne Scores
|
| 353 |
+
if total_positive > total_negative * 2:
|
| 354 |
+
feedback += """**KOMPETENZLEVEL: PROFESSIONELL**
|
| 355 |
+
|
| 356 |
+
Die Analyse zeigt eine hochkompetente Gesprächsführung, die evidenzbasierte Prinzipien der therapeutischen Kommunikation konsequent umsetzt. Die Interaktion entspricht aktuellen Fachstandards der Krisenintervention im Bildungskontext und zeigt eine professionelle Haltung gegenüber Jugendlichen mit depressiven Symptomen."""
|
| 357 |
+
elif total_positive > total_negative:
|
| 358 |
+
feedback += """**KOMPETENZLEVEL: KOMPETENT**
|
| 359 |
+
|
| 360 |
+
Solide professionelle Gesprächsführung mit deutlichen Stärken in der empathischen Kommunikation. Die Grundprinzipien der ressourcenorientierten Beratung werden überwiegend korrekt angewendet. Die Interaktion zeigt Verständnis für die Komplexität depressiver Erkrankungen bei Jugendlichen."""
|
| 361 |
+
elif total_positive == total_negative or abs(total_positive - total_negative) <= 1:
|
| 362 |
+
feedback += """**KOMPETENZLEVEL: ENTWICKLUNGSFÄHIG**
|
| 363 |
+
|
| 364 |
+
Die Analyse zeigt sowohl professionelle Ansätze als auch Bereiche mit Optimierungspotential. Wesentliche Grundlagen der Gesprächsführung sind vorhanden, jedoch ist eine gezielte Weiterentwicklung der Kompetenzen zur Erreichung des Fachstandards empfehlenswert."""
|
| 365 |
else:
|
| 366 |
+
feedback += """**KOMPETENZLEVEL: FORTBILDUNGSBEDARF**
|
| 367 |
+
|
| 368 |
+
Die Analyse identifiziert erheblichen Entwicklungsbedarf in den Grundlagen der professionellen Gesprächsführung mit Jugendlichen in psychischen Krisen. Eine systematische Fortbildung gemäß aktueller Fachstandards und Supervision wird empfohlen."""
|
| 369 |
|
| 370 |
+
feedback += "\n\n---\n\n"
|
| 371 |
+
|
| 372 |
+
# Kompetenzprofil
|
| 373 |
if positive_counts:
|
| 374 |
+
feedback += "## KOMPETENZPROFIL - PROFESSIONELLE STÄRKEN\n\n"
|
| 375 |
+
|
| 376 |
+
professional_descriptions = {
|
| 377 |
+
"Sorge/Interesse zeigen": "Empathische Grundhaltung und genuine Anteilnahme",
|
| 378 |
+
"Offene Fragen stellen": "Gesprächsführungstechnik zur Förderung der Selbstreflexion",
|
| 379 |
+
"Unterstützung anbieten": "Ressourcenorientierte Beratungsansätze",
|
| 380 |
+
"Wahrnehmung ansprechen": "Professionelle Beobachtungskompetenz und Feedback-Kultur",
|
| 381 |
+
"Empathie zeigen": "Emotionale Validierung und therapeutische Grundhaltung",
|
| 382 |
+
"Wertschätzung ausdrücken": "Stärkenorientierte Kommunikation und Ressourcenaktivierung",
|
| 383 |
+
"Professionellen Rahmen nutzen": "Systemische Beratungsansätze und Netzwerkarbeit",
|
| 384 |
+
"Kontinuität zeigen": "Verlässliche Beziehungsgestaltung und Bindungsförderung"
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
for skill, count in positive_counts.most_common():
|
| 388 |
+
description = professional_descriptions.get(skill, skill)
|
| 389 |
percentage = (count / message_count) * 100
|
| 390 |
+
feedback += f"**{skill}** \n{description} \n*Angewandt in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
|
|
|
|
| 391 |
|
| 392 |
+
# Entwicklungsbereiche
|
| 393 |
if improvement_counts:
|
| 394 |
+
feedback += "## ENTWICKLUNGSBEREICHE\n\n"
|
| 395 |
+
|
| 396 |
+
professional_recommendations = {
|
| 397 |
+
"Verharmlosen": "**Empfehlung:** Validierung statt Bagatellisierung - Gefühle und Erfahrungen des Jugendlichen ernst nehmen und als realistische Wahrnehmung anerkennen.",
|
| 398 |
+
"Einfache Ratschläge": "**Empfehlung:** Ressourcenorientierte Beratung entwickeln - Statt schneller Lösungsvorschläge den Jugendlichen bei der Entwicklung eigener Bewältigungsstrategien unterstützen.",
|
| 399 |
+
"Vergleichen": "**Empfehlung:** Individuelle Situation würdigen - Vermeidung von Vergleichen mit anderen Personen oder Situationen, Fokus auf die einzigartige Lebenssituation des Jugendlichen.",
|
| 400 |
+
"Druck ausüben": "**Empfehlung:** Empowerment-Ansatz entwickeln - Statt Erwartungsdruck aufzubauen, Selbstwirksamkeit und Autonomie des Jugendlichen fördern.",
|
| 401 |
+
"Fokus nur auf Leistung": "**Empfehlung:** Ganzheitliche Sichtweise entwickeln - Den Menschen hinter dem Schüler sehen und psychosoziale Faktoren in die Betrachtung einbeziehen.",
|
| 402 |
+
"Unprofessionell": "**Empfehlung:** Professionelle Distanz wahren - Klare Rollenabgrenzung und Einhaltung professioneller Standards in der Kommunikation.",
|
| 403 |
+
"Persönlich nehmen": "**Empfehlung:** Symptomverständnis entwickeln - Abweisung und Widerstand als Teil der Symptomatik verstehen, nicht als persönlichen Angriff interpretieren."
|
| 404 |
}
|
| 405 |
+
|
| 406 |
for issue, count in improvement_counts.most_common():
|
| 407 |
+
recommendation = professional_recommendations.get(issue, f"Entwicklungsbereich: {issue}")
|
| 408 |
percentage = (count / message_count) * 100
|
| 409 |
+
feedback += f"**{issue}** \n{recommendation} \n*Identifiziert in {count} von {message_count} Gesprächseinheiten ({percentage:.1f}%)*\n\n"
|
|
|
|
|
|
|
| 410 |
|
| 411 |
+
# Professionelle Handlungsempfehlungen
|
| 412 |
+
feedback += "## PROFESSIONELLE HANDLUNGSEMPFEHLUNGEN\n\n"
|
| 413 |
+
|
| 414 |
+
if total_positive > total_negative * 2:
|
| 415 |
+
feedback += """### Für Fortgeschrittene
|
| 416 |
+
- **Supervision:** Regelmäßige Fallbesprechungen zur Reflexion komplexer Gesprächssituationen
|
| 417 |
+
- **Weiterbildung:** Vertiefung in spezifischen Methoden der Krisenintervention
|
| 418 |
+
- **Mentoring:** Weitergabe von Expertise an Kolleg*innen und Nachwuchskräfte
|
| 419 |
+
- **Dokumentation:** Entwicklung von Best-Practice-Beispielen für das Team"""
|
| 420 |
+
elif total_positive > total_negative:
|
| 421 |
+
feedback += """### Für Kompetente Praktiker*innen
|
| 422 |
+
- **Reflexion:** Systematische Analyse der eigenen Gesprächsführung und Kommunikationsmuster
|
| 423 |
+
- **Fortbildung:** Teilnahme an spezialisierten Schulungen zu Gesprächsführung in Krisensituationen
|
| 424 |
+
- **Supervision:** Regelmäßiger fachlicher Austausch mit erfahrenen Kolleg*innen
|
| 425 |
+
- **Praxisvertiefung:** Weitere Simulationen und Rollenspiele zur Festigung der Kompetenzen"""
|
| 426 |
else:
|
| 427 |
+
feedback += """### Für Entwicklungsorientierte
|
| 428 |
+
- **Grundlagentraining:** Systematische Schulung in Gesprächsführungsgrundlagen
|
| 429 |
+
- **Supervision:** Intensive fachliche Begleitung durch erfahrene Supervisor*innen
|
| 430 |
+
- **Literaturstudium:** Vertiefung der theoretischen Grundlagen zu Depression bei Jugendlichen
|
| 431 |
+
- **Mentoring:** Begleitung durch erfahrene Kolleg*innen im Arbeitsalltag"""
|
| 432 |
+
|
| 433 |
+
feedback += f"\n\n---\n\n"
|
| 434 |
+
|
| 435 |
+
# Methodische Hinweise
|
| 436 |
+
feedback += f"""## METHODISCHE HINWEISE
|
| 437 |
+
|
| 438 |
+
**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.
|
| 439 |
+
|
| 440 |
+
**Bewertungsgrundlage:** Aktuelle Fachliteratur und Handlungsempfehlungen für den Umgang mit Depression bei Jugendlichen im schulischen Kontext.
|
| 441 |
+
|
| 442 |
+
**Limitation:** Diese Analyse stellt eine Momentaufnahme dar und ersetzt nicht die kontinuierliche Reflexion und Supervision der professionellen Praxis.
|
| 443 |
+
|
| 444 |
+
**Empfehlung:** Verwendung dieser Analyse als Grundlage für Entwicklungsgespräche und Fortbildungsplanung."""
|
| 445 |
|
| 446 |
return feedback
|
| 447 |
|