Zum Hauptinhalt springen
AI · · ~2 min Lesezeit

Silent Failure: Token-Context-Mismatch in lokalen LLMs erkennen

Das Modell behauptet 24K Kontext, liefert aber bei 9K Tokens plötzlich kürzere Antworten — ohne Fehlermeldung. Wie man Token-Context-Mismatches diagnostiziert und dauerhaft behebt.

LLMllama-swapCUDADebuggingAI

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:

  1. Falsche Model-Card — GGUF-Dateien enthalten Metadaten, die nicht immer stimmen
  2. Config-Override vergessen — der tatsächliche Wert im llama.cpp-Backend weicht ab
  3. 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 SizeVRAM für KV-CacheVerbleibend 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.