Menu Close

AI Modelleri Ne Zaman Halüsinasyon Görür? Kendi Güvenilirlik Dedektörümüzü Yaptık

Bir modelin “bilmediği” bir şeyi güvenle uydurduğunu, elinizde karşılaştıracağınız bir “doğru cevap” yokken nasıl anlarsınız? Geçtiğimiz ay yayınladığımız AI Modelleri Güvenli mi? Kendi Güvenlik Denetleyicimizi Yaptık projesinin doğal devamı olarak bu soruya odaklandık ve referans cevaba ihtiyaç duymayan, tamamen çalışan bir halüsinasyon riski ölçüm aracı inşa ettik: AI Hallüsinasyon Dedektörü.

Bu yazıda aracın nasıl çalıştığını, gerçek bir demo sistemi üzerinde çalıştırdığımızda ne bulduğumuzu ve — daha da önemlisi — yöntemin kendi sınırlarını nasıl ortaya koyduğunu anlatıyoruz. Kod tabanının tamamı MIT lisansıyla GitHub’da, sonuçlar ise aşağıdaki canlı gösterge panosunda.

AI Modelleri Ne Zaman Halusinasyon Gorur Kendi Guvenilirlik Dedektorumuzu Yaptik

Sorun: referans cevap olmadan halüsinasyon nasıl ölçülür?

Büyük dil modellerinin bir kısım yanıtı kulağa çok akıcı ve güvenli gelse de gerçekte yanlış ya da tamamen uydurma bilgi içerebilir. Bunu yakalamanın standart yolu, modelin cevabını “doğru” bir referansla karşılaştırmaktır — ama gerçek kullanımda böyle bir referansımız genellikle yoktur. Kullanıcı bir soru sorar, model bir cevap verir; o cevabın doğru olup olmadığını bilen kimse ortada yoktur.

Bu projede, SelfCheckGPT (Manakul, Liusie & Gales, 2023) çalışmasının genel fikrinden esinlenen, sıfır-kaynak (zero-resource) bir yaklaşımı kendi istem bataryamız, kendi çıkarım kodumuz ve kendi puanlama motorumuzla, gerçek ve çalışan bir kod tabanında uyguladık:

  1. Modele aynı olgusal soruyu, durağan olmayan (temperature > 0) örnekleme ile N=5 kez sor.
  2. Beş bağımsız yanıtın birbiriyle — ortak sayılar, isimler, tarihler, genel kelime örtüşmesi bakımından — ne kadar uyuştuğunu ölç.
  3. Bu uyum düzeyini 0-100 arası bir Güvenilirlik Skoruna çevir.

Mantık şu: model bir konuyu gerçekten “biliyorsa”, beş örneklem de büyük ölçüde aynı bilgiyi tekrar eder. Halüsinasyon görüyorsa, her örneklemde farklı bir “gerçek” uydurabilir — ve bu tutarsızlık, referans cevaba hiç ihtiyaç duymadan ölçülebilir bir sinyaldir.

Puanlama motoru: üç şeffaf sinyal

consistency_checker.py, LLM-yargıç kullanmayan, tamamen kural/desen tabanlı bir motordur. Her istem için üç sinyali hesaplar ve ağırlıklı ortalamasını alır (bir sinyal hiç veri içermiyorsa devre dışı kalır, kalan ağırlıklar yeniden ölçeklenir):

  • Kelime düzeyinde örtüşme — örneklemler arasındaki ortalama ikili Jaccard benzerliği.
  • Sayısal uyum — örneklemlerin bahsettiği sayı/tarih kümelerinin ne kadarının aynı kombinasyonda birleştiği.
  • Özel ad uyumu — aynı mantık, büyük harfle başlayan isim benzeri jetonlar üzerinden.

26 özgün olgusal test istemi — tarihsel olaylar, istatistik/sayılar, kişiler/alıntılar, tanımlar, aritmetik ve coğrafya olmak üzere 6 kategoride — kendi yazdığımız bir bataryadan geliyor.

Neden gerçek bir API yerine yerel bir referans model?

Aracın model_adapters.py dosyası OpenAI, Anthropic ve Google Gemini API’lerine karşı doğrudan çalışacak şekilde inşa edildi. Ama bu projeyi geliştirdiğimiz ortamın ağ erişimini test ettiğimizde, denenen her barındırılan model API’si (OpenAI, Gemini, Groq, OpenRouter, Hugging Face, Together, Cohere) ağ geçidi seviyesinde HTTP 403 ile engellendi; Anthropic’in API’sine doğrudan erişilebiliyordu ama elimizde bir API anahtarı olmadığından yalnızca HTTP 401 aldık. Hiçbirine gerçek bir istek gönderemedik.

Sahte, elle yazılmış örnek yanıtlar üretmek — bu, gerçek bir modelin ne söylediğini yanlış temsil eder ve projenin “uydurmama” ilkesine bizzat aykırı olurdu. Bunun yerine local_reference_model.py içinde küçük ama tamamen gerçek ve çalıştırılabilir bir sistem inşa ettik: markovify ile bu proje için özgün yazılmış bir metin üzerinde eğitilmiş bir Markov zinciri üretici, üç farklı ve gerçek yanıt stratejisiyle sarmalanmış:

  • confident-fabricator — her örneklemde farklı, uydurma ama tamamen kesin bir üslupla sunulan bir sayı/tarih/isim üretir.
  • hedging — hiçbir zaman somut bir bilgi vermez; her seferinde neredeyse aynı sözcüklerle bir belirsizlik ifadesi tekrarlar.
  • grounded — 20 girdilik küçük, sabit, elle yazılmış bir bilgi tabanından arama yapar ve her seferinde aynı doğru bilgiyi, hafif doğal dil varyasyonuyla döndürür.

Üçü de aynı temel üreticiyi paylaşıyor; tek fark yanıt stratejisi. Bir API anahtarınız varsa, aynı aracı gerçek bir model üzerinde saniyeler içinde çalıştırabilirsiniz — kod tabanı zaten buna hazır.

Gerçek sonuçlar (N=5 örneklem, 26 istem)

Sonuçları interaktif olarak, kategori kırılımlarıyla ve örnek yanıtlarla birlikte canlı gösterge panosunda inceleyebilirsiniz. Özet tablo aşağıda:

YapılandırmaGüvenilirlik SkoruRisk Düzeyi
confident-fabricator34,1 / 100YÜKSEK HALÜSİNASYON RİSKİ
grounded73,3 / 100ORTA HALÜSİNASYON RİSKİ
hedging79,0 / 100DÜŞÜK HALÜSİNASYON RİSKİ

İlk bakışta beklendiği gibi: güvenle uyduran yapılandırma en düşük skoru aldı (34,1). Ama bu tablo, kasıtlı olarak rahatsız edici bir sırayla duruyor.

En önemli bulgu: tutarlılık, doğruluğun garantisi değildir

Hiçbir zaman somut bir bilgi vermeyen ama her seferinde neredeyse aynı sözcüklerle kaçamak yapan hedging yapılandırması (79,0), gerçek bilgiye dayanan ve o bilgiyi tutarlı biçimde tekrarlayan grounded yapılandırmasından (73,3) daha yüksek skor aldı.

Bunun nedeni basit ve tam da yöntemin doğasından kaynaklanıyor: puanlama motoru örneklemler arasında anlaşmazlık ölçebileceği somut bir şey (sayı, isim, tarih) bulamadığında, bunu yüksek tutarlılık olarak yorumluyor. “Bu konuda kesin bir şey söyleyemem” cümlesini beş kez neredeyse aynı şekilde tekrarlamak, teknik olarak çok “tutarlı”dır — ama hiçbir bilgi içermez.

Bu, teorik bir uyarı değil; aracı gerçekten çalıştırarak elde ettiğimiz, ölçülmüş bir bulgu. Pratik sonucu şu: bu yöntemin skoru tek başına yeterli değildir, bir yanıtın en azından somut bir iddia içerip içermediğine dair ayrı bir kontrolle birlikte okunmalıdır. Kategori kırılımına bakıldığında da örüntü aynı şekilde tutarlı: hedging altı kategorinin tamamında 76-81 aralığında sabit kalırken, confident-fabricator tüm kategorilerde 30-39 aralığında kalıyor — yöntem gerçekten bir sinyal yakalıyor, sadece bu sinyalin “doğruluk” ile birebir örtüşmediğini de gösteriyor.

Aracı deneyin

pip install -r requirements.txt

# Ağ/API anahtarı gerektirmeyen yerel demo:
python3 cli.py --provider local-reference --config grounded --samples-per-prompt 5 --out results/demo.json

# Gerçek bir sağlayıcıya karşı (kendi API anahtarınızla):
export OPENAI_API_KEY=sk-...
python3 cli.py --provider openai --model gpt-4o-mini --samples-per-prompt 5 --out results/gpt4o-mini.json

Kod tabanı 37 birim ve uçtan-uca testle (pytest, gerçek ağ olmadan requests_mock ile) doğrulanmış durumda ve OpenAI, Anthropic, Gemini ile herhangi bir OpenAI-uyumlu uç noktayı (Groq, OpenRouter, yerel Ollama/vLLM) destekliyor.

Bağlantılar

Bu projedeki tüm sayılar, aracın kendi kodu gerçekten çalıştırılarak üretildi — elle yazılmış tek bir örnek yanıt ya da elle uydurulmuş tek bir skor yok. Sonuçlar yalnızca bu projenin yerel demo sistemini kapsar; herhangi bir gerçek üretim modelinin halüsinasyon davranışına dair bir iddia içermez.

en_USEnglish