feat(search): deterministischer Backstop für heikle Kategorien
Schliesst die ~5-15 % Erst-Miss bei Fragen, deren veraltete Antwort
konfident-falsch waere (Amtstraeger, Wohnort lebender Personen, "lebt X noch").
- app/pipeline/search_backstop.py: should_force_search() erkennt solche
Phrasierungen per mehrsprachiger Regex (de/en/nl + etwas fr/es) mit
Gegenwarts-Schutz ("wer ist", nicht "wer war"). 22 Offline-Tests.
- ToolCallingLLM: bei Treffer wird die Suche DETERMINISTISCH erzwungen.
Wichtig: NICHT per tool_choice-Forcen (das honoriert das Modell nicht
zuverlaessig -> beobachtet: ignoriert, veraltete Antwort). Stattdessen
fuehrt der Wrapper die Suche selbst aus und speist das Ergebnis als
synthetischen Tool-Turn ein (_inject_forced_search). Metrik
search_forced_total. Filler/Geduld feuern auch hier.
- Haertung: _chat faengt non-JSON-200 ab (war ein Crash-/Hänger-Ausloeser,
betrifft auch Produktion).
Live verifiziert: "Wer ist Bundeskanzler?" sucht jetzt 3/3 -> Merz.
Tests: 312 gruen. Doc: §5.7.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
parent
96dcd87ca8
commit
6cd6e783aa
4 changed files with 148 additions and 6 deletions
|
|
@ -122,6 +122,21 @@ separat zählen — Kostensicht **und** Live-Beobachtung der Trigger-Rate.
|
|||
**Kein** eigenes Sonar-Kontingent in v1 (erst Metrik-Sicht; `quota.py`-Anbindung
|
||||
später bei Bedarf).
|
||||
|
||||
### 5.7 Such-Backstop (heikle Kategorien)
|
||||
Das Modell self-triggert zu ~93 %; die Misses liegen in den Kategorien, in denen
|
||||
eine veraltete Erstantwort **konfident-falsch** ist (Amtsträger, Wohnort lebender
|
||||
Personen, „lebt X noch"). `app/pipeline/search_backstop.py` erkennt solche
|
||||
Phrasierungen per mehrsprachiger Regex (`should_force_search`, Gegenwarts-Schutz:
|
||||
„wer **ist**", nicht „wer **war**" → historische Fragen triggern nicht; offline
|
||||
getestet). Bei Treffer erzwingt `ToolCallingLLM` die Suche **deterministisch**.
|
||||
|
||||
**Wichtige Designentscheidung:** *Nicht* per `tool_choice`-Forcen — das honoriert
|
||||
das Modell nicht zuverlässig (beobachtet: forced choice ignoriert → veraltete
|
||||
Antwort). Stattdessen führt der Wrapper die Suche **selbst direkt** aus und speist
|
||||
das Ergebnis als synthetischen Tool-Turn ein (`_inject_forced_search`); das Modell
|
||||
formuliert daraus. Metrik: `search_forced_total`. Recall-optimiert (lieber eine
|
||||
überflüssige Suche als eine konfident falsche Antwort).
|
||||
|
||||
## 6. Die zwei harten Stellen (bewusst benannt)
|
||||
|
||||
- **Streaming + Tool-Erkennung.** Beim gestreamten ersten Call kommen
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue