update
This commit is contained in:
@@ -159,16 +159,20 @@ async def _frage_mit_kritik(
|
||||
|
||||
async def _bewertung_mit_kritik(
|
||||
topic: str, baustein: str, section_block: str, vertiefung_block: str,
|
||||
transcript: str, gute_antworten: int, provider: str,
|
||||
frage: str, transcript: str, gute_antworten: int, provider: str,
|
||||
) -> dict | None:
|
||||
"""Letzte Antwort bewerten, vom Kritiker prüfen lassen, bei Fehlurteil neu."""
|
||||
"""Antwort zur Frage bewerten, vom Kritiker prüfen lassen, bei Fehlurteil neu.
|
||||
|
||||
`frage` ankert, welche Frage geprüft wird; der Dialog (transcript) liefert die
|
||||
Antwort und eine etwaige Diskussion — so kann eine Re-Bewertung das Argument sehen.
|
||||
"""
|
||||
kritik_block = "(keine)"
|
||||
bew = None
|
||||
for _ in range(KRITIK_MAX_RUNDEN):
|
||||
bew = await _gen_call(
|
||||
"Baustein-Bewertung", "judge", _bewertung_schema, provider,
|
||||
topic=topic, baustein=baustein, section_block=section_block,
|
||||
vertiefung_block=vertiefung_block, transcript=transcript,
|
||||
vertiefung_block=vertiefung_block, frage=frage, transcript=transcript,
|
||||
gute_antworten=gute_antworten, noetig=NOETIG, kritik_block=kritik_block,
|
||||
)
|
||||
if bew is None:
|
||||
@@ -176,7 +180,7 @@ async def _bewertung_mit_kritik(
|
||||
probleme = await _kritik_call(
|
||||
"Baustein-Bewertung-Kritik", provider,
|
||||
topic=topic, baustein=baustein, section_block=section_block,
|
||||
vertiefung_block=vertiefung_block, transcript=transcript,
|
||||
vertiefung_block=vertiefung_block, frage=frage, transcript=transcript,
|
||||
bewertung_block=_bewertung_text(bew),
|
||||
)
|
||||
if not probleme:
|
||||
@@ -185,38 +189,74 @@ async def _bewertung_mit_kritik(
|
||||
return bew # best-effort nach der letzten Runde
|
||||
|
||||
|
||||
async def baustein_pruefung(
|
||||
topic: str, baustein: str, section: str, vertiefung: str | None,
|
||||
messages: list[dict], gute_antworten: int, provider: str = DEFAULT_PROVIDER,
|
||||
) -> dict | None:
|
||||
"""Ein Prüfungs-Turn: erst (falls Antwort vorliegt) bewerten, dann nächste Frage.
|
||||
def _bloecke(section: str, vertiefung: str | None) -> tuple[str, str]:
|
||||
return (
|
||||
section.strip() or "(keine Guide-Fassung übergeben)",
|
||||
(vertiefung or "").strip() or "(keine)",
|
||||
)
|
||||
|
||||
Generator + Kritiker-Loop je Schritt. Gibt
|
||||
{"feedback", "frage", "bewertung", "bestanden"} zurück · None bei Fehler.
|
||||
Bewertet wird nur, wenn der Verlauf mit einer Nutzer-Antwort endet — sonst
|
||||
bekäme der Evaluator keine Antwort zum Beurteilen.
|
||||
|
||||
async def pruefung_frage(
|
||||
topic: str, baustein: str, section: str, vertiefung: str | None,
|
||||
messages: list[dict], provider: str = DEFAULT_PROVIDER,
|
||||
) -> str | None:
|
||||
"""Aktion 'frage': nächste Frage generieren (Generator + Kritiker) · None bei Fehler."""
|
||||
try:
|
||||
section_block, vertiefung_block = _bloecke(section, vertiefung)
|
||||
transcript = _transcript(messages) if messages else "(leer)"
|
||||
return await _frage_mit_kritik(topic, baustein, section_block, vertiefung_block, transcript, provider)
|
||||
except Exception:
|
||||
log.warning("[%s] Frage fehlgeschlagen (%s)", topic, baustein, exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
async def pruefung_bewertung(
|
||||
topic: str, baustein: str, section: str, vertiefung: str | None,
|
||||
frage: str, messages: list[dict], gute_antworten: int, provider: str = DEFAULT_PROVIDER,
|
||||
) -> dict | None:
|
||||
"""Aktion 'antwort': Antwort zur Frage bewerten (Evaluator + Kritiker).
|
||||
|
||||
Gibt {"feedback", "bewertung", "bestanden"} · None bei Fehler.
|
||||
"""
|
||||
try:
|
||||
section_block = section.strip() or "(keine Guide-Fassung übergeben)"
|
||||
vertiefung_block = (vertiefung or "").strip() or "(keine)"
|
||||
section_block, vertiefung_block = _bloecke(section, vertiefung)
|
||||
transcript = _transcript(messages) if messages else "(leer)"
|
||||
bewerten = bool(messages) and messages[-1].get("role") == "user"
|
||||
|
||||
feedback, bewertung, bestanden = None, None, False
|
||||
if bewerten:
|
||||
bew = await _bewertung_mit_kritik(
|
||||
topic, baustein, section_block, vertiefung_block, transcript, gute_antworten, provider,
|
||||
)
|
||||
if bew is None:
|
||||
return None
|
||||
feedback, bewertung, bestanden = bew["feedback"], bew["bewertung"], bew["bestanden"]
|
||||
|
||||
frage = await _frage_mit_kritik(topic, baustein, section_block, vertiefung_block, transcript, provider)
|
||||
if frage is None:
|
||||
return None
|
||||
return {"feedback": feedback, "frage": frage, "bewertung": bewertung, "bestanden": bestanden}
|
||||
return await _bewertung_mit_kritik(
|
||||
topic, baustein, section_block, vertiefung_block,
|
||||
frage.strip() or "(keine Frage übergeben)", transcript, gute_antworten, provider,
|
||||
)
|
||||
except Exception:
|
||||
log.warning("[%s] Prüfung fehlgeschlagen (%s)", topic, baustein, exc_info=True)
|
||||
log.warning("[%s] Bewertung fehlgeschlagen (%s)", topic, baustein, exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
async def baustein_diskussion(
|
||||
topic: str, baustein: str, section: str, vertiefung: str | None,
|
||||
frage: str, letzte_bewertung: str | None, messages: list[dict], provider: str = DEFAULT_PROVIDER,
|
||||
) -> str | None:
|
||||
"""Aktion 'diskussion': Tutor erklärt/diskutiert die Frage oder eine Bewertung.
|
||||
|
||||
Kein Bewerten, kein Kritiker — hier ist der Mensch der Prüfer. None bei Fehler.
|
||||
"""
|
||||
try:
|
||||
section_block, vertiefung_block = _bloecke(section, vertiefung)
|
||||
prompt = _prompt(
|
||||
"Baustein-Pruefung-Diskussion",
|
||||
topic=topic, baustein=baustein,
|
||||
section_block=section_block, vertiefung_block=vertiefung_block,
|
||||
frage=frage.strip() or "(keine Frage übergeben)",
|
||||
letzte_bewertung_block=(letzte_bewertung or "").strip() or "(noch keine)",
|
||||
transcript=_transcript(messages) if messages else "(leer)",
|
||||
)
|
||||
returncode, stdout, _ = await run_agent(
|
||||
"pruefungdiskussion-" + str(uuid.uuid4()), prompt, CHAT_TIMEOUT,
|
||||
provider=provider, role="fast", capabilities="none", lane="interactive",
|
||||
)
|
||||
if returncode != 0:
|
||||
return None
|
||||
return stdout.strip() or None
|
||||
except Exception:
|
||||
log.warning("[%s] Prüfungs-Diskussion fehlgeschlagen (%s)", topic, baustein, exc_info=True)
|
||||
return None
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user