Halüsinasyon koruması: bot uydurmadan nasıl konuşur
LLM tabanlı bot'lar fiyat, stok, randevu saati uydurma riski taşır. LeadsUp'ın post-processing guard'ı bu riski sıfıra indiren bir doğrulama katmanı.
Altai Engineering
Platform Engineering
"Bot 2 milyona daire sattı ama daire 5 milyon"
Bir Pazartesi sabahı emlakçı arkadaş telefonla: "Bot WhatsApp'tan müşteriye 2M demiş, gerçek fiyat 5M, müşteri kapora atmak istiyor." 30 dakikalık pazarlık + özür sürecinin sonunda kayıp lead. Sebep: LLM halüsinasyon.
GPT/Claude gibi modeller eğitim verilerine bakar, "muhtemel cümle" üretir. DB'de görmediği bir fiyatı çoğu zaman yakın bir tahmin olarak verir — özellikle prompt'ta context az olduğunda. Bu, e-ticaret, emlak, sağlık gibi her sektörde felaket demek.
İki yaygın çözüm + biz niye 3.'yü seçtik
Çözüm 1: "Bana her şeyi sor, ben söyleyeyim" (RAG)
Bot her cevaptan önce DB'ye RAG sorgusu yapar, sonucu prompt'a inject eder. Anthropic + OpenAI bu yaklaşımı önerir.
Sorun: model RAG context'ini her zaman doğru kullanmıyor. "Ek bilgi var ama bana güvenme" diyemiyoruz, model yine de uyduruyor. RAG yardımcı ama yeter değil.
Çözüm 2: Tool-only mode
Bot kesinlikle generative cevap üretmez, sadece DB'den okur. Müşteri "fiyat ne kadar?" derse get_listing_details çağırır, JSON'u format'lar.
Sorun: doğal konuşma ölür. Müşteri "ya teşekkürler" derse bot ne yapacak? Tool yok. Generic fallback bot like UX bozulur.
Çözüm 3: Post-processing guard
Bot serbest konuşur, biz cevabı doğrulayıp gönderiyoruz.
Bot response → regex ile sayı/fiyat/m²/saat extraction → tool call result'larıyla karşılaştır → eşleşmeyenler varsa mesaj bloklanır + satıcıya devredilir.
function hallucinationGuard(input: {
botReply: string;
toolResults: Array<{ price?: number; sqm?: number; ... }>;
}): { passed: boolean; flaggedNumbers: number[] } {
const numbersInReply = extractNumbers(input.botReply);
const numbersFromTools = input.toolResults.flatMap(extractNumbers);
const flagged = numbersInReply.filter(
n => !numbersFromTools.some(t => withinTolerance(t, n, 0.05))
);
return { passed: flagged.length === 0, flaggedNumbers: flagged };
}
%5 tolerance
Bot "X dairenin fiyatı yaklaşık 3 milyon" derken DB'de 2.950.000 var → bu tolerans içinde, OK. %5 tolerance bot'a doğal konuşma alanı bırakırken büyük rakam farkını yakalar.
Daha sıkı durumlar (sağlık dozajları, ödeme tutarları) için %1 tolerance ayrı mode.
Bloklanan mesaj ne oluyor?
Bot cevabı müşteriye gönderilmez. Onun yerine:
- Audit log:
"hallucination_guard_tripped"event - Konuşma
transfer_to_agentile satıcıya devredilir - Müşteriye otomatik: "Sizi danışmanımıza bağlıyorum, hemen size dönecek"
- Satıcı paneline alarm: "Bot Y fiyatı söyledi, DB'de yok. Manuel cevap ver"
UX açısından kayıp değil — müşteri yine cevap alıyor, sadece insan eli devreye giriyor.
Sayı dışı halüsinasyon
İlk sürüm sadece sayıları kontrol ediyordu. Sonra fark ettik: bot özellik de uyduruyor. "Bu dairede asansör var" diyor — DB'de asansör yok.
İkinci versiyon: bot reply'daki feature claims (asansör, otopark, eşyalı, deniz manzarası) ürün metadata ile cross-check. Sektör template'inde tanımlı.
Wave 1.5'te süre ve mesafe de eklendi: "30 dakikalık yol" bot uydurabilir, gerçek 90 dk. duration_minutes ±%15, distance_km ±%10 tolerance.
Gerçek dataset
8 hafta production data:
- 124.000 bot cevabı
- 1.870'i guard tripped (%1.5)
- Bunların 1.642'si gerçekten hallucination (true positive)
- 228'i false positive (rakam doğru ama farklı formatta — örn. "3M" vs "3.000.000")
True positive rate %88. False positive'leri %0.18'e indirdik (228/124k). Müşteri deneyimi etkilenmiyor; 228 vaka 8 haftada manual review için ihmal edilebilir.
Hangi senaryolarda kritik?
- Emlak: fiyat + m² + oda sayısı
- E-ticaret: stok + sipariş tutarı + iade tutarı
- Sağlık: randevu saati + dozaj (bot zaten dozaj söyleyemez ama doğrulama backup)
- Lojistik: kargo durumu (Aras API'sinden gelmeli; bot uydurursa müşteri yanlış beklentiye girer)
Kod organizasyonu
src/services/hallucination-guard.ts — tek dosya 400 satır. Worker'ın runBotMotor fonksiyonu Claude response'unu göndermeden önce guard'dan geçirir. Guard fail = transfer_to_agent + audit + alarm.
İleriye dönük: LLM ile semantic-level guard (örn. "bu daire çok güzel" → "güzel" subjective, no factual claim → pass). Şu an heuristic + rule-based; v7'de Haiku tabanlı sınıflandırıcı ekleyeceğiz.
Sonuç
Halüsinasyon riski mimari karar — sonradan eklemek zor. LeadsUp'ı kullanmaya başlayan tenant'ların ilk soruları içinde "bot yanlış fiyat söylerse ne olur?" mutlaka var. Guard cevap.
Test etmek ister misiniz? Sandbox'ta deneyin — bot'a kasıtlı yanlış soru sorun, guard'ın blokladığını görün.
İlgili yazılar
Lead skorlama: 0-100 puan sistemini nasıl kurduk
LeadsUp'ın heuristic + AI hibrit lead scoring motorunun engineering hikayesi. Hangi sinyaller hangi puanları getiriyor, niye monotonic, threshold neden 70.
OkuBYOK chatbot — API maliyetini sıfırlayın, kontrolü size devredin
Bring Your Own Key (BYOK) ile Anthropic/OpenAI/Google API faturanız doğrudan size kesilir. Mark-up yok, kredi paketleri %75 indirimli. Maliyet kontrolü + KVKK uyumu artar.
OkuEmlak ofisi için lead otomasyonu — 0'dan kuruluma case study
Tek emlak ofisinin sıfırdan WhatsApp + bot + lead skorlama + agent takeover sistemine kuruluşu. 4 ay sonra %62 daha fazla iletişim, %22 daha hızlı kapanış.
Oku