İçeriğe geç

Modelin Cevabını Uygulamada Kullanmak — Doğrulamadan Kaydetme

Orta 9 dk Sık karşılaşılır

Önce şunu oku: Dil Modeli Nasıl Cevap Üretir — Neden Var Olmayan Bir Metot Uydurur?

30 saniyede özet

Uygulaman bir dil modelinden JSON istediğinde, cevap çoğu zaman düzgün gelir ama her zaman değil. Cevabı dışarıdan gelen bir girdi gibi ayrıştır, izinli listeyle doğrula, bir kez hatayla tekrar sor; anlamı ise örneklerle ölç.

Hızlı ve hevesli yeni bir çalışma arkadaşın formları dolduruyor ve çoğu kusursuz. Ama arada bir, formda olmayan bir kutuyu işaretliyor ya da formun üstüne bir selam notu düşüyor.

  1. Bayt: Harcamaları modele sınıflandırttık: her biri için JSON dönüyor. Gece toplu işi başladı!

  2. Sen: Sabah baktım, iş beşinci harcamada durmuş. Bir de 'TRANSPORT' diye bir kategorimiz olmuş.

  3. Bayt: Model cevabın başına 'Tabii! İşte cevap:' yazmış. JSON okuyucu patladı...

  4. Bayt: Kullanıcıdan gelen formu kontrol ediyoruz. Modelden gelen cevap neden farklı olsun?

Cevap bir girdidir

Dil modeli cevabı her seferinde yeniden üretir; istediğin biçime uyması büyük ihtimaldir ama garanti değildir. Bazen JSON’u bir cümleyle sarar, bazen listede olmayan bir değer uydurur.

Bu uydurma bir hallucinationBir dil modelinin var olmayan bir API'yi, parametreyi ya da kaynağı kendinden emin bir dille üretmesi. Çıktı akıcı olduğu için fark etmek zordur.Sözlükte gör → örneğidir. Kodun cevaba körü körüne güvenirse ya hata fırlatıp durur ya da uydurmayı sessizce kaydeder.

Kafam karıştı, daha basit anlat

Modelin cevabı, bir formdan gelen kullanıcı girdisi gibidir: kontrol etmeden kullanılmaz.

Hızlı kontrolBaşlangıç

Uygulama modelden JSON istedi. Cevabın her zaman geçerli JSON olacağına güvenebilir miyiz?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Korumasız bir toplu işte bir cevap JSON.parse'ı patlattı. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Ayrıştır, doğrula, bir kez daha sor

Her cevabı try/catch içinde ayrıştırıyoruz; bozuk olanı atlıyoruz. Model 'EGLENCE' diye listede olmayan bir kategori döndürdü. Ne olur? Cevabı göster

Veritabanına kaydedilir. Ayrıştırma yalnızca biçime bakar: “EGLENCE” geçerli bir JSON değeridir. Değerin izinli listede olduğunu ayrıca kontrol etmek gerekir.

Arşive yalnızca kontrolden geçen girer.
Adım adım oku
  1. Hızlı bir memur formları dolduruyor.
  2. Biri listede olmayan bir kutuyu işaretlemiş.
  3. Kapıdaki kontrol, notla bir kez geri verir.
  4. Arşive yalnızca kontrolden geçen girer.

yapısal çıktıModelden serbest metin yerine belirli alanları olan bir cevap, genelde JSON istemek. Biçimi kolaylaştırır ama doğrulamanın yerini tutmaz.Sözlükte gör → istemek ilk adımdır: modelden belirli alanları olan bir JSON beklersin. Sonra cevabı bir Java tipine çevirirsin; kategori bir enum ise, listede olmayan değer çevirme sırasında reddedilir.

Geçmeyen cevabı hata mesajıyla birlikte modele bir kez daha gönder. İkinci deneme de geçmezse harcama, toplu işi durdurmadan bir insan kontrolü kuyruğuna gider.

Kafam karıştı, daha basit anlat

Önce biçime, sonra değerin izinli listede olduğuna bak. Geçmezse bir kez düzelttir, yine olmazsa insana bırak.

Hızlı kontrolOrta

Cevabı try/catch ile ayrıştırıyoruz. Model listede olmayan 'EGLENCE' kategorisini döndürdü. Ne olur?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Java'da kategori alanı bir enum ise, Jackson listede olmayan bir değerle ne yapar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Kendin gör

Model harcamaları sınıflandırıyor

Tohum 65826
  • Migros 245,90 TL
  • İSKİ su faturası
  • Ekim kirası
  • İstanbulkart dolum
  • Shell akaryakıt
  • Netflix abonelik
  • Enerjisa elektrik
  • A101 alışveriş
  • Kira sertifikası fonu

✓ 0 doğru · ✕ 0 hatalı kayıt · 👤 0 kontrolde

Hız
Adım 0

Şu an ne oldu?

Cevaba güven (koruma yok)

9 harcama, beş kategori. Model her biri için JSON döndürüyor.

Görevler0/3

  • Tek bir cevap bütün toplu işi durdursunaçık

    İpucu

    Varsayılan ayar yeter.

  • Listede olmayan hiçbir kategori kaydedilmesinaçık

    İpucu

    Değeri izinli listeyle karşılaştır.

  • İnsan kontrolü kuyruğu boş kalsın, uydurma kategori de olmasınaçık

    İpucu

    Hatayı modele geri gönder.

Olay günlüğü (0)

Henüz olay yok. Oynat veya adımla.

  1. Varsayılanla oynat. “TRANSPORT” kaydedildi, sonra cümleyle sarılmış cevap hata fırlattı ve dört harcama hiç işlenmedi.
  2. “Ayrıştır, bozuk olanı atla” seç. İş durmadı, ama iki uydurma kategori kaydedildi ve bir harcama kayboldu.
  3. “Ayrıştır + listeyle doğrula” seç. Uydurma yok; üç harcama insan kontrolünü bekliyor.
  4. “Doğrula + hatayla bir kez daha sor” seç. Kuyruk boş. Ama “Kira sertifikası fonu” hâlâ KIRA: bu geçerli bir kategori, yalnızca yanlış.
Hızlı kontrolOrta

Doğrulamadan geçemeyen bir cevap için en makul ilk adım nedir?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

İkinci deneme de doğrulamadan geçemedi. Ne yapılmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Tuzaklar

Doğrulamayı doğruluk sanmak. Geçerli ama yanlış cevabı hiçbir şema yakalamaz. Doğru etiketlenmiş örneklerden bir değerlendirme setiDoğru cevabı bilinen örneklerden oluşan bir set. İstem ya da model her değiştiğinde modeli bu setten geçirip ne kadar doğru cevap verdiğini ölçersin.Sözlükte gör → tut ve istem ya da model her değiştiğinde ölç.

Sonsuz tekrar. “Doğru cevap gelene kadar sor” döngüsü hem para yakar hem de takılı kalabilir. Bir deneme yeter, sonrası insana.

Cevabı doğrudan eyleme çevirmek. Model “bu harcamayı iade et” derse bile, para hareketini kodundaki kurallar ve gerekirse bir insan onaylar.

Kafam karıştı, daha basit anlat

Anlamı örneklerle ölç, tekrarı sınırla, önemli işlemleri modelin cevabına bırakma.

Hızlı kontrolİleri

Model bir müşteri mesajını okuyup 'bu harcamayı iade et' dedi. Kod ne yapmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Harcama sınıflandırma: modelin cevabını doğrulamak 4 dosya · ~84 satır · ilk okumada atlayabilirsin
Proje dosyaları

src/main/java/com/bank/insights/ Category.java Tipler: kategori bir enum; listede olmayan değer JSON çevirme sırasında reddedilir.

src/main/java/com/bank/insights/Category.java
enum Category { MARKET, FATURA, KIRA, ULASIM, DIGER }
// Jackson rejects a value outside the enum ("TRANSPORT") with InvalidFormatException.
record CategoryReply(Category category) {
CategoryReply {
if (category == null) throw new IllegalArgumentException("category is missing");
}
}

src/main/java/com/bank/insights/ CategoryModel.java Model: Spring AI ChatClient arkasında küçük bir arayüz; testte sahte cevaplarla değiştirilir.

src/main/java/com/bank/insights/CategoryModel.java
interface CategoryModel {
String ask(String prompt);
}
@Component
class SpringAiCategoryModel implements CategoryModel {
private final ChatClient chat;
SpringAiCategoryModel(ChatClient.Builder builder) {
this.chat = builder.defaultSystem("""
Classify the card transaction. Answer with JSON only: {"category": "..."}.
Allowed values: MARKET, FATURA, KIRA, ULASIM, DIGER.
""").build();
}
@Override
public String ask(String prompt) {
return chat.prompt().user(prompt).call().content();
}
}

src/main/java/com/bank/insights/ TransactionCategorizer.java Sınıflandırıcı: ayrıştır ve doğrula, geçmezse hata mesajıyla bir kez daha sor, yine geçmezse insan kontrolü kuyruğuna bırak.

src/main/java/com/bank/insights/TransactionCategorizer.java
@Service
class TransactionCategorizer {
private final CategoryModel model;
private final ObjectMapper json;
private final ReviewQueue review;
TransactionCategorizer(CategoryModel model, ObjectMapper json, ReviewQueue review) {
this.model = model;
this.json = json;
this.review = review;
}
Optional<Category> categorize(Transaction tx) {
String prompt = "Transaction: " + tx.description();
try {
return Optional.of(read(model.ask(prompt)));
} catch (JsonProcessingException first) {
String again = prompt + "\nYour previous answer was invalid: " + first.getOriginalMessage();
try {
return Optional.of(read(model.ask(again))); // one retry, never a loop
} catch (JsonProcessingException second) {
review.add(tx.id(), second.getOriginalMessage()); // a person decides; the batch goes on
return Optional.empty();
}
}
}
private Category read(String reply) throws JsonProcessingException {
return json.readValue(reply, CategoryReply.class).category();
}
}

src/test/java/com/bank/insights/ TransactionCategorizerTest.java Test: uydurma kategori ikinci denemede düzeliyor; iki kez bozuk cevap gelince harcama kuyruğa düşüyor, hiçbir şey fırlatılmıyor.

src/test/java/com/bank/insights/TransactionCategorizerTest.java
class TransactionCategorizerTest {
private final ReviewQueue review = new InMemoryReviewQueue();
private TransactionCategorizer withReplies(String... replies) {
Deque<String> script = new ArrayDeque<>(List.of(replies));
return new TransactionCategorizer(prompt -> script.pop(), new ObjectMapper(), review);
}
@Test
void anInventedCategoryIsFixedOnTheSecondTry() {
var categorizer = withReplies("{\"category\":\"TRANSPORT\"}", "{\"category\":\"ULASIM\"}");
assertThat(categorizer.categorize(new Transaction(4, "İstanbulkart dolum"))).contains(Category.ULASIM);
assertThat(review.size()).isZero();
}
@Test
void twoBadRepliesGoToReviewInsteadOfThrowing() {
var categorizer = withReplies("Tabii! {\"category\":\"ULASIM\"}", "{\"category\":\"EGLENCE\"}");
assertThat(categorizer.categorize(new Transaction(5, "Shell akaryakıt"))).isEmpty();
assertThat(review.size()).isEqualTo(1);
}
}

Kendini sına

Şimşek turu1/4

Modelden JSON istediysen cevap her zaman geçerli bir JSON olur.

Soru 1/3İleri

'Kira sertifikası fonu' KIRA olarak sınıflandırıldı. Bu hatayı ne yakalar?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.

Aklında kalacak üç şey

  1. 1 Modelin cevabı dışarıdan gelen bir girdidir. Bir cümleyle sarılmış JSON ya da listede olmayan bir kategori, korumasız kodu ya durdurur ya da veritabanına sessizce girer.
  2. 2 Ayrıştırmak biçimi, izinli listeyle doğrulamak değeri kontrol eder. Geçmeyen cevap hata mesajıyla bir kez daha sorulur, yine geçmezse bir insana gider.
  3. 3 Doğrulama şekli yakalar, anlamı değil. Geçerli ama yanlış cevapları etiketli örneklerden oluşan bir değerlendirme seti ölçer.
Sonraki kapı Asistana '500 TL gönder' dedin. Model 5.000 yazdı ve uygulama gönderdi. Hata kimde? Modele Araç Vermek — Asistan Hesabı ve Tutarı Kendisi Yazınca · 9 dk

4 kart sonraki derste seni bekliyor

0/4 kart bu dersten toplandı

Bu dersin üstüne kurulanlar

Bunlar bu dersi temel alıyor; hazır olduğunda devam edebilirsin.