Icking AI-Pipeline Rebuild

Ziel

Komplette Neuformung der Leistungskatalog-Suche. Statt der alten Lambda-Mesh-Pipeline (3 Container-Lambdas + SQS + Jobs-Tabelle + Status-Handler, ~12s Latenz, ~119 EUR/Monat Idle) ein schlankes FastAPI-Service auf ECS Fargate ARM64 mit:

  • Bedrock EU (eu-central-1) als Embedding-Backend statt In-Process-Modell-Lambdas
  • Multi-Embedding-Bake-Off: 4 parallele Provider (Cohere v3/v4, Titan v2, BGE-M3 fine-tuned) — Cutover nach gemessenen Recall-Daten, nicht nach Plan-Annahme
  • Cohere Rerank 3.5 via bedrock-agent-runtime (separater Client) statt LLM-Rerank
  • Hybrid Search (pgvector cosine + tsvector deutsch + Maß-Boost) + Multi-Field-Score-Fusion
  • Single Container statt Mesh — Sync API mit /healthz (liveness) und /readyz (readiness via Background-Warmup)

Ziel-Latenz p50 warm < 500ms, p95 < 2s. Ziel-Cost Idle ~ Container-only (geschätzt 30-50 EUR/Monat).

Build-Account: av-production, nicht Icking-AWS (Icking-SSO blockt Marvin gerade). Cutover-Strategie wenn Phase 1 grün ist: entweder dort lassen (Marvin-betrieben, weiterberechnet) oder via SSO-Reset zu Icking migrieren.

Wo stehen wir gerade?

Stand 2026-05-18 (Handoff-Tag):

Phase 4 produktiv, Eval steht, Mails raus. Service läuft auf Revision 9 mit phase4-final-retry-Image (Retry-Wrapper für Bedrock-Throttle). Eval auf 51 expandierten LV-Position-Texten (florian_long.jsonl, LLM-erweitert aus Florians Stichworten):

  • R@1 = 74,5 %, R@3 = 86,3 %, R@5 = 96,1 %, R@10 = 96,1 %
  • 0/51 HTTP-Fehler (vorher 6/51 = 12 %)
  • Median-Latenz 10,1 s wegen 3-RPM-Rerank-Quota (Support-Case offen, Ziel 250 RPM)

Wichtig zur Methodik: Florian-Original-Stichwort-Set (data/eval/eval_set.jsonl, Ø 39 Zeichen pro Query) → R@10 = 54,9 % (Phase-4-Bilanz). Long-Set (florian_long.jsonl, Ø 107 Zeichen) → R@10 = 96,1 %. Die hohe Recall-Zahl misst den Use-Case „Bauleiter tippt ausformulierten LV-Text”, nicht „Florian tippt Stichwort”. Volle Methodik + Reproduzierbarkeits-Artefakte in Run-Doku Abschnitt „Eval-Methodik”.

Heute raus:

  • Mail an Nicole + Christoph (Eval-PDF Anhang, Aufpreis-Hinweis für Phase 5 platziert, HeyJulia-Vertragsfrage angetriggert) — Draft im Gmail, abgeschickt vom Marvin
  • Mail an Florian Schubert mit technischer API-Doku (PDF, Endpoint + Auth + curl/Python + Retry-Pattern) — gesendet
  • Neue URL https://inference.agenticventures.de/search ersetzt das alte Lambda+APIGW-Setup, Florian explizit informiert

Heute committed (auf feat/search-quality-phase4-wgr-boost, kein Push noch):

  • POST /batch Endpoint (1–50 Queries, sync, per-Query-Status, kein Polling-Pattern) — Architektur-Entscheidung gegen async-Job-Polling der alten Lambda-API. Motivation: nach Quota-Lift sind 10–20 Queries in 1–10 s sync drin, Polling-Infrastruktur wäre Overkill für einen Workflow der eh kurz ist.
  • _run_pipeline() Helper extrahiert, /search und /batch teilen sich die Pipeline. 21 Endpoint-Tests grün (12 alt + 9 neu für /batch).

Was als nächstes ansteht:

  1. Docker-Build + ECR-Push + ECS-Update für /batch (Docker-Daemon antwortet aktuell träge, holen wir nach)
  2. AWS-Quota-Lift abwarten — Support-Case eingereicht für Cohere Rerank 3.5 (250 RPM), Amazon Rerank 1.0 (200 RPM), Haiku 4.5 RPM (10.000)
  3. Phase 5 vorbereitet aber nicht aktiviert: Catalog-Anreicherung mit strukturierten Attributen (Hersteller, Modell, Funktion) — Aktivierung erst nach Florian-Feedback aus realen LV-Texten
  4. HeyJulia-Vertragsentwurf-Check mit Nicole + Christoph in einem Telefonat Mi/Do

Artefakte heute archiviert in Run-Verzeichnis: Eval-PDF + API-Doku-PDF jeweils als HTML-Quelle + gerenderte PDF, plus session-prompt der den Handoff dokumentiert. PDFs ebenfalls in s3://av-icking-eval-data/reports/2026-05-18/ für Cross-Account-Referenz.


Stand 2026-05-15:

Service ist live unter https://inference.agenticventures.de — ECS Fargate-Task running 1/1 seit 00:34 Uhr, RDS available, Cloudflare-Tunnel inference-prod (ID 560d3307-9e34-4878-bf1a-117a12f9cbd1) HEALTHY, /readyz mit allen Checks grün (db_pool, bedrock_runtime, bedrock_agent_runtime). Bedrock-Model-Access in av-production verifiziert fuer alle 5 Modelle (Titan v2, Cohere v3, Cohere v4 via eu.cohere.embed-v4:0 Inference-Profile, Cohere Rerank 3.5, Amazon Rerank v1).

Hostname-Drift: Plan/Terraform-README sprechen von leistungen.agenticventures.de, real konfiguriert ist inference.agenticventures.de. Die generische Variante ist bewusst gewaehlt (nicht Icking-spezifisch, ueberlebt Cutover ohne Rename) — Plan-Doku noch nicht nachgezogen.

Stand 2026-05-14:

  • ✅ Plan-Doku: ~/source/a-icking/docs/plans/2026-05-14-003-feat-bedrock-rebuild-plan.md
  • ✅ Unit 1: FastAPI-Skeleton + Auth (Bearer + Secrets Manager + Two-Key-Rotation) + Health/Ready (b412689)
  • ✅ Unit 2: pgvector-Pool + Schema (Migration 002 mit 4 parallelen Embedding-Spalten + tsv_combined + HNSW-Indizes) + Loader (32.718 Records geladen) + semantic_search Foundation (ec43d7c)
  • ✅ ce:review 13-Reviewer-Lauf + 9 P0-Auto-Fixes (399e404) — siehe Findings unten
  • ✅ Untested-Hot-Path-Tests: apply_migrations, load_catalog._clean, db._configure (b326946)
  • ✅ Unit 3: Embedding Strategy-Interface mit 4 Providern + Fallback-Wrapper auf Titan (d882746)
  • ✅ inference-service/README.md + AGENTS.md (38ce1b3)
  • ✅ Unit 4: Cohere Rerank 3.5 via bedrock-agent-runtime + Amazon Rerank v1 Fallback
  • ✅ Unit 4b: Hybrid Search Composition (semantic + ts_rank_cd + Maß-Boost) + Multi-Field-Score-Fusion + query_preprocessor migriert
  • ✅ Unit 5: POST /search Endpoint + DSGVO-Audit-Logging (5a7e3c9)
  • ✅ Unit 6: Bake-Off-Scripts (reembed_catalog + bake_off + eval-skeleton). Eval-Set 51 Florian-Cases liegt in data/eval/eval_set.jsonl (gitignored, Format: highest_score_id als Ground-Truth)
  • ✅ Unit 7: Terraform Fargate + Cloudflare-Tunnel-Sidecar + RDS + ECR + IAM + Secrets in av-production. Pattern: mcp-hosting-fargate-tunnel. Hostname-Empfehlung: leistungen.agenticventures.de
  • ✅ Unit 9: GitHub Actions CI mit OIDC. Workflow .github/workflows/inference-service.yml. Trust nur main + tags, kein PR-push aus forks
  • ✅ Unit 7: Terraform Stack appliziert in av-production — ECS Cluster + Service + RDS + ECR + Secrets + CF-Tunnel-Sidecar
  • ⏳ Unit 6: Multi-Embedding-Bake-Off auf parallelen Spalten — Bake-Off muss noch laufen, dann Provider-Cutover via Migration 003
  • ⏳ Unit 8: Alte Lambdas in Icking-Account abschalten — BLOCKED auf Icking-SSO
  • ⏳ Unit 10: Smoke + Docs + Phase-3-Handoff

153 Unit-Tests grün, ruff sauber. Deploy live. Was jetzt noch ansteht:

  1. Bake-Off triggern (reembed_catalog für die 4 Provider parallel, dann bake_off gegen die 51 Florian-Cases) und Provider-Wahl treffen
  2. DB-Migrations + Catalog-Load via ECS Exec falls noch nicht geschehen (32.718 Records aus Florian-CSV)
  3. Cutover-Strategie für alte Icking-Lambdas — wartet auf Icking-SSO-Reset

Architektur-Übersicht

GAEB-Position-Text
    │
    ▼
POST /search  (FastAPI, Bearer-Auth)
    │
    ├─► EmbeddingProvider (configurable: Cohere v3/v4, Titan v2, BGE-M3 lokal)
    │       via Bedrock invoke_model (oder SentenceTransformer in-process)
    │       Fallback-Wrapper → Titan v2 bei Throttle/5xx
    │
    ▼
   pgvector HNSW Cosine + tsv_combined GIN (Hybrid)
    │
    ▼
   Cohere Rerank 3.5 via bedrock-agent-runtime
   (Fallback: Amazon Rerank v1)
    │
    ▼
   Top-K Leistungs-Treffer + Score + Audit-Log

Wichtige Entscheidungen + Pivots

DatumEntscheidung
2026-05-14Rebuild statt Refactor (Audit hatte Refactor empfohlen, Marvin geht Hard-Reset)
2026-05-14Build in av-production statt Icking-Account — SSO-Block, kein Warten
2026-05-14Florian-Daten statt eigene — Justus Ahlmann lieferte 2025-11-07 bereinigten 32.718-Record-Auszug (Plain-Text, kein RTF); PII-Scan clean (B2B/NDA-Material)
2026-05-14Pepper/HMAC raus aus Audit-Log — keine PII im Datenset, key_id-Pseudonymisierung reicht
2026-05-14Multi-Embedding-Bake-Off mit parallelen Spalten statt Single-Provider-Switch (Migration 008-Pattern, Cutover-Drop in Migration 003 geplant)
2026-05-14Phase 1 = nur Leistungen, kein Material (55k Records geparkt für Phase 2)
2026-05-14Cohere Rerank > Claude Haiku-Rerank (purpose-built, ~5× billiger, deterministischer)
2026-05-18Sync /batch statt async Polling-API — alte Lambda-Pipeline hatte {queries: [...]} + job_id + Status-Endpoint. Sync-Batch ist genug nach Quota-Lift, spart Job-State + Background-Worker + Cleanup-Cron. Client-side Chunking gibt Florian besseres Progress als Server-Side Job-Polling.
2026-05-18Quota-Lift bei AWS beantragt — Cohere Rerank 3 → 250 RPM, Amazon Rerank 2 → 200 RPM, Haiku 4.5 10 → 10.000 RPM. Bis dahin: Retry-Wrapper hält Service am Leben mit aktiver Wartezeit statt 500.

ce:review-Findings — was offen ist

Auto-gefixt in 399e404 (9 Patches):

  • Settings-Validator fail-fast bei env!=DEV + dev-local-bypass oder devpassword
  • /readyz body leakt last_error nicht mehr (RDS-Hostname/User-Leak vermieden)
  • _fetch_active_keys try/except → 503 statt 500 bei Secrets-Manager-Fehler
  • asyncio.Lock um Key-Cache (Cache-Stampede-Fix)
  • open_and_wait(timeout=30s) + close_pool try/except
  • DB-Pool an state erst nach erfolgreichem open_and_wait
  • __version__ statt hardcoded “0.1.0”; Kunden-Name aus FastAPI-title raus
  • load_catalog case-insensitive Header-Lookup (guid3DCAD silent NULL gefixt)
  • compose.yml AWS_PROFILE-Default leer + --allow-remote-host-Pflicht in Loader

Offen für Folge-PRs:

  • Prod-warmup flippt bedrock_*_ready jetzt korrekt mit Unit 3 (war Auto-Fix-Blocker)
  • Key-Cache-TTL=120s blockt Sofort-Revoke → entweder TTL runter oder Force-Deploy dokumentieren
  • get_settings() bei Modul-Import → create_app()-Factory wäre testbarer
  • mypy strict=true ohne CI-Gate
  • HNSW-Bake-Off-Cost: DROP-Index → Bulk-Load → CREATE-Index Strategie für Unit 6
  • AppState wachsende God-Class → dict[str, bool] für Readiness in Unit 4

Risiken / Offene Fragen

  • Icking-SSO blockt — av-production ist Workaround. Cutover-Strategie braucht klären sobald SSO wieder funktioniert
  • Bake-Off-Ergebnis offen — Plan annimmt Cohere v3 als Default, könnte BGE-M3 fine-tuned schlagen wenn Recall@k es zeigt
  • Alte Lambdas in Icking-Account laufen weiter — kein aktiver Nutzer bekannt, ~119 EUR/Monat Idle. Abschalten sobald Phase 1 grün

Wirtschaft

  • Audit hatte 2.500 EUR Festpreis für Refactor vorgeschlagen
  • Rebuild ist deutlich mehr Aufwand — Pricing-Frage offen, hängt am Wert für Icking nach Cutover

Notizen

  • Sprache mit Icking auf Business-Niveau, nicht Tech-Jargon — gleiche Regel wie für HeyJulia
  • Alles Technische zwischen Marvin und Florian — nicht durch Nicole/Christoph durchreichen
  • Bake-Off-Daten sind die einzige akzeptable Grundlage für Provider-Wahl, nicht Plan-Annahme

0 Dateien in diesem Ordner.