Otomatik yönlendirme · Uygulamalı

Müşteri destek ticket'larını AI ile otomatik sınıflandırıp ekibe yönlendirmek

Müşteriden gelen Türkçe destek mesajını AI okusun, ne hakkında olduğunu anlasın (faturalama, teknik destek, satış, iptal vb.), önceliğini belirlesin ve doğru ekibe yönlendirsin. POC playbook'unda bir model adayı çıktı; bu rehberde onu production'a hazır hâle getiriyoruz: hibrit akış (basit kural + ucuz model + güçlü model fallback), kritik ticket eskalasyonu ve haftalık drift kontrolü. Hepsi kopyala-çalıştır Python.

Süre10 dk okuma · 2 saat uygulama
RolBackend, support ops
ÇıktıProduction routing API
Production routing dört katmanlıdır: (1) basit rule'larla %15 trafiği modele bile gönderme, (2) ucuz model (gpt-4o-mini) ile %75 vakayı çöz, (3) güçlü fallback (claude-opus-4-7) ile %10 zor vakayı yakala, (4) kritik ticket'ı kural ile insana zorla. Maliyet düşer, kalite yükselir.

1. Production prompt + JSON şema

POC'deki gevşek prompt yetmez. Production'da modelin zorunlu alan, enum kategori ve hata payı 0 formatında çıktı vermesi gerekir. JSON schema validation hatalı çıktıyı yakalayıp insana yönlendirir.

routing_prompt.txt
# routing_prompt.txt — production prompt
Aşağıdaki destek ticket'ını sınıflandır.
Sadece geçerli JSON döndür, başka metin ekleme.

Kategoriler:
- billing (ödeme, fatura, iade)
- technical (entegrasyon, hata, API)
- sales (satış öncesi, fiyatlandırma)
- bug (yazılım kusuru)
- cancellation (hesap iptali, abonelik durdurma)
- other

Ticket:
{{ticket_text}}

JSON şeması:
{
  "category": "billing|technical|sales|bug|cancellation|other",
  "priority": "low|medium|high",
  "team": "billing_support|tech_support|sales|core_eng|account_ops|triage",
  "confidence": 0.0,
  "escalation_required": true,
  "rationale": "kısa Türkçe açıklama, max 80 karakter"
}

Parel API response_format: json_object parametresini destekler; modeli geçerli JSON dışı çıkış vermeye karşı zorlar (gpt-4o-mini, qwen3-max ve claude-opus-4-7'nin üçünde de çalışır).

2. Hibrit routing: rule + iki model

Tüm trafiği tek modele yollamak hem yavaş hem pahalıdır. Üç katmanlı bir router:

KatmanTetikleyiciModelTahmini % trafik
1. Rule"iade", "geri ödeme" gibi hotword%15
2. UcuzGenel akışgpt-4o-mini%75
3. Fallbackconfidence < 0.75claude-opus-4-7%10
router.py
# router.py — hibrit routing: rule + cheap model + strong fallback
import json
from openai import OpenAI

client = OpenAI(api_key=PAREL_API_KEY, base_url="https://api.parel.cloud/v1")

CONFIDENCE_THRESHOLD = 0.75
PROMPT = open("routing_prompt.txt").read()

def classify(model, ticket):
    response = client.chat.completions.create(
        model=model,
        messages=[
            {"role": "system", "content": "Return valid JSON only."},
            {"role": "user", "content": PROMPT.replace("{{ticket_text}}", ticket)},
        ],
        temperature=0,
        response_format={"type": "json_object"},
    )
    return json.loads(response.choices[0].message.content)

def route(ticket: str) -> dict:
    # Layer 1: rule-based hotwords (en hizli, en ucuz)
    lower = ticket.lower()
    if any(w in lower for w in ["iade", "geri ödeme", "para iadesi"]):
        return {"category": "billing", "team": "billing_support", "via": "rule"}

    # Layer 2: cheap model (gpt-4o-mini) — vakaların %85'i
    decision = classify("gpt-4o-mini", ticket)
    if decision["confidence"] >= CONFIDENCE_THRESHOLD:
        decision["via"] = "gpt-4o-mini"
        return decision

    # Layer 3: strong model fallback — sadece zor vakalar
    decision = classify("claude-opus-4-7", ticket)
    decision["via"] = "claude-opus-4-7"
    return decision

Sonuç: ortalama maliyet düşer (10× pahalı modele sadece %10 trafik gider), accuracy yükselir (zor vakalar güçlü modelde çözülür), p95 latency stabil kalır (cheap model rota %75 trafikte).

3. Escalation guardrail

Bazı ticket'ları modelin doğru sınıflandırmasına bel bağlayamazsınız. Üç kuralla modeli atlayıp doğrudan insana yönlendirin:

escalation.py
# escalation.py — kritik ticket'i modele birakma, insana zorla
HIGH_PRIORITY_KEYWORDS = ["acil", "urgent", "production down", "data loss", "kvkk"]

def needs_human_override(ticket: str, decision: dict) -> bool:
    # 1. Modelin zaten istegi varsa
    if decision.get("escalation_required"):
        return True

    # 2. Yuksek oncelikte ve confidence dusukse
    if decision.get("priority") == "high" and decision.get("confidence", 0) < 0.85:
        return True

    # 3. Kritik kelime gecerse, modeli atla
    lower = ticket.lower()
    if any(kw in lower for kw in HIGH_PRIORITY_KEYWORDS):
        return True

    return False

Bu mantık modelin doğruluğundan bağımsız çalışır; kritik ticket asla bir AI kararına teslim edilmez. Production'da bu en önemli emniyet kemeridir.

4. Haftalık drift monitoring

Modelin kalitesi zamanla düşebilir (yeni ürün özellikleri, dilin değişmesi, modelin sağlayıcı tarafında güncellenmesi). Haftalık otomatik eval ile accuracy düşüşünü erken yakalayın:

weekly_drift.py
# weekly_drift.py — eval setini production'da haftalik kostur
import csv, statistics
from router import classify

def weekly_drift_check(eval_csv: str, baseline: dict) -> dict:
    correct = 0
    confidences = []
    for row in csv.DictReader(open(eval_csv)):
        out = classify("gpt-4o-mini", row["ticket_text"])
        correct += out["category"] == row["expected_category"]
        confidences.append(out["confidence"])

    accuracy = correct / 50
    avg_conf = statistics.mean(confidences)

    drift = {
        "accuracy_drop": baseline["accuracy"] - accuracy,
        "confidence_drop": baseline["avg_confidence"] - avg_conf,
    }

    if drift["accuracy_drop"] > 0.03:  # %3 dusus -> alert
        send_slack_alert(f"Routing drift: accuracy {accuracy:.1%}")

    return drift

Cron olarak haftada bir koşturun. Accuracy %3'ten fazla düşerse Slack alert, %5'ten fazla düşerse fallback'i tetikleyin (otomatik olarak claude-opus-4-7'ye geçici geçiş).

Pilot timeline

Hafta 1: %5 trafik

Yeni router'ı production'a sok ama trafiğin sadece %5'i ona gitsin. Eski rule-based system kontrol grubu olarak paralel çalışır. Gözlemlenen: accuracy, eskalasyon override sayısı, false positive billing routes.

Hafta 2-3: %50 trafik

İlk hafta sorun çıkmadıysa %50'ye çık. Drift monitor haftalık koşar. Cost dashboard'da gpt-4o-mini vs claude-opus-4-7 oranını izle (hedef: 75/10).

Ay 1: %100 trafik

Tam migration. Eski rule-based system kapatılır. Drift monitor + escalation override haftalık raporu support yöneticisine düşer.