Structured Outputs
Yapılandırılmış çıktılar, kod çözme sırasında yapay zekâ modelinin yanıtını JSON Schema gibi bir şemayla sınırlar; böylece uygulamalar her yanıtı güvenilir biçimde ayrıştırabilir.
Yapılandırılmış çıktılar, önceden tanımlanmış bir biçime, genellikle gerekli anahtarları, türlerini ve izin verilen değerleri belirten bir JSON şemasına uyması kısıtlanan model yanıtlarıdır; böylece yazılım her yanıtı ek temizlik yapmadan ayrıştırabilir. JSON için nazikçe istekte bulunulan bir büyük dil modeli (LLM) genellikle isteğe uyar, ancak yine de bir açıklama cümlesi ekleyebilir, bir anahtarın yazımını yanlış yapabilir veya nesneyi tamamlamadan durabilir; bunların her biri yanıtı okuyan programı bozar. Yapılandırılmış çıktılar bu riski kısıtlı kod çözümleme ile ortadan kaldırır: üretimin her adımında çıkarım motoru, yalnızca çıktıyı şemaya göre geçerli tutan belirteçlere izin verir. OpenAI bu özelliği API'sine Ağustos 2024'te eklediğinde, yapılandırılmış çıktılarla çalışan gpt-4o-2024-08-06 modelinin karmaşık JSON şemalarına uyma değerlendirmesinde %100 puan aldığını; bu özellik olmadan çalışan GPT-4 (gpt-4-0613) modelinin ise %40'ın altında kaldığını bildirdi.
JSON Modu ve Yapılandırılmış Çıktılar#
Sağlayıcı API'leri iki düzeyde güvence sunar. OpenAI'nin Kasım 2023'te kullanıma sunduğu JSON modu, yalnızca yanıtın sözdizimi bakımından geçerli JSON olacağını garanti eder; dolayısıyla anahtarlar yine eksik olabilir veya yanlış adlandırılabilir. Yapılandırılmış çıktılar ise yanıtın verilen şemayla eşleşmesini garanti eder. OpenAI'nin Structured Outputs API'sinde geliştiriciler şemayı Python'da bir Pydantic modeli veya JavaScript'te bir Zod nesnesi olarak tanımlar; biçimi bozmak yerine ret yanıtı ayrı bir alanda gelir. Anthropic'in Claude yapılandırılmış çıktıları, her şemayı bir dilbilgisine derler; bu işlem şema ilk kullanıldığında gecikme ekler ve derlenmiş dilbilgisi 24 saat önbelleğe alınır. Her iki sağlayıcı da JSON Schema'nın yalnızca bir alt kümesini destekler; örneğin Anthropic'in uygulaması yinelemeli şemaları veya minimum gibi sayısal sınırları desteklemez.
Kısıtlı Çözümleme Nasıl Çalışır#
Her adımda bir LLM, söz varlığındaki her belirteç için bir puan veya logit üretir; kod çözümleme de elde edilen softmax dağılımından seçim yapar. Kısıtlı kod çözümlemede, biçimi bozacak her belirtecin puanı önce eksi sonsuza ayarlanır; böylece bu belirteçler hiçbir zaman seçilemez. Brandon Willard ve Rémi Louf, bunu Büyük Dil Modelleri için Verimli Yönlendirilmiş Üretim makalelerinde verimli biçimde yapmanın yolunu gösterdi: düzenli ifade veya JSON Schema bir sonlu durum makinesine derlenir ve söz varlığı üzerinde önceden oluşturulan bir indeks, her durum için geçerli belirteçleri listeler; böylece her adımda bir arama işlemi yeterli olur. Açık kaynaklı Outlines kitaplığı yöntemi uygular; vLLM gibi sunum motorları da açık modeller için dilbilgisi yönlendirmeli üretim sunar.
Aşağıdaki örnek, bu fikri Hugging Face Transformers'tan GPT-2'ye elle uygular. Şemanın sabit metnini, yani süslü parantezleri, anahtarları ve tırnakları kod yazar; model her değerde yalnızca şemanın izin verdiği belirteçler arasından seçim yapabilir:
import json
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("gpt2")
model = AutoModelForCausalLM.from_pretrained("gpt2")
prompt = "Review: The battery died after two days and support never replied.\nJSON:"
# Kısıtlanmamış açgözlü kod çözümleme: yanıtı şemaya sokan hiçbir şey yok
ids = tokenizer(prompt, return_tensors="pt").input_ids
free = model.generate(ids, max_new_tokens=16, do_sample=False, pad_token_id=tokenizer.eos_token_id)
print("free:", repr(tokenizer.decode(free[0, ids.shape[1] :])))
def choose(text, options):
"""Return the option GPT-2 scores highest after text, with every other token masked out."""
logits = model(tokenizer(text, return_tensors="pt").input_ids).logits[0, -1]
allowed = torch.tensor([tokenizer.encode(option)[0] for option in options])
masked = torch.full_like(logits, float("-inf"))
masked[allowed] = logits[allowed]
return tokenizer.decode(masked.argmax())
# Kısıtlı kod çözümleme: anahtarları şema yazar, model yalnızca izin verilen değerleri seçebilir
with torch.no_grad():
text = prompt + ' {"sentiment": "'
text += choose(text, ["positive", "negative"]) + '", "stars": '
text += choose(text, ["1", "2", "3", "4", "5"]) + "}"
print("constrained:", json.loads(text[len(prompt) :]))free: ' The battery died after two days and support never replied.\n\nJSON: The' ve constrained: {'sentiment': 'positive', 'stars': 1} çıktısını yazdırır. Kendi hâline bırakıldığında GPT-2, JSON yazmak yerine incelemeyi tekrar eder; kısıtlı sürüm ise her zaman ayrıştırılabilir. Ayrıştırılan sonuç, yöntemin sınırını da gösterir: 124 milyon parametreli model, boş pil ve sessiz desteği tek yıldızla olumlu değerlendirdi. Şema biçimi sabitledi; içindeki değerler yine de modelin kendi yargısından geldi.
Kullanım Alanları ve Ödünleşimler#
- Veri çıkarımı: Faturalardan, sözleşmelerden veya e-postalardan adları, tarihleri, toplamları ve kalemleri doğrudan veritabanı satırlarına aktarma.
- İşlev çağırma: Bir araç çağrısı, şeması aracın parametrelerinden oluşan yapılandırılmış bir çıktıdır. OpenAI ve Anthropic API'lerindeki katı araç kullanımı, aynı güvenceyi araç bağımsız değişkenlerine de uygular.
- Ajan tabanlı iş akışları: Yönlendirme kararlarını enum değerleri olarak belirleme ve ara sonuçları istem zincirinin adımları arasında türü belirlenmiş nesneler olarak aktarma.
- Görsel-dil modelleri: Çizim veya değerlendirme kodunun doğrudan kullanabileceği etiket listeleri ve kutu koordinatları olarak döndürülen algılamalar.
Ultralytics Platform'daki sınıf istemli akıllı anotasyon, bu son tür çıktıya bağlıdır. OpenAI, Anthropic ve Google gibi sağlayıcılardan görme modellerine veri kümesinin sınıflarını algılatır ve döndürülen her nesneyi düzenlenebilir bir sınırlayıcı kutu olarak ekler; bu nedenle her yanıt bir sınıf adı vermeli ve kodun ayrıştırabileceği biçimde koordinatlar içermelidir. Bu modeller güven puanı döndürmez; bu yüzden biri seçiliyken Platform güven ve IoU ayarlarını gizler. VLM Leaderboard, bu modellerin gerçek dünya veri kümelerindeki nesneleri algılama doğruluğunu karşılaştırır ve her modelin kutularını listeleme sırasına göre sıralar.
Katı biçimler, muhakeme görevlerinde doğruluğu düşürebilir. Özgürce Konuşmama İzin Ver? başlıklı çalışmalarında Zhi Rui Tam ve çalışma arkadaşları, biçim kısıtlamalarının LLM muhakemesinde önemli bir düşüşe yol açtığını ve daha katı kısıtlamaların daha büyük düşüşlere neden olduğunu buldu. OpenAI API'si anahtarları şemada listelenen sırayla ürettiğinden, yaygın bir çözüm yanıt alanından önce serbest metinli bir muhakeme alanı koymaktır; böylece model kısıtlı yanıtı vermeden önce düşünce zincirini yazar.










