Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a0d398a91 | |||
| 9ef1815b84 | |||
| 28ce0c7875 |
7
.gitignore
vendored
7
.gitignore
vendored
@@ -30,7 +30,6 @@ venv/
|
||||
input/
|
||||
output/
|
||||
summary/
|
||||
exp/
|
||||
*.json
|
||||
*.txt
|
||||
!requirements.txt <-- This "un-ignores" this specific file
|
||||
@@ -50,7 +49,7 @@ Thumbs.db
|
||||
# ======================
|
||||
# Experimental scripts
|
||||
# ======================
|
||||
2moodle.py
|
||||
app.old_inside_pipeline.py
|
||||
feedback_bewertung.py
|
||||
#2moodle.py
|
||||
#app.old_inside_pipeline.py
|
||||
#feedback_bewertung.py
|
||||
|
||||
|
||||
1539
exp/2moodle.py
Normal file
1539
exp/2moodle.py
Normal file
File diff suppressed because it is too large
Load Diff
1539
exp/app.old_inside_pipeline.py
Normal file
1539
exp/app.old_inside_pipeline.py
Normal file
File diff suppressed because it is too large
Load Diff
191
exp/feedback_bewertung.py
Normal file
191
exp/feedback_bewertung.py
Normal file
@@ -0,0 +1,191 @@
|
||||
# %% Feedback_Bewertung
|
||||
import openai
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
client = openai.OpenAI(
|
||||
api_key="sk--T3QiY4gBE67o9oSxEOqxw",
|
||||
base_url="http://pluto/v1"
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
EVAL_PROMPT = """
|
||||
Du bist ein strenger, objektiver Bewertender.
|
||||
Bewerte das folgende Feedback anhand der untenstehenden Kriterien.
|
||||
|
||||
Für jedes Kriterium musst du GENAU folgendes liefern:
|
||||
|
||||
- answer: true oder false
|
||||
- explanation: eine kurze, klare Begründung auf Deutsch, basierend ausschließlich auf dem gegebenen Feedback
|
||||
|
||||
KRITERIEN:
|
||||
1. Ist das Feedback zeitnah? (<48 Stunden)
|
||||
2. Enthält das Feedback narrative Kommentare?
|
||||
3. Ist der Ton positiv und/oder unterstützend?
|
||||
4. Beschreibt das Feedback beobachtbares Verhalten in klarer, eindeutiger Sprache?
|
||||
5. Verstärkt das Feedback, was gut gemacht wurde?
|
||||
6. Zeigt das Feedback Bereiche auf, in denen Verbesserungen nötig sind?
|
||||
7. Enthält das Feedback konkrete, spezifische Strategien zur Verbesserung?
|
||||
8. Bezieht sich das Feedback auf definierte Standards (z. B. EPA, Leistungsniveaus)?
|
||||
9. Passt der Anspruch/die Komplexität des Feedbacks zum Lernstand der Lernenden?
|
||||
|
||||
Gib die Ergebnisse AUSSCHLIESSLICH als JSON gemäß dem bereitgestellten Schema zurück.
|
||||
"""
|
||||
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
class CriterionResult(BaseModel):
|
||||
answer: bool | None
|
||||
explanation: str
|
||||
|
||||
class FeedbackEvaluation(BaseModel):
|
||||
timely: CriterionResult
|
||||
narrative_comments: CriterionResult
|
||||
positive_supportive_tone: CriterionResult
|
||||
clear_language: CriterionResult
|
||||
reinforces_strengths: CriterionResult
|
||||
identifies_improvements: CriterionResult
|
||||
includes_strategies: CriterionResult
|
||||
relates_to_standards: CriterionResult
|
||||
congruent_with_learner_level: CriterionResult
|
||||
|
||||
|
||||
|
||||
##
|
||||
|
||||
|
||||
|
||||
|
||||
# %% Main
|
||||
|
||||
input_dir = "./cruscloud/AudioFeedbackProject/Transkripte"
|
||||
|
||||
files = list(Path(input_dir).glob("*.txt"))
|
||||
|
||||
results = {}
|
||||
|
||||
for f in files:
|
||||
text = f.read_text(encoding="utf-8")
|
||||
|
||||
response = client.responses.parse(
|
||||
model="GPT-OSS-120B",
|
||||
input=[
|
||||
{"role": "system", "content": EVAL_PROMPT},
|
||||
{"role": "user", "content": text},
|
||||
],
|
||||
text_format=FeedbackEvaluation,
|
||||
)
|
||||
|
||||
results[f.name] = response.output_parsed
|
||||
|
||||
# Save results
|
||||
import json
|
||||
with open("feedback_evaluations.json", "w", encoding="utf-8") as out:
|
||||
json.dump({k: v.dict() for k, v in results.items()}, out, indent=4)
|
||||
|
||||
##
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# %% Feedback_Bewertung_Moodle
|
||||
import openai
|
||||
import os
|
||||
from pathlib import Path
|
||||
client = openai.OpenAI(
|
||||
api_key="sk--T3QiY4gBE67o9oSxEOqxw",
|
||||
base_url="http://pluto/v1"
|
||||
)
|
||||
|
||||
|
||||
EVAL_PROMPT = """
|
||||
Du bist ein strenger, objektiver Bewertender für medizinische Lehre.
|
||||
Bewerte das folgende Feedback anhand der Kursinhalte "Feedback in der Lehre: Basics".
|
||||
Für jedes Kriterium musst du GENAU folgendes liefern:
|
||||
- score: Zahl von 1 (beste Bewertung) bis 5 (gescheitert)
|
||||
- explanation: Ausführliche Begründung auf Deutsch mit:
|
||||
a) Zitat aus dem Kursmaterial das das Kriterium definiert
|
||||
b) Konkrete Analyse des Feedback-Textes mit Zitaten
|
||||
c) Klare Verknüpfung zwischen Kursanforderung und Feedback-Umsetzung
|
||||
|
||||
KRITERIEN (basierend auf Kursmaterial):
|
||||
1. KONKRETHEIT (Bild 4: Merkmale von Feedback)
|
||||
"Das Feedback sollte so konkret wie möglich sein. Die Wiedergabe beobachteter Beispiele ist hilfreich."
|
||||
Bewertung: Enthält das Feedback beobachtbare Beispiele statt Verallgemeinerungen?
|
||||
|
||||
2. ICH-BOTSCHAFTEN (Feedbackregeln)
|
||||
"Ein Feedback … wird in „Ich-Botschaften“ ausgedrückt. … ist nicht (ab)wertend."
|
||||
Bewertung: Wird subjektive Wahrnehmung in Ich-Formulierungen dargestellt?
|
||||
|
||||
3. STRUKTUR (WWW/BEB-Prinzip)
|
||||
WWW: "1. Wahrnehmung: Ich habe gesehen ... 2. Wirkung: ... das hat mich nervös gemacht. 3. Wunsch: Ich wünsche mir ..."
|
||||
BEB: "1. Beobachtung: Ich habe gesehen ... 2. Empfehlung: Ich empfehle ... 3. Begründung: Auf diese Weise vermeiden Sie ..."
|
||||
Bewertung: Folgt das Feedback einer klaren Struktur (WWW oder BEB)?
|
||||
|
||||
4. WERTSCHÄTZUNG (Bild 4: Merkmale von Feedback)
|
||||
"Feedback ... auf Augenhöhe: Feedbackgeber und Feedbackempfänger gehen respektvoll und wertschätzend miteinander um."
|
||||
Bewertung: Wird respektvoll und auf Augenhöhe kommuniziert?
|
||||
|
||||
5. VERBESSERUNGSEMPFEHLUNG (Feedbackregeln)
|
||||
"Ein Feedback … endet mit einer wertschätzenden Anregung für zukünftige Verbesserungen."
|
||||
Bewertung: Gibt es konkrete, wertschätzende Handlungsempfehlungen?
|
||||
|
||||
SCORING-ANLEITUNG:
|
||||
1 = Vollständige Umsetzung (exzellentes Beispiel)
|
||||
2 = Gute Umsetzung mit minimalen Lücken
|
||||
3 = Grundlegende Umsetzung mit signifikanten Mängeln
|
||||
4 = Unzureichende Umsetzung (wichtige Elemente fehlen)
|
||||
5 = Keine erkennbare Umsetzung (kriterienwidrig)
|
||||
|
||||
Gib die Ergebnisse AUSSCHLIESSLICH als JSON gemäß dem bereitgestellten Schema zurück.
|
||||
"""
|
||||
|
||||
from pydantic import BaseModel
|
||||
class CriterionResult(BaseModel):
|
||||
score: int # 1-5 (1=best, 5=failed)
|
||||
explanation: str
|
||||
class FeedbackEvaluation(BaseModel):
|
||||
konkretes_feedback: CriterionResult
|
||||
ich_botschaften: CriterionResult
|
||||
struktur: CriterionResult
|
||||
wertschaetzung: CriterionResult
|
||||
verbesserungsempfehlung: CriterionResult
|
||||
|
||||
|
||||
|
||||
##
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# %% Main
|
||||
input_dir = "./cruscloud/AudioFeedbackProject/Transkripte"
|
||||
files = list(Path(input_dir).glob("*.txt"))
|
||||
results = {}
|
||||
for f in files:
|
||||
text = f.read_text(encoding="utf-8")
|
||||
response = client.chat.completions.create(
|
||||
model="GPT-OSS-120B",
|
||||
messages=[
|
||||
{"role": "system", "content": EVAL_PROMPT},
|
||||
{"role": "user", "content": text},
|
||||
],
|
||||
response_format={"type": "json_object"},
|
||||
temperature=0.1
|
||||
)
|
||||
# Parse the JSON response
|
||||
import json
|
||||
parsed_response = json.loads(response.choices[0].message.content)
|
||||
results[f.name] = FeedbackEvaluation(**parsed_response)
|
||||
|
||||
# Save results
|
||||
import json
|
||||
with open("feedback_evaluations.json", "w", encoding="utf-8") as out:
|
||||
json.dump({k: v.dict() for k, v in results.items()}, out, indent=4, ensure_ascii=False)
|
||||
|
||||
##
|
||||
Reference in New Issue
Block a user