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/searchersetzt das alte Lambda+APIGW-Setup, Florian explizit informiert
Heute committed (auf feat/search-quality-phase4-wgr-boost, kein Push noch):
POST /batchEndpoint (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,/searchund/batchteilen sich die Pipeline. 21 Endpoint-Tests grün (12 alt + 9 neu für/batch).
Was als nächstes ansteht:
- Docker-Build + ECR-Push + ECS-Update für
/batch(Docker-Daemon antwortet aktuell träge, holen wir nach) - 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)
- Phase 5 vorbereitet aber nicht aktiviert: Catalog-Anreicherung mit strukturierten Attributen (Hersteller, Modell, Funktion) — Aktivierung erst nach Florian-Feedback aus realen LV-Texten
- 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:
- Bake-Off triggern (
reembed_catalogfür die 4 Provider parallel, dannbake_offgegen die 51 Florian-Cases) und Provider-Wahl treffen - DB-Migrations + Catalog-Load via ECS Exec falls noch nicht geschehen (32.718 Records aus Florian-CSV)
- 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
| Datum | Entscheidung |
|---|---|
| 2026-05-14 | Rebuild statt Refactor (Audit hatte Refactor empfohlen, Marvin geht Hard-Reset) |
| 2026-05-14 | Build in av-production statt Icking-Account — SSO-Block, kein Warten |
| 2026-05-14 | Florian-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-14 | Pepper/HMAC raus aus Audit-Log — keine PII im Datenset, key_id-Pseudonymisierung reicht |
| 2026-05-14 | Multi-Embedding-Bake-Off mit parallelen Spalten statt Single-Provider-Switch (Migration 008-Pattern, Cutover-Drop in Migration 003 geplant) |
| 2026-05-14 | Phase 1 = nur Leistungen, kein Material (55k Records geparkt für Phase 2) |
| 2026-05-14 | Cohere Rerank > Claude Haiku-Rerank (purpose-built, ~5× billiger, deterministischer) |
| 2026-05-18 | Sync /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-18 | Quota-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-bypassoderdevpassword /readyzbody leaktlast_errornicht mehr (RDS-Hostname/User-Leak vermieden)_fetch_active_keystry/except → 503 statt 500 bei Secrets-Manager-Fehlerasyncio.Lockum Key-Cache (Cache-Stampede-Fix)open_and_wait(timeout=30s)+close_pooltry/except- DB-Pool an state erst nach erfolgreichem
open_and_wait __version__statt hardcoded “0.1.0”; Kunden-Name aus FastAPI-title rausload_catalogcase-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_*_readyjetzt 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 testbarermypy strict=trueohne 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
Wichtige Links
- Kunde: icking
- Schwester-Projekt: _index
- Audit-Run: report
- Plan-Doku:
~/source/a-icking/docs/plans/2026-05-14-003-feat-bedrock-rebuild-plan.md - Repo:
~/source/a-icking/inference-service/ - Patterns die hier entstehen:
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