7.0 KiB
Pass 0b Kosten-Benchmark (Stand 2026-04-27)
Dokumentation aller Versuche die Pass-0b-Generierungskosten zu optimieren. Ergebnis: v4-Prompt direkt mit Haiku Batch API ist die kosteneffizienteste Strategie.
Zusammenfassung
| Strategie | Kosten/10k | Qualitaet | Empfehlung |
|---|---|---|---|
| v4 direkt (Haiku Batch) | ~$33 | Alle 18 Felder | EMPFOHLEN |
| v3 + Haiku Backfill | ~$31.60 | Gleich gut, 2 Schritte | Nicht empfohlen |
| v3 + Mac Mini Backfill | ~$25 + 77h Wartezeit | Schwaecher bei applicability | Nicht empfohlen |
| v4 direkt (Sonnet) | ~$95 (geschaetzt) | Gleich gut | Zu teuer |
Getestete Strategien
1. Haiku Batch API mit v3-Prompt (14 Felder)
Felder: title, assertion, objective, requirements, test_procedure, evidence, pass_criteria, fail_criteria, severity, category, check_type (5 Typen), merge_key, dependency_hints, lifecycle_phase_order
| Batch | Obligations | Controls | Kosten | Kosten/10k |
|---|---|---|---|---|
| Batch 1 | 10k | 9.885 | $23.00 | $23.00 |
| Batch 3 | 10k | 9.793 | $25.24 | $25.24 |
| Batch 4 | 20k | 19.546 | $49.77 | $24.89 |
Durchschnitt: ~$24.40/10k
Token-Verbrauch (Stichprobe):
- Avg Input: ~2.800 Tokens/Request
- Avg Output: ~4.000 Tokens/Request
- 5 Obligations pro Request
2. Haiku Batch API mit v4-Prompt (18 Felder)
Zusaetzliche Felder: applicability, scanner_hint, manual_review_required_if, evidence_type, provides_context
| Batch | Obligations | Controls | Kosten | Kosten/10k |
|---|---|---|---|---|
| Batch 2 | 10k | 9.855 | $33.00 | $33.00 |
| Batch 5 | 20k | 19.469 | $67.50 | $33.75 |
| Batch 6 | 20k | 19.529 | $66.42 | $33.21 |
| Batch 7 | 20k | 19.569 | $65.96 | $32.98 |
Durchschnitt: ~$33.24/10k
Token-Verbrauch (Stichprobe 20 Requests):
- Avg Input: 3.128 Tokens/Request
- Avg Output: 6.165 Tokens/Request
- 5 Obligations pro Request
3. v3 generieren + Haiku Backfill fuer 6 Extra-Felder
Idee: Nur Basisfelder via Sonnet/Haiku generieren, Extra-Felder nachtraeglich per guenstigem Haiku-Batch ergaenzen.
| Schritt | Controls | Kosten | Kosten/10k |
|---|---|---|---|
| v3 Generation (10k) | 9.885 | $24.40 | $24.40 |
| Haiku Backfill (28.5k) | 28.570 | $18.91 | $6.62 |
| Gesamt | — | — | $31.02 |
Ergebnis: Nur ~$2 billiger als v4 direkt, aber 2 separate Schritte noetig. Nicht empfohlen.
4. Mac Mini (qwen3:30b-a3b) fuer Backfill
Idee: Extra-Felder kostenlos lokal per qwen3 generieren statt Haiku.
| Metrik | Wert |
|---|---|
| Modell | qwen3:30b-a3b (MoE, 3.3B aktiv) |
| Batch Size | 3 (bei 10 → JSON-Parse-Fehler) |
| Avg pro Control | 13.9 Sekunden |
| Hochrechnung 20k | 77 Stunden (3+ Tage) |
| Erfolgsrate | 100% (bei batch_size=3) |
| Kosten | $0 |
Qualitaetsvergleich qwen3 vs. Haiku:
| Feld | Haiku | qwen3 | Bewertung |
|---|---|---|---|
| check_type | Korrekt | Korrekt | Gleich |
| evidence_type | Korrekt | Korrekt | Gleich |
| applicability | Erkennt Bedingungen (z.B. context.processes_personal_data) |
Meistens {} (universell) |
Haiku besser |
| scanner_hint | Deutsch, praezise | Englisch, brauchbar | Haiku besser |
| provides_context | Sinnvolle Variablen | Aehnlich, andere Konvention | Gleich |
Ergebnis: Kostenlos aber 3 Tage Laufzeit und schwaecher bei applicability. Nicht empfohlen.
Kostenmodell (Haiku 4.5 Batch API)
| Metrik | Preis |
|---|---|
| Input Tokens | $0.40/1M (Batch, 50% off) |
| Output Tokens | $2.00/1M (Batch, 50% off) |
| Cache Read | $0.04/1M (Batch, 50% off) |
| Cache Write | $0.50/1M (Batch, 50% off) |
Hauptkostentreiber: Output-Tokens (5x teurer als Input). Jedes zusaetzliche Feld im Prompt erhoeht die Output-Laenge.
| Prompt-Version | Avg Output/Request | Output-Kosten/Request |
|---|---|---|
| v3 (14 Felder) | ~4.000 Tokens | $0.008 |
| v4 (18 Felder) | ~6.165 Tokens | $0.012 |
Warum v4 direkt die beste Strategie ist
- Kostendifferenz minimal: v4 ($33/10k) vs. v3+Backfill ($31/10k) = nur $2 Unterschied
- Ein Schritt statt zwei: Kein separater Backfill-Lauf noetig
- Konsistente Daten: Alle Felder kommen aus dem gleichen LLM-Call, keine Inkonsistenzen
- Kein Backfill-Overhead: Keine zusaetzliche DB-Aktualisierung, kein Monitoring
- Qualitaet: LLM generiert applicability im Kontext der vollen Obligation (besser als nachtraeglich)
Gesamtkosten Pass 0b (180k Obligations)
| Posten | Kosten |
|---|---|
| Batch 1 (v3, Test) | $23.00 |
| Batch 2 (v4, Test) | $33.00 |
| Backfill 1 (9.6k) | ~$1.50 |
| Batch 3 (v3) | $25.24 |
| Batch 4 (v3, 20k) | $49.77 |
| Backfill 2 (28.5k) | $18.91 |
| Batch 5 (v4, 20k) | $67.50 |
| Batch 6 (v4, 20k) | $66.42 |
| Batch 7 (v4, 20k) | $65.96 |
| Batch 8+ (v4, ~70k) | ~$231 (geschaetzt) |
| Gesamt | ~$582 |
Urspruengliche Schaetzung: $264 (basierend auf Sonnet-Batch mit weniger Feldern) Tatsaechlich: ~$582 (Haiku mit 18 Feldern, doppelt so viele Output-Tokens)
Lessons Learned
- Output-Tokens dominieren die Kosten — Nicht Input, nicht Modellwahl
- Haiku ist bereits das guenstigste Modell — Sonnet waere ~3x teurer
- Batch API (50% Rabatt) ist Pflicht — Ohne Batch waere es $1.164
- Backfill lohnt sich nicht — Der Overhead (DB-Updates, Monitoring, Fehlerbehandlung) ueberwiegt die minimale Ersparnis
- Mac Mini (qwen3) ist zu langsam — 77h fuer 20k Controls, und schwaechere Qualitaet bei applicability
- v4-Prompt ist der Sweet Spot — Alle Felder in einem Call, konsistente Qualitaet, akzeptable Kosten
KRITISCH: Duplikat-Batch-Schutz
!!! danger "Batch API Duplikat-Fehler (2026-04-27) — $170 Mehrkosten"
curl meldete einen Timeout/Parse-Error obwohl der Server den Batch bereits an Anthropic
gesendet hatte. Durch Retry-Versuche wurden 3 identische Batches erstellt statt 1.
Die Anthropic Batch API ist NICHT idempotent — jeder POST erstellt einen neuen Batch.
Auch ein cancel stoppt nur unverarbeitete Requests — bereits laufende werden abgerechnet.
Schutzmassnahmen (implementiert)
- Idempotency-Sperre im Submit-Endpoint — Verweigert Submit wenn letzter Batch <10 Min alt
- NIEMALS
curlfuer Batch-Submits — Immerpython3 httpxmit 600s Timeout - Vor jedem Submit Batch-Liste pruefen:
GET /v1/messages/batches?limit=3 - Anthropic Dashboard pruefen wenn Kosten unklar
Korrekte Submit-Methode
# RICHTIG — Python httpx mit langem Timeout, kein Retry
ssh macmini "/usr/local/bin/docker exec bp-core-control-pipeline python3 -c \"
import httpx
resp = httpx.post('http://127.0.0.1:8098/v1/canonical/generate/submit-pass0b',
json={'limit': 10000, 'batch_size': 5},
timeout=600)
print(resp.json())
\""
# FALSCH — curl mit Retry-Risiko
# curl -sf -X POST http://127.0.0.1:8098/v1/canonical/generate/submit-pass0b ...
# Bei Timeout → NICHT nochmal ausfuehren!