Agent'lar ve Orchestration
AI Agent'lar için Observability: Bir AI Agent'ı Nasıl Debug Edersiniz?
Observability for AI Agents: How Do You Debug an AI Agent?
Ajanı log satırlarıyla değil, her model çağrısını, araç çağrısını ve kararı tek bir trace'te birleştirip eval ile ölçerek debug edersiniz; 2026'da ekiplerin çoğu tracing'i kurdu, eval tarafı hâlâ geride.
Ajan hatası çökme değil, başarılı yanıtla dönen yanlış karardır; onu ancak iç içe trace ile yolu görüp eval ile kaliteyi ölçerek yakalarsın.
Tracing yaygın biçimde benimsendi ve OpenTelemetry standardı şekilleniyor; eval benimsemede geride, konvansiyonlar da henüz Stable değil.
Zihinsel model
Trace uçağın kara kutusu, eval uçuş sınavıdır: biri ne olduğunu, diğeri iyi uçup uçmadığını söyler.
Neden
- Ajan non-deterministik çalışır; aynı isteği yeniden göndermek farklı yol üretir, ilk çalışmanın kaydı tek kanıttır.
- Hata araç seçiminde, parametrede ya da araç sonucunun yorumunda saklıdır; bunu yalnızca sıralı ve iç içe span'ler gösterir.
- Trace ne yapıldığını gösterir, iyi yapılıp yapılmadığını söylemez; kalite için hem yol hem sonuç puanlanmalı.
Kanıt
Ekiplerin yüzde 89'u ajanları için observability kullanıyor, ama çevrimdışı eval yapanlar ancak yarı yarıya.
LangChain State of Agent Engineering, 2026OpenTelemetry GenAI konvansiyonları ajan, model ve araç işlemlerini invoke_agent, chat ve execute_tool span tipleriyle standartlaştırıyor.
OpenTelemetry Semantic Conventions for Generative AI, 2026Güncel MCP spesifikasyonu trace bağlamını istek meta verisinde taşıyarak araç sunucusundaki işlemi aynı trace'e bağlıyor.
MCP Specification Changelog, 2026Karşı görüş
GenAI konvansiyonları hâlâ Development statüsünde ve adlar sürümler arasında değişiyor. Prompt içeriğini kaydetmek debug'ı kolaylaştırırken gizlilik ve KVKK riskini büyütüyor.
Kavramlar
Pratikte
- Ajan, model ve araç adımlarını standart span adlarıyla iç içe kaydet; kütüphane sürümünü sabitle.
- Kötü giden her üretim trace'ini eval setine yeni vaka olarak ekle.
- İstek başına araç çağrısı sayısını izle; ani artışı döngü alarmına bağla.
Klasik bir servis aynı girdiye aynı çıktıyı verir ve hata bir stack trace'te görünür. Bir AI ajanı ise aynı görevde bir seferinde üç, diğerinde on iki araç çağrısı yapabilir, hatayı da exception olarak değil yanlış ama kendinden emin bir cevap olarak üretir. 'Bir ajanı nasıl debug edersiniz?' sorusu bu yüzden gözlemlenebilirliği yeniden tanımlamayı gerektiriyor: tracing ile ajanın yolunu görmek, OpenTelemetry GenAI semantic conventions ile bu veriyi sağlayıcıdan bağımsız kaydetmek, eval ile de kaliteyi sayıya dökmek. Ekim 2026 itibarıyla tablo şöyle: LangChain'in Haziran 2026 anketinde ekiplerin yüzde 89'u ajanları için bir tür observability kullanıyor, ama çevrimdışı eval yapanlar yüzde 52 civarında; GenAI konvansiyonları ayrı bir repoya taşındı ve hâlâ Development statüsünde. Ajanlar üretime girdikçe 'neden bu cevabı verdi' ve 'bu iş bize kaça mal oldu' soruları ürün sorusu haline geliyor.
Çıkarımlar
- Ajan hatası genelde exception değil, HTTP 200 ile dönen yanlış karardır; onu ancak iç içe bir trace'te görürsünüz.
- invoke_agent, chat ve execute_tool span'lerini standart adlarla kaydedin; OTel GenAI konvansiyonları Haziran 2026'da ayrı repoya taşındı ve hâlâ Development statüsünde, sürüm sabitleyin.
- Prompt içeriğini üretimde varsayılan kapalı tutun, örnekleme ve maskelemeyle açın.
- İstek başına araç ve model çağrısı sayısını p50/p95 olarak izleyin; ani artış genelde bir döngünün işaretidir.
- Kötü giden her üretim trace'i eval setine yeni bir vaka olarak girmeli; yalnızca son cevabı değil, ajanın yolunu da puanlayın.
- 2026'da ekiplerin çoğu tracing'i kurdu ama eval'de geride; trace'i olan ama eval seti olmayan ekip, ajanın ne yaptığını görür ama iyi yapıp yapmadığını bilmez.
Alt başlıklar
Ajan debug'ı neden klasik debug'a benzemiyor
Bir REST endpoint'inde hata genelde tekrarlanabilir: aynı istek, aynı 500 hatası. Ajanlarda üç fark var. Birincisi non-determinizm: aynı prompt farklı araç sırası üretebilir. İkincisi hatanın biçimi: ajan çoğu zaman çökmez, yanlış bir araç seçer, eksik parametre gönderir ya da araçtan dönen hatayı görmezden gelip uydurma bir sonuçla devam eder. Üçüncüsü uzunluk: tek bir kullanıcı isteği 20-30 model ve araç çağrısına yayılabilir.
Tipik senaryo: kullanıcı 'geçen ayki faturamı gönder' diyor, ajan doğru müşteriyi bulamayınca en yakın isimli müşterinin faturasını gönderiyor. Log'larda hata yok, HTTP 200'ler var. Bu hatayı görmenin tek yolu, ajanın hangi aramayı yaptığını, aramanın ne döndürdüğünü ve modelin bu sonuçtan hangi kararı çıkardığını sıralı ve iç içe görebilmek. Aynı isteği yeniden göndermek farklı bir yol üretebileceği için ilk çalışmanın kaydı çoğu zaman tek kanıttır.
Ekim 2026 itibarıyla durum
Son on iki ayda ajan gözlemlenebilirliği deneysel bir ekten temel bir gereksinime dönüştü. LangChain'in Haziran 2026'da yayımladığı State of Agent Engineering anketine (1.340 katılımcı) göre ekiplerin yüzde 57,3'ünün üretimde ajanı var; yüzde 89'u bir tür observability kullanıyor, yüzde 62'si tek tek adımları ve tool call'ları gösteren ayrıntılı tracing'e sahip. Eval tarafı geride: çevrimdışı eval yapanlar yüzde 52,4, çevrimiçi eval yapanlar yüzde 37,3. En büyük engel yüzde 32 ile kalite.
Standart tarafında OpenTelemetry, 12 Haziran 2026'daki v1.42.0 ile tüm `gen_ai.*` içeriğini çekirdek semantic conventions reposundan çıkarıp ayrı `semantic-conventions-genai` reposuna taşıdı. Yeni repoda henüz etiketli sürüm yok ve GenAI alanlarının hiçbiri Stable değil. Nisan 2026'daki v1.41.0 `invoke_agent` span'ini client ve internal olarak ikiye ayırdı. MCP'nin 28 Temmuz 2026 spesifikasyonu da trace bağlamını (`traceparent`, `tracestate`) istek meta verisinde taşıma kuralını belgeledi ve Logging özelliğini OpenTelemetry lehine deprecated ilan etti. Anthropic'in Ocak 2026 tarihli eval rehberi, gerçek hatalardan türetilmiş 20-50 görevle başlamayı öneriyor.
Trace anatomisi: invoke_agent, chat, execute_tool
Ajan gözlemlenebilirliğinin temel birimi trace (iz) ve onun içindeki span'ler (zaman aralıkları). Tipik bir ajan trace'i şöyle iç içe geçer: en dışta ajan çağrısını temsil eden bir span, altında her model çağrısı için bir span, model bir araç çağırmaya karar verdiğinde de o aracın çalışmasını temsil eden ayrı bir span. Araç başka bir servise HTTP isteği atıyorsa, o istek de aynı trace'e bağlı alt span olur.
OpenTelemetry GenAI konvansiyonlarında bu yapı `gen_ai.operation.name` değerleriyle ifade ediliyor: ajan için `invoke_agent`, model çağrısı için `chat`, araç için `execute_tool`. Span adları da buna göre kuruluyor; ör. `execute_tool search_invoices`. Bu yapı kurulduğunda fatura örneğindeki hata görünür hale gelir: `search_customers` span'i iki sonuç döndürmüş, sonraki `chat` span'i ikinciyi seçmiş. Debug, 'model neden ikinciyi seçti?' sorusuna daralır.
OpenTelemetry GenAI semantic conventions: ne var, ne kadar olgun
OpenTelemetry'nin GenAI semantic conventions'ı (anlamsal konvansiyonlar), model ve ajan telemetrisini hangi attribute adlarıyla kaydedeceğimizi standartlaştırıyor. Öne çıkan alanlar: `gen_ai.provider.name`, `gen_ai.request.model`, `gen_ai.usage.input_tokens` ve `gen_ai.usage.output_tokens`, `gen_ai.conversation.id`, ajan için `gen_ai.agent.name`, araç için `gen_ai.tool.name` ve `gen_ai.tool.call.id`. Metrik tarafında `gen_ai.client.token.usage` ve `gen_ai.client.operation.duration` gibi histogramlar tanımlı.
Olgunluk konusunda dürüst olmak gerekiyor: konvansiyonlar hâlâ 'Development' statüsünde, yani attribute adları sürümler arasında değişebilir. Haziran 2026'da (v1.42.0) GenAI ve MCP konvansiyonları ayrı bir `semantic-conventions-genai` reposuna taşındı; yeni repoda henüz etiketli sürüm ve kesinleşmiş bir schema URL yok. Nisan 2026'daki v1.41.0'da `invoke_agent` span'i client ve internal olarak ikiye ayrıldı; bu da adların hâlâ oynadığını gösteriyor. Pratik sonuç: enstrümantasyon kütüphanesini sabitleyin, dashboard sorgularını attribute adlarına doğrudan gömmek yerine bir görünüm katmanından geçirin ve yükseltmeleri changelog okuyarak yapın.
Bir başka güncel bağlantı noktası MCP (Model Context Protocol). MCP spesifikasyonunun 28 Temmuz 2026'da yayımlanan revizyonu, trace bağlamının (`traceparent`, `tracestate`) istek meta verisinde nasıl taşınacağını belgeliyor. Bu sayede ajanınızın çağırdığı bir MCP sunucusundaki işlem de aynı trace'in parçası olarak görünebilir; ajan ile araç sunucusu arasındaki kör nokta kapanır.
Prompt ve yanıt içeriğini kaydetmek: değerli ama riskli
Bir ajanı debug ederken en çok işe yarayan veri, modele giden mesajlar ve modelden dönen yanıt. Ama bu veri kişisel bilgi, müşteri verisi ve gizli iş bilgisi içerir. GenAI konvansiyonları bu yüzden içeriği varsayılan olarak span attribute'u yapmıyor; `gen_ai.input.messages` ve `gen_ai.output.messages` gibi alanlar ayrı bir event üzerinden ve açıkça etkinleştirilerek (opt-in) yakalanıyor. Kütüphanelerin çoğu bunu bir ortam değişkeniyle açıp kapatıyor; değer adları kütüphaneye göre değişiyor.
Makul bir politika: geliştirme ve staging'de içerik tam açık; üretimde içerik kapalı, yalnızca token sayıları, araç adları, hata tipleri ve süreler açık; şikâyet veya incelemeye düşen konuşmalarda örnekleme ile içerik kaydı, maskeleme filtresinden geçerek. Anti-pattern: tüm prompt'ları 90 gün boyunca maskesiz bir gözlem aracına göndermek ve KVKK incelemesinde bunu ilk kez fark etmek.
Maliyet ve gecikme: ajanın birim ekonomisi
Ajan gözlemlenebilirliği yalnızca hata ayıklama değil, aynı zamanda finans. Her `chat` span'inde input ve output token sayısı varsa, trace bazında maliyet hesaplanabilir; trace'leri kullanıcıya, müşteriye veya özelliğe göre gruplayınca 'hangi özellik bize ayda ne kadara mal oluyor' sorusu cevaplanır.
İzlenmesi gereken birkaç gösterge: istek başına model çağrısı sayısı (p50 ve p95), istek başına araç çağrısı sayısı, ilk token'a kadar geçen süre ve toplam süre. Eşik örneği: p50'de 4 araç çağrısı yapan bir ajan bir sürümden sonra p95'te 18'e çıkıyorsa, büyük ihtimalle bir döngüye giriyor ya da bir aracın hata mesajını anlamıyor. Bu tür bir sapmayı alarma bağlamak, faturada sürpriz görmekten iyidir. Ayrıca araç başına maksimum çağrı sayısı ve istek başına token bütçesi gibi sert limitleri kodda tutun; gözlem limiti uygulamaz, yalnızca ihlali gösterir.
Eval: trace'ten kalite ölçümüne
Trace size ajanın ne yaptığını gösterir; iyi yapıp yapmadığını eval (değerlendirme) söyler. İki katman var. Çevrimdışı eval: sabit bir veri setinde (Anthropic'in Ocak 2026 rehberi gerçek hatalardan türetilmiş 20-50 görevle başlamayı öneriyor) her prompt veya model değişikliğinden önce ajanı çalıştırıp skorlamak. Çevrimiçi eval: üretim trace'lerinden örneklem alıp otomatik değerlendiricilerle (kural tabanlı kontroller veya LLM-as-judge) puanlamak.
Ajanlar için yalnızca son cevabı puanlamak yetmez; yol da puanlanmalı. Doğru aracı seçti mi, gereksiz çağrı yaptı mı, araç hatasını fark etti mi? Fatura örneğinde iyi bir eval vakası şöyledir: 'iki benzer isimli müşteri varsa ajan kullanıcıya hangisi olduğunu sormalı'. Pratik döngü: üretimde kötü giden trace'i bul, onu eval setine vaka olarak ekle, düzeltmeyi yap, setin tamamında regresyon olmadığını gör. Langfuse, Arize Phoenix gibi araçlar bu döngüyü trace verisiyle birleştiriyor. Konvansiyonlardaki `gen_ai.evaluation.result` event'i (v1.38.0, Ekim 2025) eval skorunu ilgili span'e bağlamayı da standartlaştırıyor.
Son gelişmeler
Ekim 2026 itibarıyla
Önce kendi cevabını düşün, sonra aç.
Zaten LangSmith/Langfuse gibi bir araç kullanıyoruz, OpenTelemetry'ye neden ihtiyacımız olsun?
Bu araçlar iyi bir arayüz sunuyor, ama veriyi standart bir formatta üretirseniz aracı değiştirmek veya ajan trace'lerini mevcut APM'inizdeki HTTP ve veritabanı span'leriyle aynı trace'te görmek mümkün olur. Birçok gözlem aracı zaten OTLP kabul ediyor; standart format sizi tek bir sağlayıcıya bağlamaz.
Konvansiyonlar hâlâ deneysel ise şimdi benimsemek erken değil mi?
Attribute adları değişebilir, bu doğru; Haziran 2026'da konvansiyonlar ayrı repoya taşındı ve orada henüz etiketli sürüm yok. Ama trace yapısı (ajan, model, araç span'lerinin iç içe olması) oturmuş durumda ve hiç trace olmamasının maliyeti çok daha yüksek. Kütüphane sürümünü sabitleyip dashboard sorgularını bir soyutlama katmanından geçirmek, gerekirse Collector'da bir transform ile eski adları yenilerine eşlemek, olası yeniden adlandırmaların etkisini küçük tutar.
LLM-as-judge'a güvenebilir miyiz?
Tek başına değil. Önce kural tabanlı kontrollerle (doğru araç çağrıldı mı, JSON şeması geçerli mi) başlayın, LLM yargıcını öznel ölçütler için kullanın ve ayda bir küçük bir örneklemi insanla etiketleyip yargıcın insanla ne kadar uyuştuğunu ölçün. Uyuşma düşükse ölçüt tanımını netleştirin.
Prompt'ları kaydetmeden gerçekten debug yapılabilir mi?
Büyük kısmı yapılabilir: araç adları, araç parametrelerinin şekli, hata tipleri, token sayıları ve sıralama çoğu sorunu gösterir. İçerik gerektiğinde, kullanıcı onayı veya şikâyet kaydına bağlı örnekleme ve maskeleme ile açılır. Her şeyi kaydetmek debug'ı kolaylaştırır ama hukuki riski de büyütür.
MCP sunucularındaki işlemler ajan trace'inde görünür mü?
Görünebilir. 28 Temmuz 2026 MCP spesifikasyonu trace bağlamını istek meta verisinde taşıma kuralını belgeledi ve sunucu tarafı Logging özelliğini OpenTelemetry lehine deprecated ilan etti. Hem istemcinizin hem sunucunuzun bu alanları taşıması ve OpenTelemetry ile enstrümante edilmesi gerekiyor; aksi halde MCP çağrısı trace'te kopuk bir kutu olarak kalır.
Notun kaynakları
- OpenTelemetry GenAI Semantic Conventions Explained (Dash0)
- OpenTelemetry Semantic Conventions for Generative AI
- MCP Specification Changelog (OpenTelemetry trace context propagation)
- State of Agent Engineering (LangChain, Haziran 2026)
- OpenTelemetry Semantic Conventions v1.42.0 sürüm notu (GenAI içeriğinin taşınması)
- The state of the OpenTelemetry GenAI semantic conventions (John Hodge, Temmuz 2026)
- The 2026-07-28 Specification (MCP Blog)
Sunum stili
12 slayt. Tıklarsan sunum o slayttan başlar.
Slayt notları
Klasik debug'ı herkes biliyor: log, stack trace, isteği tekrar at. Agent'larda bu düzen çalışmıyor; çünkü Agent çoğu zaman çökmez.
Hata exception değil, kendinden emin bir yanlış karar. Dashboard'unuz bunu göremez.
Her adım teknik olarak başarılı. Hatayı görmenin tek yolu, hangi Tool Call'ın ne döndürdüğünü ve modelin bundan hangi kararı çıkardığını sırayla görmek.
Non-determinizm yüzünden aynı isteği yeniden göndermek farklı bir yol üretebilir. İlk çalışmanın Trace'i çoğu zaman elinizdeki tek kanıt.
Bu yapı kurulunca fatura hatası görünür olur: search_customers iki sonuç döndürmüş, sonraki chat Span'i ikinciyi seçmiş. Debug 'model neden ikinciyi seçti?' sorusuna daralır.
Standart adlar sizi tek bir gözlem aracına bağlamaz; OTLP kabul eden her araca ve mevcut APM'deki HTTP Span'lerine bağlanır.
Beklemek için sebep değil. Kütüphane sürümünü sabitleyin, dashboard sorgularını ham attribute adlarına gömmeyin, yükseltmeyi changelog okuyarak yapın.
Konvansiyonlar da içeriği varsayılan olarak Span attribute'u yapmıyor; opt-in. Anti-pattern: tüm prompt'ları 90 gün maskesiz göndermek ve bunu KVKK incelemesinde fark etmek.
LangChain State of Agent Engineering, Haziran 2026, 1.340 katılımcı. Ekiplerin çoğu Agent'ın ne yaptığını görüyor; iyi yapıp yapmadığını ölçen ekip yarı yarıya. Medyanı 4 Tool Call olan bir Agent bir deploy sonrası p95'te 18'e çıkıyorsa büyük ihtimalle döngüde. Bunu alarma bağlamak faturadaki sürprizden ucuz.
Fatura örneğinden çıkan vaka: iki benzer müşteri varsa Agent kullanıcıya sormalı. Kural tabanlı kontrollerle başla, LLM-as-judge'ı öznel ölçütlere sakla.
Agent eval'i çıktı değil, yol puanlar. Doğru cevaba yanlış yoldan varan Agent bir sonraki istekte yanlış cevap verir.
Soru olarak bırak: Agent'ın yanlış kararını bugün kim fark ediyor, kullanıcı mı, dashboard mı?