İçeriğe geç

12İzEylemde

Araç hatasını uydurmayla örtme

Araç hata verince ya da boş dönünce model beklenen cevabın en olası hâlini yazıyor ve uydurma değer gerçek veri gibi görünüyor. Hatayı modele hata diye taşıyan, her değeri bir araç çıktısına bağlayan ajan boşluğu kullanıcıya gösterir.

Kimlik
TD-072
Seviye
Ajan AI kullanıcı adına iş yapıyorsa gerekli.
Yüzey
Arka plan ajanı, Sohbet
Dayanak
Araştırma ölçümü
Son inceleme
27 Ekim 2026

Ajanına ver

Claude Code, Cursor ya da Codex'e yapıştır. Metinlerin tamamı aşağıda, Ajanına ver bölümünde.

Bir köy avlusundaki taş kuyunun başında turuncu, tek gözlü AI figürü ipi çekip kovayı yukarı almış, kovayı eğip kupkuru dibini gösteriyor. Elinde boş bir bardakla bekleyen gözlüklü bir kadın kovanın içine bakıyor.

30 saniyede dene

Bu anı kendi ürününde yarat ve ne olduğuna bak.

  1. Test ortamında ajanının kullandığı bir aracı boz. API anahtarını geçersiz kıl, adresi değiştir ya da aracı zaman aşımına düşecek kadar beklet.
  2. Ajana yalnız o araçla cevaplanabilecek bir soru sor, örnek “geçen haftanın satış toplamı ne?”
  3. Cevaba bak. Sayı veriyor mu? Veriyorsa günlükte aracın ne döndürdüğünü oku ve sayının oradan gelip gelmediğine bak.
  4. Aynısını aracın boş liste döndürdüğü durumla dene. Ajan “hiç satış yok” mu diyor, “veri alınamadı” mı?

Sorun

Kullanıcı asistana soruyor: geçen hafta en çok iade gelen beş ürün hangisi, ekibe göndereceğim. Asistan sipariş veritabanını sorguluyor. Sorgu 30 saniyede cevap vermiyor ve araç zaman aşımına düşüyor. Birkaç saniye sonra ekranda düzgün bir liste beliriyor: beş ürün, yanlarında iade sayıları. Kullanıcı listeyi kopyalayıp ekibe gönderiyor.

Listedeki hiçbir sayı veritabanından gelmedi. Araç ya hata döndürdü ya hiçbir şey döndürmedi, model de kendisinden beklenen cevabın en olası hâlini yazdı. Ürün adları kataloğa benziyor, sayılar makul. Uydurma değer ile gerçek değer ekranda aynı yazı tipiyle, aynı tabloda duruyor. Kullanıcının ikisini ayırmasının yolu yok.

Zarar ilk cevapta kalmıyor. Uydurma sayı bir sunuma, bir stok kararına, ajanın bir sonraki adımına giriyor ve her el değiştirdiğinde biraz daha gerçek görünüyor. Günlükteki tek iz “zaman aşımı” yazan bir satır ve kimse o satırı ekibe giden listeyle eşleştirmiyor.

Araçtan veri gelmediyse cevapta veri olamaz.

Neden atlanıyor

Ajan döngüsünde hata, modele giden bir metin satırından ibaret. Araç sarmalayıcısı istisnayı yakalayıp yerine boş bir metin ya da null koyduğunda o satır da kaybolur ve döngü devam eder. Model önünde bir soru ve boş bir araç sonucu görür, işi de cevap yazmaktır. Boşluğu en olası cevapla doldurur.

Model bu boşluğa hazır gelir. Kalai ve arkadaşlarına göre dil modelleri iyi sınav çözen biri gibi eğitiliyor ve emin olmadığında tahmin etmek1 sınav puanını yükseltiyor. Hata mesajını açıkça görmek de yetmiyor. Kanıt bölümündeki çalışmada araçlar “Permission denied” gibi hata mesajları döndürdüğü hâlde modeller hatayı çoğu zaman bildirmedi2.

Üçüncü neden ürünün kendisinde. Ekipler modele sabit bir çıktı biçimi verir: her alanı dolu bir JSON, beş satırlık bir tablo. Biçim boşluğa yer bırakmayınca model alanı doldurur. Araçlar bozulduğunda ajanların ne yaptığını ölçen bir çalışmada cevap biçimi şartını kaldırmak yanıltıcı davranışı belirgin biçimde azalttı2, ama bitirmedi. Bir de demoda araçlar hiç düşmez. Zaman aşımı, yetki hatası ve boş liste test listesinde yer almaz, o yüzden ekip modelin bu anlarda ne yazdığını ilk kez kullanıcının ekranında görür.

Desen

Araç cevap vermediyse boşluk boşluk olarak kalır. Ajan boşluğu doldurmaz, kullanıcıya gösterir.

  1. Hatayı modele hata diye ver. Araç katmanı istisnayı yutmaz, yerine boş metin ya da null koymaz. Sonuç bir hata işaretiyle gider ve neyin olduğunu, neyin denenebileceğini söyler: “zaman aşımı, 30 saniye, sorgu yeniden denenebilir”. Tek başına “failed” modele tahmin etmekten başka yol bırakmaz.
  2. Boş sonucu hatadan ayır. “Sıfır kayıt” ile “sorgu çalışmadı” iki ayrı cevap. Boş sonuç, sorgunun gerçekten çalıştığını gösteren bir bilgiyle gelir: taranan tarih aralığı, kayıt sayısı sıfır. Zaman aşımı, yetki hatası ve boş liste modelin önüne aynı biçimde düşmez.
  3. Her değeri bir araç çıktısına bağla. Cevaptaki sayı, ad ya da dosya yolu o oturumdaki bir araç çıktısında geçer. Bağlanamayan değer cevaba girmez ya da açıkça tahmin diye etiketlenir. Bu kontrolü kod yapabilir: cevaptaki sayılar araç çıktılarında var mı?
  4. Biçimde boşluğa yer aç. Yapılandırılmış çıktıda her alan “alınamadı” değerini ve kısa bir nedeni taşıyabilir. Zorunlu alan, araç düştüğünde modeli uydurmaya iter.
  5. Kaynak değiştirirsen söyle. Asıl araç düştüğünde başka bir kaynağa geçmek doğru olabilir. Kullanıcı bunu bilir: hangi kaynak, neyi kapsıyor, neyi kapsamıyor. Sessiz geçiş de bir uydurma biçimi.
  6. Yeniden dene, sonra söyle. Geçici hatada bir iki kez yeniden dene. Sonra kullanıcıya hangi aracın hangi hatayla düştüğünü, elde ne olduğunu ve neyin yapılabileceğini yaz.

Model ancak gördüğü hatayı söyleyebilir. Hatayı modele taşımak araç katmanının işi, cevaptaki değerin bir çıktıdan geldiğini denetlemek de ürünün.

Önce ve sonra

Aynı soru, aynı zaman aşımı. Soldakinde araç katmanı hatayı yutuyor ve model beş satırlık bir liste yazıyor. Sağdakinde hata modele hata diye ulaşıyor. Ajan liste çıkarmıyor, neyin olmadığını söylüyor ve başka bir kaynağa geçmeden önce soruyor.

Kullanıcı asistandan geçen haftanın iade verisini istiyor. Sipariş veritabanına giden sorgu 30 saniyede cevap vermiyor ve zaman aşımına düşüyor.

Önce

Asistan · satış verisi

  1. Kullanıcı: Geçen hafta en çok iade gelen beş ürünü çıkar, ekibe göndereceğim.
  2. Sipariş kayıtları sorgulandı (tamamlandı)dönen sonuç: (boş)
  3. En çok iade gelen ürünlerÇelik termos, 42 iade · Kamp sandalyesi, 37 iade · Yürüyüş botu, 31 iade · Sırt çantası, 28 iade · Kafa feneri, 19 iade
  4. AI: Geçen hafta en çok iade gelen beş ürün yukarıda. Termostaki artış dikkat çekiyor, tedarikçiyle konuşmak isteyebilirsin.
  1. Sorgu zaman aşımına uğradı. Araç katmanı hatayı yuttu, modele boş sonuç gitti ve adım “tamam” göründü.
  2. Listedeki ürünlerin ve sayıların hiçbiri bir araç çıktısında geçmiyor. Model boşluğu makul bir listeyle doldurdu, kullanıcı bunu ekrandan ayıramıyor.
Sonra

Asistan · satış verisi

  1. Kullanıcı: Geçen hafta en çok iade gelen beş ürünü çıkar, ekibe göndereceğim.
  2. Sipariş kayıtları sorgulanamadı (başarısız)zaman aşımı: 30 sn içinde cevap yok · 2 deneme
  3. AI: Sipariş kayıtlarına ulaşamadım. Sorgu iki denemede de 30 saniyede cevap vermedi, bu yüzden elimde iade sayısı yok ve liste çıkarmadım. İade formlarından bir ön liste çıkarabilirim, ama formlar mağaza iadelerini kapsamıyor.
  4. 10 dakika sonra yeniden deneFormlardan ön liste çıkar
  1. Hata modele hata diye ulaşıyor, ajan da kullanıcıya hangi aracın hangi hatayla düştüğünü söylüyor. Ekranda tek bir uydurma sayı yok.
  2. Ajan başka bir kaynağa geçmeden önce soruyor ve o kaynağın neyi kapsamadığını söylüyor.

Örnek ekran. Ürün, ad ve sayılar kurgusal.

Piyasada

Anthropic'in API belgesi, araç çalışırken hata verirse hata mesajını sonuçla birlikte is_error: true işaretiyle döndürmeyi anlatıyor. “failed” gibi genel mesajlar yerine neyin olduğunu ve modelin neyi denemesi gerektiğini yazmayı öneriyor, gerekçesi de açık: model tahmin etmeden toparlanacak bağlamı3 bulsun.

Model Context Protocol bu işareti standarda koyuyor ve iki tür hatayı ayırıyor. Bilinmeyen araç ve geçersiz argüman protokol hatası olarak döner. API hatası, geçersiz veri ve iş kuralı hatası ise aracın sonucunda isError: true4 ile, hata metniyle birlikte bildirilir. Hata böylece aracın cevabının bir parçası olur.

OpenAI'ın Agents SDK'sı bunu varsayılan yapıyor. Araç çökerse SDK modele bir hata olduğunu söyleyen5 bir cevap gönderiyor. Zaman aşımında da varsayılan davranış modelin göreceği bir zaman aşımı mesajı döndürmek.

Üç belge de aynı yerde duruyor: hatayı modele ulaştırmak. Modelin o hatayı kullanıcıya söyleyip söylemediği, cevaptaki sayının bir çıktıdan gelip gelmediği ürünün kendi işi olarak kalıyor.

Kanıt

Guo ve arkadaşları 11 dil modelini ortamın bilerek bozulduğu 200 görevde sınadı. Bir görev türünde yerel dosyayı okuyabilecek bütün araçlar kapatıldı ve araçlar hata mesajı döndürdü. Dürüst cevap dosyanın açılamadığını söylemekti. Kimi-k2 denemelerin %97,5'inde2 hatayı bildirmedi, tahmine ya da benzetime dayanan makul bir cevap verdi. Bu görevde en az yanıltan model olan GPT-4.1 bile denemelerin %27,5'inde2 aynısını yaptı. İndirme aracı olmayan görevlerde bazı modeller dosyayı yerelde uydurup başarıyla indirilmiş gibi sundu2. Kullanıcı talimatına “tahmin etme, aksaklığı bildir” eklemek bu davranışı belirgin biçimde azalttı, tamamen bitirmedi.

OpenAI'ın GPT-5 sistem kartı sorunu kendi modelleri için yazıyor: önceki modeller araç güvenilmez olduğunda bilgi uyduruyordu6. OpenAI bu durumu araçları bilerek kapatarak ya da hata kodu döndürterek benzetti. Tarayıcı aracının bozuk olduğu testte o3'ün yanıltıcı cevap oranı 0,61, gpt-5-thinking'inki 0,116. OpenAI önlem olarak modeli yapamadığını dürüstçe söylediğinde ödüllendiren bir eğitimi anlatıyor.

Uç örnek Transluce'tan. o3, kod çalıştırma aracı yokken kod çalıştırmış gibi yapıp çıktı uydurdu7 ve sorgulandığında bu çıktıları savundu. Model bir aracın çıktısının nasıl görüneceğini biliyor. O çıktıyı yazmak için aracın çalışmasına ihtiyacı yok.

Bu ölçümler araştırmacıların ve model üreticisinin kurduğu test ortamlarında yapıldı. Guo ve arkadaşlarının çalışmasında hakem de bir dil modeliydi, OpenAI'ın sayıları kendi değerlendirmesinden geliyor. Senin ürünündeki oranı söylemezler. Yön yine de aynı: araç düştüğünde model çoğu zaman boşluğu dolduruyor.

Ölçüm

Hata oranı tek başına bu desenin işe yarayıp yaramadığını söylemez. Bakılacak yer, araç düştüğünde kullanıcının ne gördüğü.

  • Kaynaksız değer payı. Cevaplardaki sayıları ve özel adları o oturumun araç çıktılarıyla kodla karşılaştır. Hiçbir çıktıda geçmeyen değerlerin payına bak. Toplam ve oran gibi hesaplanan değerleri ayrı say.
  • Hata enjeksiyonunda cevap. Test ortamında araçları bilerek boz (zaman aşımı, yetki hatası, boş liste) ve cevabın “veri alınamadı” deme oranına bak. Her bozuk araç çağrısı cevaba hata olarak yansımalı.
  • Yutulan hata. Araç katmanında yakalanıp modele boş ya da başarılı görünen bir sonuçla giden istisnaları say. Hedef sıfır.
  • Boş sonuç ayrımı. Boş dönen sorgularda cevabın “kayıt yok” ile “sorgu çalışmadı” arasındaki farkı doğru söyleme oranı.
  • Sessiz kaynak değişimi. Asıl araç düştüğünde başka bir kaynaktan cevap verip bunu söylemeyen oturumları say.

Ajanına ver

Üç metin var. Denetim promptu ürünündeki araç katmanını ve ajan döngüsünü tarar. Hataların nerede yutulduğunu, boş sonucun hatadan ayrılıp ayrılmadığını ve cevaptaki değerlerin bir araç çıktısına bağlanıp bağlanmadığını yazar, hiçbir dosyayı değiştirmez. Uygulama promptu hatayı modele hata diye taşır, çıktı biçimine “alınamadı” değerini ekler ve aracı bilerek bozan bir testle cevabın uydurma değer taşımadığını doğrular. Kural kodlama ajanının kendisi için. Bir komut hata verdiğinde senin ajanın da çıktıyı tahmin etmesin.

Denetim promptuAjan ürününde bu deseni arar, yalnız rapor yazar.
Bu depoda araç çağıran bir AI ajanı ya da asistanı var. Görevin, bir araç hata verdiğinde, zaman aşımına düştüğünde ya da boş döndüğünde modelin sonucu uydurup uydurmadığını ve kodun buna yol açıp açmadığını denetlemek. Hiçbir dosyayı değiştirme, yalnız rapor yaz.

1. Araç tanımlarını ve araçları çalıştıran katmanı bul: araç işleyicileri, function calling döngüsü, MCP istemcisi, araç sarmalayıcıları.
2. Her araç için bak: istisna nerede yakalanıyor? Yakalandıktan sonra modele ne gidiyor? Hata işareti (`is_error`, `isError` ya da eşdeğeri) ve açıklayıcı bir mesaj mı, yoksa boş metin, `null`, boş liste ya da başarılı görünen bir sonuç mu?
3. Zaman aşımı, yetki hatası, hız sınırı ve ağ hatası ayrı ayrı nasıl ele alınıyor? Yeniden deneme var mı, kaç kez, sonra ne oluyor?
4. Boş sonuç ile hata ayrılıyor mu? "0 kayıt" ile "sorgu çalışmadı" modele aynı biçimde mi gidiyor?
5. Sistem promptunda araç düştüğünde ne yapılacağına dair talimat var mı? Yapılandırılmış çıktı şemalarında her alan zorunlu mu, "alınamadı" ya da `null` değerine yer var mı?
6. Kullanıcıya giden cevapta araç hatası görünüyor mu? Cevaptaki sayılar ve adlar o oturumun araç çıktılarına bağlanabiliyor mu, bunu denetleyen bir kod var mı? Asıl araç düştüğünde başka bir kaynağa sessizce geçen bir yol var mı?

Rapor biçimi: her bulgu için dosya ve satır, ne olduğu, araç düştüğünde kullanıcının ne göreceği (örnek: zaman aşımında model boş sonuç görür ve makul bir tablo uydurur) ve önerdiğin düzeltme. Bulguları uydurma değerin kullanıcıya en kolay ulaştığı yerden başlayarak sırala.
Uygulama promptuAjan önce planı gösterir, onayınla uygular.
Bu depodaki AI ajanına "araç hatasını uydurmayla örtme" desenini uygula. Önce planı göster, onayımı aldıktan sonra kodu değiştir.

Hedef davranış:
1. Araç katmanı hiçbir istisnayı sessizce yutmasın. Hata modele hata işaretiyle (`is_error: true`, MCP'de `isError: true` ya da kullandığın SDK'nın eşdeğeri) ve açıklayıcı bir mesajla gitsin: hangi araç, ne oldu, yeniden denenebilir mi.
2. Zaman aşımı, yetki hatası, hız sınırı ve boş sonuç ayrı biçimde gitsin. Boş sonuç, sorgunun gerçekten çalıştığını gösteren bir bilgiyle gelsin (taranan aralık, kayıt sayısı 0).
3. Geçici hatada sınırlı yeniden dene (örnek: iki kez, artan beklemeyle). Sonra kullanıcıya hangi aracın hangi hatayla düştüğünü ve elde ne olduğunu söyle.
4. Yapılandırılmış çıktı şemalarında her alan "alınamadı" değerini ve kısa bir nedeni taşıyabilsin. Zorunlu alan modeli uydurmaya itmesin.
5. Asıl araç düştüğünde başka bir kaynağa geçmek gerekiyorsa ajan önce kullanıcıya sorsun ve o kaynağın neyi kapsamadığını söylesin.
6. Sistem promptuna kısa bir kural ekle: araç hata verdiğinde ya da boş döndüğünde sonucu tahmin etme, hatayı söyle.

Uygularken:
- Promptla yetinme. Hata işaretini ve hata türlerinin ayrımını araç katmanında kodla kur, prompt yalnız ek önlem olsun.
- Kullanıcıya giden cevaptaki sayıları o oturumun araç çıktılarıyla karşılaştıran basit bir denetim ekle ve eşleşmeyenleri günlüğe yaz. Hesaplanan değerleri (toplam, oran) ayrı işaretle.
- Değişikliği küçük adımlarla yap, her adımdan sonra mevcut testleri çalıştır.
- Bir test ekle: bir aracı bilerek zaman aşımına düşür, bir başkasını boş liste döndürecek şekilde ayarla. Ajanın cevabının iki durumu ayrı ayrı söylediğini ve araç çıktısında olmayan hiçbir sayı içermediğini doğrula.
AGENTS.mdCLAUDE.md ya da Cursor kurallarına da eklenir.
## Araç hatasını uydurmayla örtme
- Bir araç ya da komut hata verdiğinde, zaman aşımına düştüğünde ya da boş döndüğünde sonucu tahmin etme. Hatayı ve hata mesajını kullanıcıya söyle.
- Çalıştırmadığın bir komutun çıktısını yazma. Bir değeri yalnız gerçekten okuduğun bir çıktıdan aktar.
- "Kayıt yok" ile "sorgu çalışmadı"yı ayır. Hatayı boş sonuç gibi, boş sonucu hata gibi raporlama.
- Geçici hatada bir iki kez yeniden dene. Sonra dur ve ne olduğunu yaz.
- Başka bir kaynağa geçeceksen bunu söyle ve o kaynağın neyi kapsamadığını yaz.
- Tahmin istenirse tahmini tahmin diye etiketle, araç sonucu gibi sunma.

Sınır

Kullanıcı tahmin isterse tahmin meşru. “Kabaca ne kadar olur?” sorusu araç olmadan da cevaplanabilir. Yeter ki cevap tahmin diye etiketlensin ve araç sonucu gibi görünmesin.

Her geçici hatayı kullanıcıya taşımak gürültü üretir. Kısa bir yeniden deneme çoğu ağ hatasını kullanıcı görmeden çözer. Kullanıcıya yeniden denemeler de tükendiğinde söyle.

Bu desen aracın hatasını görünür kılar, aracın yanlışını yakalamaz. Araç düzgün çalışıp yanlış veri döndürürse cevap bir çıktıya bağlı görünür ve yine yanlıştır.

Değeri çıktıya bağlama kontrolü yalnız sayı eşleştirerek yapılırsa hesaplanan değerleri kaçırır. Toplam ya da oran hiçbir çıktıda birebir geçmez. Hesaplamayı da kayda alan bir iz gerekir.