Stufe 1: komplexe Fragen via Query-Planer, Per-Query-Slots, Scope-Filter (D12, M6)

- Query-Planer (agent/query_planner.py): Heuristik-Gate (Jahr, Vergleichs-/
  Aggregationsmarker, Laenge) entscheidet ueber einen kleinen LLM-Call,
  der komplexe Fragen in 1-3 Sub-Queries zerlegt (JSON, temp 0; Fehler ->
  Original als Einzel-Query). Je Sub-Query optional stand_year und scope.
- Multi-Query-Retrieval: je Sub-Query BM25+Dense mit RRF-Summe;
  Per-Query-Slots (2 je Sub-Query) sichern jeden Frageaspekt im Kontext
  (sonst dominieren Eintraege, die in mehreren Sub-Queries mittelgut
  matchen — q-113-Befund). Scope-Filter: 'gesetz' (nur Lexis/WIKU/RIS)
  und 'kv' (nur Branchen-KV) mit Fallback auf unscoped bei leerem
  Ergebnis. Temporal-Intent: stand_year + temporal_boost (default 0,
  FTS-jahr-Tag-Signal reichte).
- Grounding unveraendert: eine Retrieved-Menge (Union), eine Antwort,
  Post-Validierung ueber die Union, Verweigerungspflicht unveraendert.
- Goldset 42 -> 46: q-110 (Temporal 2023; 2024er-Lohnordnung existiert
  im Korpus nicht - Mantelvertrag ohne Lohntabelle, korrekt verweigert),
  q-111 (2025), q-112 (Abfertigung-Vergleich), q-113 (Gesetz+KV).
- Eval (46 Fragen): Zitier-Praezision 97,8 %, Verweigerung 97,8 %
  (Gate >94,3 % erfuellt), erwartete Quelle 90,2 %, Latenz mean 33,5 s.
- Tests 50 -> 57. Reports lokal: data/eval-qwen38-stage1*.json.
  API-first festgehalten (D13-Vorbereitung): Odoo bleibt duenner Client;
  Lohndaten-Zugriff in M4 erfordert Privacy-Neubewertung.
This commit is contained in:
2026-09-15 09:58:25 +02:00
parent c594c553b5
commit 062e010d7b
10 changed files with 532 additions and 33 deletions
+33 -6
View File
@@ -180,21 +180,48 @@ zu planen).
0,973, MRR 0,667. ENV: PV_DENSE_WEIGHT / PV_RRF_K /
PV_CANDIDATE_POOL. Entry-RRF-Variante getestet: kein Mehrwert.
- **D11 (Prompt-Budget + Kontext-Abdeckung, 2026-09-15):** lange KV-Chunks
überlieferten num_ctx=16384 (q-022: 62,7 KB Prompt ≈ 18k Tokens) —
ueberlieferten num_ctx=16384 (q-022: 62,7 KB Prompt ≈ 18k Tokens) —
Ollama trunciert den Systemprompt vorn, das Modell verliert die
Zitierregeln („Block 8“-Zitate statt IDs → Regenerierung → Verweigerung).
Fix: num_ctx 32 768, `trim_results` (max_context_chars=90 000, Tail-
Blöcke ganz weg statt trunciert, Mindestbestand 6) und
cross_ref_expand 3 → 6 (die Top-3 sind oft Branchen-KV-Blöcke mit
Bloecke ganz weg statt trunciert, Mindestbestand 6) und
cross_ref_expand 3 → 6 (die Top-3 sind oft Branchen-KV-Bloecke mit
leeren cross_refs — kuratierte Nachbarn kamen sonst nie nach).
Ergebnis: alle 4 Fehlverweigerungs-Fälle (q-001/q-019/q-022/q-029)
geheilt, 10/10 Bestätigungsläufe OK. Eval: Zitier-Präzision 97,6 %,
Ergebnis: alle 4 Fehlverweigerungs-Faelle (q-001/q-019/q-022/q-029)
geheilt, 10/10 Bestaetigungslaeufe OK. Eval: Zitier-Praezision 97,6 %,
Verweigerung 97,6 % (> 94,3 %-Gate ✓), erwartete Quelle 91,9 %
(vorher 83,8 %), Retrieval Recall@8 **0,946** (cross_ref-Extras
bringen Expected-IDs nach), MRR 0,671. Latenz mean 33 s.
Report `data/eval-qwen38-kvris-tuned.json`. Restrisiko: q-024
flaky (1/3 Läufe — transienter leerer Draft, Think-Ghost-Verdacht);
flaky (1/3 Laeufe — transienter leerer Draft, Think-Ghost-Verdacht);
q-015 Branchen-Noise bleibt offen.
- **D12 (Komplexe-Fragen-Stufe 1 / M6, 2026-09-15):** Query-Planer vor dem
Retrieval: Heuristik-Gate (Jahreszahl, Vergleichs-/Aggregationsmarker,
Laenge) entscheidet, ob ein kleiner LLM-Call die Frage in 1-3 Sub-Queries
zerlegt (JSON, temp 0, num_predict 220; Fehler -> Original als Einzel-
Query). Multi-Query-Retrieval: je Sub-Query BM25+Dense, Beitraege
summieren; **Per-Query-Slots** (2 je Sub-Query) sichern jeden Frage-
aspekt im Kontext — ohne sie dominieren Eintraege, die in mehreren
Sub-Queries mittelgut matchen (q-113: 5 KV-Urlaubs-SS schlugen
lb-url-05 (Rang 6) und ris-url-01 (>Top-12) ueber beide Sub-Queries).
**Scope-Filter** je Sub-Query: Planer markiert "gesetz" (nur Lexis/WIKU/
RIS-Chunks) bzw. "kv" (nur Branchen-KV) — q-113 geheilt (ris-url-01/
lb-url-05 + KV-Ss im selben Kontext). Scope-Fallback: gefilterte Suche
leer -> unscoped. Temporal-Intent: stand_year je Sub-Query, kv-Eintraege
im Geltungsjahr erhalten temporal_boost (default 0 — FTS-Tag-Signal
`jahr-YYYY` reichte in der Messung). Grounding unveraendert: ein
Kontext aus der Union, Post-Validierung ueber die gesamte Retrieved-
Menge, Verweigerungspflicht unveraendert.
Eval (46 Fragen): Zitier-Praezision 97,8 %, Verweigerung 97,8 %
(Gate > 94,3 % erfuellt), erwartete Quelle 90,2 %, Latenz mean 33,5 s.
Temporal-Fragen laufen sogar ohne Planer gut (Jahr-Toknen matchen
`jahr-YYYY`-Tags). Neue komplexe Fragen im Goldset: q-110 (Temporal 2023,
nach Korrektur — eine 2024er-Friseur-Lohnordnung existiert im Korpus
NICHT: kv-kvt-161 ist der Mantelvertrag ohne Lohntabelle; korrekt
verweigert), q-111 (Temporal 2025), q-112 (Abfertigung Vergleich),
q-113 (Gesetz+KV Multi-Source). Tests 50 -> 57.
Offen: q-029 Survey (Stufe-2-Hebel: Map-Reduce), q-113 Planer-
Scope flaky (1/2 Laeufe ohne gesetz-Marker).
- **Bake-off-Protokoll** (Skill): Modellwechsel nur über dokumentierten
Goldset-Vergleich; Kriterium: Zitier-Präzision > Verweigerungs-
korrektheit > Latenz.