LLM'lerin doğal dil üretme yeteneği, yapılandırılmış veri çıktısı verme konusunda sınırlı olabilir. JSON şeması kullanmak, ham metin çıktısını otomatik işlemeye uygun hale getirir ve parse hatalarını azaltır. Peki hangi yöntemi ne zaman kullanmalısınız?
JSON Şeması Nedir ve Neden Kullanılır?
JSON şeması, bir JSON belgesinin beklenen yapısını tanımlayan bir standarttır. LLM bağlamında, modelin ürettiği çıktının belirli alanlar, türler ve kısıtlar içermesini sağlar. Bu sayede çıktıyı doğrudan veri tabanına kaydedebilir, API yanıtı olarak kullanabilir veya başka bir araca aktarabilirsiniz.
Özellikle AI araçları geliştirirken, LLM’in serbest metin yerine belirli bir formatta cevap vermesini istersiniz. Örneğin, bir müşteri destek botu kullanıcı sorgusundan "adi", "kategori", "aciliyet" gibi alanları çıkarmalıdır.
LLM’lerden JSON Çıktısı Almanın Yolları
1. Prompt Tabanlı JSON Üretimi
En basit yöntem, prompt içinde JSON yapısını tarif etmektir. "Lütfen cevabını şu formatta ver: {\"adi\": \"...\", \"miktar\": ...}" gibi bir talimat. Ancak bu yöntem güvenilir değildir; model bazen akış bozabilir, ekstra metin ekler veya JSON’ı hatalı üretebilir. Bu yöntem yalnızca prototipleme için önerilir.
2. Function Calling (Fonksiyon Çağrısı)
OpenAI, Anthropic ve diğer sağlayıcılar, modelin önceden tanımlanmış fonksiyonları çağırmasını sağlayan bir özellik sunar. API’ye fonksiyon şemasını JSON Schema formatında tanımlar, model de bu şemaya uygun bir JSON çıktısı üretir. Bu, en güvenilir yaklaşımdır çünkü model doğrudan şemayı referans alır.
3. Kısıtlı Kodlama (Constrained Decoding)
Çıktı oluşturma aşamasında, modelin sadece JSON şemasına uygun tokenları seçmesini zorlayan tekniklerdir. Outlines, lm-format-enforcer, Jsonformer gibi kütüphaneler bu işi yapar. Özellikle açık kaynak modellerle çalışırken kullanışlıdır.
Adım Adım JSON Şeması ile Çalışma
Bir ürün bilgisi çıkarma sistemi düşünelim. İhtiyacımız olan alanlar: ürün adı (string), fiyat (number), kategori (enum), stok durumu (boolean). Aşağıdaki şemayı kullanabiliriz:
{
"type": "object",
"properties": {
"urun_adi": {"type": "string"},
"fiyat": {"type": "number"},
"kategori": {"type": "string", "enum": ["elektronik", "giyim", "kitap"]},
"stok_var": {"type": "boolean"}
},
"required": ["urun_adi", "fiyat"]
}Bu şemayı fonksiyon çağrısı API’sinde tanımlarız. Modelden "Ürün bilgilerini JSON olarak döndür" promptu ile birlikte fonksiyonu çağırmasını isteriz. Dönen JSON’ı doğrudan işleyebiliriz.
Doğrulama Adımı
Her zaman çıktıyı bir JSON validator ile kontrol edin. Python’da jsonschema kütüphanesi kullanılabilir. Doğrulama hatası alırsanız, modeli tekrar promptlayabilir veya hata mesajını prompta ekleyerek düzeltme isteyebilirsiniz.
En İyi Uygulamalar ve Sık Yapılan Hatalar
- Şemayı basit tutun: İç içe geçmiş çok derin yapılar hata olasılığını artırır. Mümkünse düz bir yapı kullanın.
- Gerekli alanları net belirleyin: Zorunlu alanları "required" listesine ekleyin.
- Enum kullanımına dikkat edin: Model bazen enum dışı bir değer üretebilir. Bir fallback veya doğrulama sonrası dönüşüm planlayın.
- Dökümantasyon ekleyin: Şema içinde "description" alanı kullanarak modelin ne beklediğini açıklayın.
JSON şeması kullanımı, LLM çıktılarındaki belirsizliği ve parse hatalarını büyük ölçüde azaltır. Ancak hiçbir yöntem %100 başarı garantisi vermez; bu nedenle doğrulama ve hata yönetimi stratejileri mutlaka kurulmalıdır.
Yöntem Karşılaştırması
| Yöntem | Güvenilirlik | Uygulama Zorluğu | En Uygun Senaryo |
|---|---|---|---|
| Prompt Tabanlı | Düşük | Düşük | Prototipler, hızlı testler |
| Function Calling | Yüksek | Orta | API tabanlı büyük modeller |
| Kısıtlı Kodlama | Yüksek | Yüksek | Açık kaynak modeller, özel dağıtım |
Seçiminizi projenizin ihtiyaçlarına göre yapın. Örneğin, Temperature vs Top-p ayarları da çıktının rastgeleliğini etkilediği için JSON üretiminde düşük sıcaklık (0.1-0.3) tercih edilir.
Eğer daha karmaşık bir sistem kuruyorsanız, RAG ve ince ayarlama yöntemlerini de değerlendirebilirsiniz. JSON çıktısı, RAG sistemlerinde de belge alanlarını yapılandırmak için kullanılır.
Chain-of-Thought prompting ile JSON şemasını birleştirerek modelin adım adım düşünmesini ve ardından yapılandırılmış çıktı vermesini sağlayabilirsiniz.
Sonuç
JSON şeması, LLM çıktılarını güvenilir ve işlenebilir hale getiren olmazsa olmaz bir araçtır. Doğru yöntemi seçmek, projenizin kararlılığını doğrudan etkiler. Fonksiyon çağrısı ve kısıtlı kodlama, üretim ortamları için önerilirken, prompt tabanlı yaklaşım sadece basit testlerde kullanılmalıdır. Her zaman doğrulama adımını unutmayın.
Sık Sorulan Sorular
JSON şeması kullanmadan LLM'den yapılandırılmış çıktı alabilir miyim?
Evet, prompt içinde format tarif ederek alabilirsiniz ancak bu yöntem güvenilir değildir. Model sık sık hatalı JSON üretir veya ekstra metin ekler. Funktsiyon çağrısı veya kısıtlı kodlama gibi yöntemler çok daha güvenilirdir.
Function calling ile JSON şeması arasında ne fark var?
Function calling, API'nin modelden belirli bir JSON şemasına uygun çıktı talep etmesini sağlar. JSON şeması ise çıktının yapısını tanımlamak için kullanılan bir standarttır. Function calling genellikle şemayı kullanarak çalışır.
Kısıtlı kodlama (constrained decoding) nedir?
Kısıtlı kodlama, modelin çıktı oluşturma aşamasında sadece belirli tokenları seçmesini zorlayan bir tekniktir. JSON şemasına uygun tokenların üretilmesini sağlayarak geçersiz JSON olasılığını sıfıra indirir.
Hangi durumda prompt tabanlı JSON üretimi yeterlidir?
Prompt tabanlı yöntem, sadece prototip veya kişisel kullanım için düşük riskli durumlarda yeterli olabilir. Üretim ortamlarında hata kabul edilemezse kesinlikle function calling veya constrained decoding kullanılmalıdır.
JSON şeması doğrulaması neden önemlidir?
Doğrulama, modelin ürettiği JSON'ın şemaya uygun olduğunu garanti eder. Aksi halde beklenmeyen alanlar, eksik veriler veya yanlış türler nedeniyle uygulama hataları oluşabilir. Her zaman bir validator kullanılmalıdır.






