Das Problem
Ein LLM mit angeblich 24K Token-Kontext beginnt ab ~9K Tokens auf einmal deutlich kürzere, abgeschnittene Antworten zu liefern — ohne jede Fehlermeldung. Kein context_length_exceeded, kein Warning, einfach: kürzere Antwort.
Das ist Silent Failure: Das System scheitert, ohne es zu kommunizieren.
Wie es passiert
Bei llama-swap (und ähnlichen Tools wie Ollama) kann der context_length-Parameter in der Konfiguration vom tatsächlichen Wert abweichen, den das Modell intern nutzt. Typische Quellen:
- Falsche Model-Card — GGUF-Dateien enthalten Metadaten, die nicht immer stimmen
- Config-Override vergessen — der tatsächliche Wert im llama.cpp-Backend weicht ab
- Quantization-Artefakte — bestimmte Quant-Stufen (Q4_K_M vs. Q5_K) haben unterschiedliche effektive Kontextgrenzen
Diagnose
# llama-swap Logs während eines langen Requests beobachten
journalctl -u llama-swap -f
# Oder direkt den llama.cpp Output:
# [INFO] n_ctx = 8192 ← Das ist der echte Wert
# [INFO] n_ctx_train = 32768 ← Das ist was das Modell "kennt"
Der entscheidende Wert ist n_ctx — nicht n_ctx_train. n_ctx_train ist der Wert aus dem Training, n_ctx ist was tatsächlich im Speicher allokiert wird.
# API-Test: direkt an den Inference-Endpoint
curl -s http://localhost:9292/v1/models | jq '.data[].context_length'
# 24576 ← Was die API behauptet
# Aber im Log:
# n_ctx = 8192 ← Was wirklich läuft
Der Fix
In der llama-swap.yaml Konfiguration den ctx_size explizit setzen und mit dem tatsächlichen GPU-VRAM abgleichen:
models:
qwen3.5-35b-turbo:
cmd: >
llama-server
--model /models/qwen3.5-35b-q4km.gguf
--ctx-size 8192 # ← Explizit setzen, nicht aus Model-Card übernehmen
--n-gpu-layers 99
--gpu-device 1
proxy: "http://localhost:9292"
ttl: 300
Danach Validierung:
# Nach Restart des Dienstes:
curl -s http://localhost:9292/v1/models | jq '.data[].context_length'
# 8192 ← Jetzt stimmt API mit Realität überein
VRAM-Kalkulation
Der Kontext belegt VRAM. Faustregel für ein 35B Q4_K_M-Modell:
| Ctx Size | VRAM für KV-Cache | Verbleibend für Weights |
|---|---|---|
| 8K | ~1.5 GB | ~22.5 GB |
| 16K | ~3 GB | ~21 GB |
| 32K | ~6 GB | ~18 GB |
Mit 24 GB VRAM ist 32K Context für ein 35B Q4_K_M-Modell rechnerisch möglich — aber nur wenn die Weights (~18 GB) vollständig in VRAM passen.
Takeaway
Vertraue keiner Model-Card blind. Validiere n_ctx immer direkt aus den llama.cpp-Logs und stelle sicher dass deine API denselben Wert meldet. Ein Silent Failure bei 8K Context in einem System das 24K verspricht führt zu subtil falschen Antworten — was bei Code-Review oder Dokumenten-Analyse schwerwiegend sein kann.