diff --git a/backend/lernen.py b/backend/lernen.py index 6911e40..f525e73 100644 --- a/backend/lernen.py +++ b/backend/lernen.py @@ -6,6 +6,7 @@ Prüfungs-Zähler (DB) und die Vertiefung (DB). """ import logging +import re import uuid from datetime import datetime, timezone @@ -181,6 +182,20 @@ def _bewertung_text(bew: dict) -> str: return f"Bewertung: {bew['bewertung']}\nFeedback: {bew['feedback']}" +# Deterministischer Guard gegen Doppelfragen — der KI-Kritiker übersieht „…, und welchen…". +_FRAGEWORT = r"(was|welche[rsnm]?|wie|wieso|warum|wofür|wozu|wann|wo|wer|wem|wen|nenne)" +_DOPPEL_RE = re.compile(r"[,;]?\s+(und|sowie|außerdem|bzw\.?)\s+" + _FRAGEWORT + r"\b", re.IGNORECASE) + + +def _doppelfrage_mangel(frage: str) -> str | None: + """Erkennt zwei verkettete Fragen. None = ok. Flaggt NUR 'und/sowie' + Fragewort.""" + if frage.count("?") > 1: + return "Mehr als ein Fragezeichen — stelle GENAU EINE Frage." + if _DOPPEL_RE.search(frage): + return "Zwei Fragen mit 'und'/'sowie' verkettet — stelle GENAU EINE Frage, eine Sache." + return None + + async def _frage_mit_kritik( topic: str, baustein: str, section_block: str, vertiefung_block: str, transcript: str, provider: str, @@ -202,6 +217,9 @@ async def _frage_mit_kritik( topic=topic, baustein=baustein, section_block=section_block, vertiefung_block=vertiefung_block, transcript=transcript, frage=frage, ) + hart = _doppelfrage_mangel(frage) # erzwingt Neugenerierung, auch wenn der KI-Kritiker es übersah + if hart: + probleme = [hart, *(probleme or [])] if not probleme: return frage kritik_block = _kritik_block(frage, probleme)