7 dk okuma
LLM Structured Outputs, yapay zeka modellerinden yalnızca geçerli JSON değil, önceden tanımlanmış bir JSON Schema’ya uyan öngörülebilir çıktı almak için kullanılan yaklaşımdır. Bir LLM’i sipariş işleme, veri çıkarımı, ajan akışları veya kurumsal entegrasyonlarda kullandığınızda “JSON döndür” demek çoğu zaman yeterli değildir. Alan adının değişmesi, beklenmeyen bir property gelmesi, enum dışı değer üretilmesi veya zorunlu alanın atlanması uygulama tarafında kırılmaya neden olabilir. Structured Outputs bu sözleşmeyi model üretim aşamasına taşıyarak entegrasyon katmanını daha güvenilir hale getirir.
Bu rehberde Structured Outputs ile JSON mode arasındaki farkı, şema tasarımını, strict yaklaşımını, refusal ve eksik yanıt durumlarını, uygulama tarafı doğrulamayı ve üretim gözlemlenebilirliğini yedi pratik adımda ele alıyoruz. Hedef, modeli “hatasız” kabul etmek değil; model çıktısını normal bir dış servis cevabı gibi sözleşmeli, doğrulanabilir ve izlenebilir hale getirmektir.
İçindekiler
- LLM Structured Outputs nedir?
- JSON mode ile farkı
- JSON Schema’yı dar ve açık tasarlama
- strict mod ve desteklenen şema alt kümesi
- Refusal ve eksik çıktı senaryoları
- Uygulama tarafında ikinci doğrulama
- Retry, gözlemlenebilirlik ve versiyonlama
- Sonuç ve üretim kontrol listesi
LLM Structured Outputs Nedir?
Structured Outputs, modelin serbest metin üretmesi yerine geliştiricinin belirlediği veri şemasına göre çıktı oluşturmasını sağlar. OpenAI tarafında desteklenen model ve yapılandırmalarda function calling içinde strict: true kullanılması, fonksiyon argümanlarının sağlanan şemaya uymasını hedefler. Response format tarafında da JSON Schema tabanlı structured output yaklaşımı kullanılabilir. Burada önemli ayrım, çıktının yalnızca parse edilebilir JSON olması değil, alanların ve türlerin önceden tanımlanmış sözleşmeye uymasıdır.
1. JSON Mode ile Structured Outputs Arasındaki Farkı Netleştirin
JSON mode, model çıktısının geçerli JSON olarak parse edilebilmesini sağlamaya odaklanır; fakat belirli bir schema’ya uyacağını garanti etmez. Örneğin uygulamanız {“orderId”: string, “status”: enum} beklerken model geçerli fakat farklı alan adları içeren bir JSON üretebilir. Structured Outputs ise şema takip problemini doğrudan hedefler. Bu nedenle dış sistemlere veri yazan, otomasyon tetikleyen veya kullanıcıya gösterilecek yapılandırılmış veri üreten iş akışlarında yalnızca JSON mode’a güvenmek yerine sözleşme tabanlı yaklaşım tercih edilmelidir.
2. JSON Schema’yı Gerektiği Kadar Dar Tasarlayın
Şema tasarımında ilk hata, modele gereğinden fazla serbestlik vermektir. String alanların gerçekten serbest metin olup olmadığını düşünün; durum alanları için enum, sayısal alanlar için doğru tip, zorunlu alanlar için required kullanın. Beklenmeyen alanları reddetmek istediğiniz objelerde additionalProperties: false yaklaşımı sözleşmeyi sıkılaştırır. Ancak JSON Schema’nın birleştirme yapılarıyla birlikte additionalProperties davranışına dikkat edilmelidir; JSON Schema dokümantasyonu, bu anahtarın yalnızca aynı subschema içinde tanımlanan property’leri değerlendirdiği durumları özellikle açıklar.
3. Şema Sürümünü API Sözleşmesi Gibi Yönetin
LLM şeması uygulamanın public DTO’su kadar önemlidir. Bir alanı yeniden adlandırmak veya enum’a yeni değer eklemek, downstream tüketicileri etkileyebilir. Bu nedenle schema_v1, schema_v2 gibi kontrollü sürümleme veya şema kimliği kullanmak faydalıdır. Şema değişikliklerini code review ve test sürecine dahil edin. Model prompt’undaki talimat ile şema arasında çelişki bulunmamalıdır; aksi halde model semantik olarak doğru cevabı şemaya sığdırmak için beklenmedik değerler üretebilir.
4. strict Modu Kullanırken Desteklenen Alt Kümeyi Kontrol Edin
Structured Outputs, JSON Schema’nın tüm özelliklerini sınırsız biçimde destekleyen genel amaçlı bir validator değildir. OpenAI dokümantasyonu, desteklenen JSON Schema alt kümesine ve strict mod gereksinimlerine uyulmasını ister; uyumsuz şemalar istek aşamasında hata verebilir. Bu nedenle çok karmaşık schema composition kalıpları yerine sade object/array yapıları, açık required listeleri ve sınırlı enum’lar çoğu üretim senaryosunda daha yönetilebilirdir. Yeni bir şemayla ilk isteğin ek ön işleme gecikmesine sahip olabileceği de göz önünde bulundurulmalıdır.

5. Refusal ve Eksik Yanıtı Normal Başarıdan Ayırın
Bir model güvenlik nedeniyle isteği reddedebilir veya çıktı maksimum token sınırı gibi bir nedenle tamamlanmadan kesilebilir. Böyle bir durumda uygulamanın ‘schema valid ise başarıdır’ mantığı yeterli değildir. Refusal bilgisini, incomplete/finish durumunu ve API hata kodlarını ayrı kontrol edin. Özellikle otomatik aksiyon alan sistemlerde boş veya kısmi bir cevabın varsayılan değerlerle işleme alınması ciddi iş hatalarına yol açabilir. Başarı kriterini: istek tamamlandı + refusal yok + şema geçerli + iş kuralı geçerli şeklinde katmanlandırın.
6. Şema Doğruluğunu İş Kuralı Doğruluğu ile Karıştırmayın
Structured Outputs yapısal güvenilirliği artırır; fakat değerin gerçeğe uygun veya iş açısından doğru olduğunu garanti etmez. orderTotal alanının number olması, tutarın doğru hesaplandığı anlamına gelmez. Bu nedenle uygulama tarafında ikinci doğrulama zorunludur. Tarih aralığı, para birimi, kullanıcı yetkisi, veritabanında varlık kontrolü ve tutar toplamı gibi deterministik kontroller normal backend kodunda yapılmalıdır. LLM’i iş kuralı motoru değil, yapılandırılmış öneri/çıkarım üreticisi olarak konumlandırmak daha güvenli bir mimaridir.
7. Retry ve Gözlemlenebilirliği Şema Bazında İzleyin
Üretimde yalnızca genel hata oranını izlemek yetersizdir. Hangi schema sürümünde kaç parse/validation hatası oluştuğunu, refusal oranını, ilk istek ve retry latency’sini, token kullanımını ve iş kuralı reddi oranını ölçün. Retry yalnızca geçici hata veya eksik üretim gibi düzeltilebilir durumlar için uygulanmalıdır. Aynı prompt ve aynı bozuk veriyle sınırsız retry yapmak maliyeti artırır. Gerekirse ikinci denemede daha basit bir şema veya fallback iş akışı kullanın; kritik işlemlerde insan onayı seçeneğini koruyun.
Üretim Kontrol Listesi
- JSON mode ile Structured Outputs farkını doğru seçtim.
- Şemada required, enum ve ek property politikası açık.
- Schema değişiklikleri versiyonlanıyor ve test ediliyor.
- Refusal ve eksik çıktı ayrı hata yollarına sahip.
- Uygulama iş kuralları modelden bağımsız doğrulanıyor.
- Retry sayısı ve koşulları sınırlı.
- Schema sürümü, latency, refusal ve validation metrikleri izleniyor.
Sonuç
LLM Structured Outputs, LLM entegrasyonlarında en önemli güvenilirlik problemlerinden birini çözer: serbest metni makinenin güvenle tüketebileceği bir veri sözleşmesine dönüştürmek. Fakat üretim kalitesi yalnızca strict şema ile bitmez. Şemayı dar tasarlamak, sürümlemek, refusal ve incomplete durumlarını ayırmak, iş kurallarını deterministik kodla doğrulamak ve gözlemlenebilirliği schema bazında kurmak gerekir. Böylece model çıktısı uygulamanın rastgele yorumladığı bir metin olmaktan çıkar; test edilebilir ve yönetilebilir bir entegrasyon kontratına dönüşür.
Güvenilir Araştırma Kaynakları
OpenAI Help Center – Function Calling ve Structured Outputs
