Health check HTTP standar (liveness/readiness probe) pada LLM runtime seperti vLLM, TGI, atau Triton hanya memverifikasi alokasi memori GPU dan kesiapan server HTTP. Probe ini mengembalikan status 200 OK meskipun model mengalami degradasi internal, seperti kegagalan adherence system prompt, tokenizer mismatch, atau regresi kuantisasi yang memicu halusinasi dan kerusakan format output.

Mirror canary deployment memitigasi risiko ini. Sebelum traffic pengguna dialihkan ke pod versi baru, traffic di-mirror atau dialirkan synthetic probe paralel. Tujuannya: mengukur kepatuhan struktur output, latensi token, dan semantic drift secara realtime.

1. Desain Synthetic Mirror Probe

Synthetic probe mengeksekusi test suite deterministik ke instance canary secara berkala. Karakteristik utama probe ini meliputi:

  • Suhu Nol (temperature=0.0): Mengeliminasi variasi stokastik untuk mendeteksi deviasi keluaran yang murni berasal dari bobot atau chat template.
  • Validasi Skema Keras: Memeriksa apakah output JSON mematuhi JSON Schema target tanpa teks halusinasi di luar kurung kurawal.
  • Verifikasi System Prompt Adherence: Memastikan instruksi negatif (misal: "Jangan sebutkan kata X") dan format constraint tetap dipatuhi.
  • Pengukuran Latensi Parsial: Memisahkan Time to First Token (TTFT) dan Inter-Token Latency (ITL).

Skrip Probe Deterministik

import json
import time
import urllib.request
from typing import Dict, Any

CANARY_URL = "http://llm-canary-service.internal:8000/v1/chat/completions"

GOLDEN_TEST_PAYLOAD = {
    "model": "current-target-canary",
    "messages": [
        {"role": "system", "content": "You are a strict data parser. Respond ONLY in valid JSON with keys: 'status' and 'code'. No intro, no markdown code fence."},
        {"role": "user", "content": "Parse: Operation completed successfully. Error 0."}
    ],
    "temperature": 0.0,
    "max_tokens": 32
}

def execute_probe() -> Dict[str, Any]:
    req = urllib.request.Request(
        CANARY_URL,
        headers={"Content-Type": "application/json"},
        data=json.dumps(GOLDEN_TEST_PAYLOAD).encode("utf-8"),
        method="POST"
    )
    
    start_time = time.perf_counter()
    try:
        with urllib.request.urlopen(req, timeout=5.0) as resp:
            latency = time.perf_counter() - start_time
            if resp.status != 200:
                return {"pass": False, "error": f"HTTP_{resp.status}", "latency": latency}
            
            body = json.loads(resp.read().decode("utf-8"))
            output_text = body["choices"][0]["message"]["content"].strip()
            
            # Assert 1: Strict JSON validity
            parsed = json.loads(output_text)
            
            # Assert 2: Adherence to expected schema keys
            if set(parsed.keys()) != {"status", "code"}:
                return {"pass": False, "error": "SCHEMA_MISMATCH", "latency": latency}
            
            # Assert 3: Exact semantic match on deterministic query
            if parsed.get("code") != 0:
                return {"pass": False, "error": "SEMANTIC_DRIFT", "latency": latency}
                
            return {"pass": True, "error": None, "latency": latency}
            
    except json.JSONDecodeError:
        return {"pass": False, "error": "JSON_PARSE_FAIL", "latency": time.perf_counter() - start_time}
    except Exception as e:
        return {"pass": False, "error": type(e).__name__, "latency": time.perf_counter() - start_time}

if __name__ == "__main__":
    res = execute_probe()
    assert res["pass"] is True, f"Probe failed: {res['error']}"

2. Observabilitas Telemetri: OpenTelemetry & Prometheus

Hasil probe dikonversi menjadi metrik Prometheus oleh runner probe internal atau sidecar agent. Metrik utama yang wajib diobservasi:

  • llm_probe_adherence_ratio: Rasio request probe yang sukses melewati validasi skema dan constraint instruksi (target > 0.99).
  • llm_probe_drift_score: Jarak embedding kosinus atau Levenshtein distance terhadap respons baseline golden set.
  • llm_time_to_first_token_seconds: Histogram latensi pemrosesan prompt awal.
  • llm_generation_tokens_per_second: Throughput pembangkitan token di GPU canary.

Visualisasi metrik dilakukan paralel antara deployment stable dan canary. Deviasi rasio adherence di bawah baseline langsung mengindikasikan masalah kompatibilitas model atau template formatting.

3. Automated Rollback Berbasis Metrik

Gunakan Argo Rollouts bersama AnalysisTemplate untuk menghentikan traffic shift otomatis jika metrik integritas output LLM canary turun di bawah batas toleransi.

Konfigurasi AnalysisTemplate dan Rollout

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: llm-canary-adherence-analysis
spec:
  metrics:
  - name: probe-adherence-check
    interval: 30s
    successCondition: result[0] >= 0.98
    failureLimit: 2
    provider:
      prometheus:
        address: http://prometheus-k8s.monitoring:9090
        query: |
          sum(rate(llm_probe_adherence_success_total{deployment="llm-canary"}[2m]))
          /
          sum(rate(llm_probe_adherence_count_total{deployment="llm-canary"}[2m]))
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: llm-inference-deployment
spec:
  replicas: 10
  strategy:
    canary:
      analysis:
        templates:
        - templateName: llm-canary-adherence-analysis
      steps:
      - setWeight: 5
      - pause: {duration: 5m}
      - setWeight: 20
      - pause: {duration: 10m}

Jika canary menghasilkan output di luar skema validasi selama interval evaluasi, metrik jatuh di bawah ambang 0.98. Argo Rollouts langsung menghentikan promosi, mengalihkan 100% traffic kembali ke pod stable, dan menandai rollout sebagai Degraded.

4. Format Postmortem Root Cause Regresi LLM

Jika rollback terpicu, lakukan isolasi masalah menggunakan format insiden ringkas berikut:

Ringkasan: Rollback otomatis terpicu pada step canary 5% (timestamp 14:02 UTC).
Indikator Kegagalan: llm_probe_adherence_ratio drop ke 0.72. Probe mencatat error JSON_PARSE_FAIL.
Root Cause: Bobot model hasil kuantisasi AWQ 4-bit merusak stop-sequence generation, menyebabkan model menambahkan token trailing alih-alih menutup JSON string. Chat template Jinja pada image baru kehilangan flag add_generation_prompt=True.
Tindakan Mitigasi: Revert image inference server ke hash commit sebelumnya. Tambahkan unit test parser pada golden set sebelum push registry.

5. CI/CD Gate Test Preventif

Mencegah regresi lolos ke tahap canary dilakukan dengan memindahkan pengujian ke pipeline CI/CD sebelum deployment manifest di-apply:

  1. Tokenizer & Chat Template Parity: Eksekusi assertion script yang menguji kesamaan token ID hasil tokenize antara versi release kandidat dan versi target.
  2. Offline Golden Eval (Zero-Shot Regression Test): Uji 100 sample prompt deterministik menggunakan lightweight runner. Pipeline diwajibkan fail jika terjadi degradasi akurasi skema sebesar 0% toleransi.
  3. Quantization Distortion Test: Hitung nilai perplexity pada dataset benchmark standar (seperti WikiText-2) untuk memastikan kuantisasi tidak merusak kapasitas reasoning dasar sebelum model dikemas ke dalam artifact registry.