Skip to content

Stage-8/Eval-Effizienz: PDF 3x pro Note, 24-MB-JSONL-Linearscan, Embeddings ohne Memoization, Cache-Rotation #151

Description

@TillQuandel

Befund

Sammel-Issue Stage-8-/Eval-Effizienz (reine CPU-/Wandzeit- und I/O-Redundanz, keine Qualitätsänderung; Review 2026-07-07):

  1. Dieselbe PDF wird bis 3× pro Note geparst: eval_note öffnet die Quell-PDF via fitz in build_chunks, _verification_text, _build_presence_scorer (eval_quality_v4.py:766, 781, 124, 471) und re-encodet ALLE PDF-Chunk-Embeddings pro Note (:161). Bei 10 Notes/Lauf: bis 30 Volltextextraktionen + 10× identisches Chunk-Encoding.
  2. Volltext-Normalisierung pro Claim: _verify_evidence normalisiert den gesamten PDF-Text per Regex pro Claim neu (:489 via :535); der Audit-Pfad berechnet _claim_scores_from_judge nochmal für alle Claims (:794).
  3. Hash-Guard scannt 24-MB-JSONL linear pro Note: find_cached_eval (eval_quality_v4.py:844-860, Aufrufer orchestrator.py:1284) liest quality_history.jsonl (23,9 MB, Records enthalten volle retrieved_contexts-Chunk-Texte, :565) komplett und parst jede Zeile — bis 10×/Lauf, wächst linear mit Historie.
  4. Body-Embeddings 3-4× pro Draft: ER, flag_redundant_siblings, CrossRef-Sibling-Ranking embedden dieselben Bodies unabhängig (orchestrator.py:427, 1188; cross_reference.py:436-437); embeddings.py hat keine Memoization.
  5. Stage 8 rein sequenziell + stiller Cap: orchestrator.py:1284 for-Loop (längste serielle Strecke des Laufs) und note_files[:10] — ab der 11. Note wird nie evaluiert, ohne Meldung. Umgekehrt gathern Canonicalizer-Merges ohne Semaphore (orchestrator.py:487-488) am max_concurrent_calls-Limit vorbei.
  6. Disk ohne Rotation: .cache/llm 1 579 Dateien (fresh-run-Namespaces werden nie wieder getroffen), .cache/runs 519 Traces, quality_history.jsonl 23,9 MB + 22-MB-Stale-Bak, 0-Byte-DB-Waise generative/.cache/atomic_analytics.db (zwei Cache-Roots: config.py:18 vs. db.py:27-28). Gesamt 55 MB — unkritisch, aber monoton wachsend.
  7. (Mit A/B-Vorbehalt) Stage 6 berechnet concept_text_window neu statt das Stage-5-Fenster aus concept_map zu nutzen (orchestrator.py:676) — Semantik minimal anders, nur nach Messung ersetzen.

Fix-Richtung

Memoisierung pro (pdf, Lauf) für Chunks/Embeddings/_normalize_for_evidence; Hash-Guard auf Index-Datei oder die vorhandene SQLite umstellen und quality_history um retrieved_contexts kürzen/rotieren; kleiner embed_body-LRU (key: hash(body)); Stage-8-Parallelität 2-3 + Cap-Meldung; Canonicalizer unter die Semaphore; Alters-/Anzahl-Rotation analog prune_old_records.

Priorität

Nach BA — spürbar bei jedem Lauf, aber nichts davon korrektheitskritisch.

Quelle: Projekt-Review 2026-07-07 (Effizienz-Subagent, alle Punkte am Code verifiziert, Disk real gemessen).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestparked-until-baUmsetzung geparkt bis nach BA-Abgabe 2026-07-27

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions