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.
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 — 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:
| Katman | Tetikleyici | Model | Tahmini % trafik |
|---|---|---|---|
| 1. Rule | "iade", "geri ödeme" gibi hotword | — | %15 |
| 2. Ucuz | Genel akış | gpt-4o-mini | %75 |
| 3. Fallback | confidence < 0.75 | claude-opus-4-7 | %10 |
# 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 — 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 — 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.