Ana içeriğe atla
LeadsUp
Blog'a dön

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

16 Mayıs 20264 dk okuma

"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:

  1. Audit log: "hallucination_guard_tripped" event
  2. Konuşma transfer_to_agent ile satıcıya devredilir
  3. Müşteriye otomatik: "Sizi danışmanımıza bağlıyorum, hemen size dönecek"
  4. 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.

LeadsUp ile aynı sonuçları kendi botunuzda görün

14 gün ücretsiz. Kredi kartı gerekmez.

Ücretsiz dene