İstanbul’daki bir e-ticaret şirketi (yıllık ciro 280 milyon TL) müşteri hizmetleri departmanına Azure OpenAI bazlı chatbot entegre etti. 90 günlük pilot sonunda 18.500 müşteri etkileşimi, %72 first-contact resolution, müşteri hizmetleri ekibinin yükünün %38’i azaldı. Bu yazı pazarlama söylemi yerine sahadan teknik notlar.
Use Case Tanımı
Önce hangi soruların chatbot’a, hangilerinin insan agent’a gideceği netleşti. Pilot scope:
- Sipariş takibi (order status)
- İade/değişim süreci açıklaması
- Ürün özellikleri (knowledge base’den)
- Kargo takibi
- Ödeme yöntemi sorunları (genel)
Out of scope (insan agent’a):
- Sipariş iptali (otorize işlem)
- Para iadesi (finans onayı gerekiyor)
- Şikayet/itiraz (insani empati gerekiyor)
- VIP müşteri (özel muamele)
Model Seçimi
| Model | Input cost (per 1K tok) | Output cost | Tipik kullanım |
|---|---|---|---|
| GPT-3.5 Turbo | $0.0005 | $0.0015 | Basit prompt, ucuz |
| GPT-4 Turbo | $0.01 | $0.03 | Karmaşık reasoning |
| GPT-4o | $0.005 | $0.015 | Multi-modal, hızlı |
| GPT-4o-mini | $0.00015 | $0.0006 | Production volume |
Müşteri hizmetleri use case’i için GPT-4o-mini seçildi: ucuz, hızlı, Türkçe kalitesi yeterli, basit Q&A için over-engineering yok.
RAG (Retrieval-Augmented Generation) Mimarisi
LLM’i kurum bilgisiyle “konuşturmak” için RAG. Mimari komponentleri:
- Knowledge base: Ürün katalog (12.400 SKU), iade politikası, kargo SSS, ödeme bilgileri — toplam ~~280 MB markdown/HTML
- Embedding model: text-embedding-3-large ile dökümanlar 1024-dim vector’a dönüştürülüyor
- Vector store: Azure AI Search (hybrid search: vector + keyword)
- LLM: GPT-4o-mini, retrieved context + user query → response
// Basitleştirilmiş RAG flow
var userQuery = "Ödediğim siparişin kargosu ne zaman elime ulaşır?";
// 1. Embedding
var queryEmbedding = await openAIClient.GetEmbeddingAsync(userQuery);
// 2. Vector search (top 5 relevant chunks)
var searchResults = await searchClient.SearchAsync(
queryEmbedding,
new SearchOptions { Size = 5, QueryType = QueryType.Semantic }
);
// 3. Context build
var context = string.Join("nn", searchResults.Select(r => r.Content));
// 4. LLM call with context
var systemPrompt = $@"Sen bir müşteri hizmetleri asistanısın.
Aşağıdaki bağlamı kullanarak müşterinin sorusuna Türkçe yanıt ver.
Bağlamda yoksa 'Bu konuda size canlı destek bağlamamı ister misiniz?' de.
BAĞLAM:
{context}";
var response = await openAIClient.GetChatCompletionsAsync(
new[] {
new ChatMessage(ChatRole.System, systemPrompt),
new ChatMessage(ChatRole.User, userQuery)
}
);
Azure AI Search Index Tasarımı
{
"name": "ecommerce-kb",
"fields": [
{"name": "id", "type": "Edm.String", "key": true},
{"name": "title", "type": "Edm.String", "searchable": true},
{"name": "content", "type": "Edm.String", "searchable": true},
{"name": "category", "type": "Edm.String", "filterable": true, "facetable": true},
{"name": "lastUpdated", "type": "Edm.DateTimeOffset", "sortable": true},
{"name": "contentVector", "type": "Collection(Edm.Single)", "dimensions": 1024,
"vectorSearchProfile": "myProfile"}
],
"vectorSearch": {
"algorithms": [{"name": "hnsw-config", "kind": "hnsw"}],
"profiles": [{"name": "myProfile", "algorithm": "hnsw-config"}]
},
"semantic": {
"configurations": [{
"name": "default",
"prioritizedFields": {
"titleField": {"fieldName": "title"},
"contentFields": [{"fieldName": "content"}]
}
}]
}
}
Hybrid search: keyword match (BM25) + vector similarity (HNSW) + semantic ranker — üçü birden, en iyi relevance.
Prompt Engineering
İlk versiyonun system prompt’u 30 kelime, çok genel: “Yardımcı bir asistansın.” Çıktı genel ve hayali. 4 hafta iterasyon sonra final prompt 220 kelime, içeriği:
- Rol tanımı (e-ticaret müşteri hizmetleri uzmanı)
- Davranış kuralları (kibar, profesyonel, kısa cevap)
- Kapsam dışı durumlar (canlı destek transfer kuralları)
- Çıktı formatı (1-3 paragraf, gerekirse madde işaretli)
- Hata durumları (bilmediği soru → “araştırıp dönelim mi” değil “canlı destek bağlamamı ister misiniz”)
- Türkçe yazım kuralları
Content Filter ve Safety
Azure OpenAI varsayılan content filter (4 kategori: hate, sexual, violence, self-harm) açık. Her input + output filter’dan geçiyor, hassas içerik blocklu.
Custom Türkçe küfür/hakaret listesi de eklendi (varsayılan filter Türkçe argo’da zayıf). PII detection (TC kimlik, kredi kart) çıktıdan otomatik mask’leniyor.
Conversation Memory
Çok turlu sohbet için conversation history Azure Cosmos DB’de saklanıyor (session bazlı, 24 saat TTL). Her turda son 5 turn LLM’e gönderiliyor — daha eski history özetlenip system prompt’a girer (token tasarrufu).
İlk 90 Günün Sonuçları
| Metrik | Değer |
|---|---|
| Toplam sohbet | 18.500 |
| Ortalama tur sayısı | 3.4 |
| First-contact resolution | %72 |
| İnsan agent transfer oranı | %28 |
| Müşteri memnuniyet (1-5) | 4.1 |
| Ortalama çözüm süresi | 2.1 dakika |
Maliyet
Aylık ~~6.000 sohbet, 5K input + 1K output ortalama. Token: 6.000 × 6.000 = 36M input + 6M output.
| Servis | Aylık (USD) |
|---|---|
| GPT-4o-mini (input + output) | $9 |
| text-embedding-3-large (~1M chars) | $0.13 |
| Azure AI Search (Standard S1) | $245 |
| App Service (chatbot frontend + backend) | $120 |
| Cosmos DB (conversation history) | $45 |
| Toplam | ~$420 |
Karşılığında 18.500 etkileşimin %72 = 13.300 self-served, müşteri hizmetleri ekibinden 13.300 × ortalama 6 dk = 79.800 dk = 1.330 saat tasarruf. Loaded hourly cost 200 TL = 266.000 TL/ay tasarruf, $7.500.
Sahada Düşülen Üç Tuzak
- Knowledge base’i güncel tutmamak: Ürün eklendi/çıkarıldı, fiyat değişti, kampanya başladı — index güncellenmezse chatbot eski bilgi veriyor. Otomatik daily re-index pipeline.
- Hallucination’ı kabullenmemek: LLM her durumda doğru cevap vermez. RAG ile grounding olsa bile bazen uyduruyor. “Emin değilseniz canlı desteğe bağlamayı tercih edin” disiplini.
- İnsan agent’ı tamamen elimine etmek: Hassas, karmaşık, duygusal vakalar insan eli gerektiriyor. Chatbot %30-40 oranında bypass tasarımı şart.
CloudSpark olarak Azure OpenAI RAG mimarisi, Azure AI Search index tasarımı, prompt engineering ve customer service chatbot entegrasyonu için danışmanlık veriyoruz.



