Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 580d02e98a |
7
.gitignore
vendored
7
.gitignore
vendored
@@ -30,6 +30,7 @@ venv/
|
|||||||
input/
|
input/
|
||||||
output/
|
output/
|
||||||
summary/
|
summary/
|
||||||
|
exp/
|
||||||
*.json
|
*.json
|
||||||
*.txt
|
*.txt
|
||||||
!requirements.txt <-- This "un-ignores" this specific file
|
!requirements.txt <-- This "un-ignores" this specific file
|
||||||
@@ -49,7 +50,7 @@ Thumbs.db
|
|||||||
# ======================
|
# ======================
|
||||||
# Experimental scripts
|
# Experimental scripts
|
||||||
# ======================
|
# ======================
|
||||||
#2moodle.py
|
2moodle.py
|
||||||
#app.old_inside_pipeline.py
|
app.old_inside_pipeline.py
|
||||||
#feedback_bewertung.py
|
feedback_bewertung.py
|
||||||
|
|
||||||
|
|||||||
1539
exp/2moodle.py
1539
exp/2moodle.py
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,191 +0,0 @@
|
|||||||
# %% 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