İçeriğe geç

Cevabı Akıtmak — Asistan Yazarken Müşteri Neden Boş Ekrana Bakıyor?

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

Önce şunu oku: Modelin Cevabını Uygulamada Kullanmak — Doğrulamadan Kaydetme

30 saniyede özet

Modelin cevabını tamamını bekleyip göstermek, müşteriyi sonuna kadar boş ekrana baktırır; akıtmak ilk kelimeyi hemen gösterir. Müşteri ayrılınca iptal modele kadar taşınmazsa, okunmayan parçalar yine üretilir.

Bir çay ocağında bir garson bütün demlik hazır olmadan masaya gitmiyor; masa boş bardaklara bakıyor. Öbür garson ilk bardak hazır olur olmaz döküyor. Bir de masa kalktığında demlemeyi bırakmak var.

  1. Bayt: Asistanımız kart limiti sorusuna güzel bir cevap yazıyor. Ama ekranda on saniye hiçbir şey görünmüyor.

  2. Sen: Müşteriler bekleyemeyip sekmeyi kapatıyor. Faturaya bakınca o cevaplar da sonuna kadar yazılmış.

  3. Bayt: Kimse okumadı, ama hepsini ödedik!

  4. Bayt: İlk bardağı hemen dökelim; masa kalkınca da demlemeyi durduralım.

Boş ekran neden uzun hissettirir?

Model cevabı parça parça üretir. Sunucu bütün parçaları toplayıp sonra gönderirse, müşteri cevabın sonuna kadar boş ekrana bakar.

cevabı akıtmakModelin ürettiği cevabı tamamlanmasını beklemeden, parça parça ekrana göndermek. Toplam süreyi değil, boş bekleyişi kısaltır.Sözlükte gör →, her parçayı üretildiği anda ekrana göndermektir. Tarayıcıya akış için çoğu zaman Server-Sent EventsSunucunun açık tuttuğu tek bir HTTP cevabına olay yazdığı, tek yönlü akış. Tarayıcıda EventSource ile açılır ve kopunca kendisi yeniden bağlanır.Sözlükte gör → kullanılır. Toplam süre değişmez, ama ilk kelime hemen görünür.

Kafam karıştı, daha basit anlat

Akıtmak cevabı hızlandırmaz; müşteriyi boş ekrana baktırmaz.

Hızlı kontrolBaşlangıç

Modelin cevabını akıtmak (streaming) neyi değiştirir?

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

Akıtılan cevabın toplam süresi beklenen cevaba göre nasıldır?

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

Masa kalkınca demlemeyi bırak

Cevap akıyor. Müşteri dördüncü parçadan sonra sekmeyi kapattı. Sunucu model çağrısını iptal etmiyor. Model kaç parça daha üretir? Cevabı göster

Cevabın geri kalanının hepsini. Tarayıcı bağlantıyı kapattı, ama sunucu bunu model çağrısına iletmedi. Model on iki parçanın hepsini yazdı ve son sekizini kimse okumadı.

Hazır olanı hemen ver; giden olursa dur.
Adım adım oku
  1. Bütün demlik hazır olunca gelen garson.
  2. İlk bardak hazır olur olmaz dökülür.
  3. Masa kalktı, garson hâlâ dolduruyor.
  4. Hazır olanı hemen ver; giden olursa dur.

istek iptaliKullanıcı vazgeçince bunu tarayıcıdan sunucuya, oradan model çağrısına kadar taşıyıp işi durdurmak.Sözlükte gör → zincir boyunca taşınmalıdır: tarayıcı bağlantıyı kapatır, sunucu bunu fark eder ve model çağrısını durdurur. Bir halka eksikse model yazmaya ve faturalanmaya devam eder.

Akıtmanın bir sınırı da var. Cevabı kod kullanacaksa, örneğin bir JSON, yarım hâli ayrıştırılamaz ve doğrulanamaz. İnsana akıt, koda tamamlanmış cevabı ver.

Kafam karıştı, daha basit anlat

Müşteri gidince modeli de durdur. Kodun kullanacağı cevabı ise sonuna kadar bekle.

Hızlı kontrolOrta

Müşteri cevap yazılırken sayfadan ayrıldı ve sunucu model çağrısını sürdürdü. Sonuç?

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

Model JSON üretiyor ve kodun bu JSON'u kullanacak. Akıtmak burada neden dikkat ister?

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

Kendin gör

Asistan cevap yazıyor

Tohum 281065
… (boş ekran)
  1. ·
  2. ·
  3. ·
  4. ·
  5. ·
  6. ·
  7. ·
  8. ·
  9. ·
  10. ·
  11. ·
  12. ·

Üretilen: 0/12 · ekranda: 0 · ✕ okuyan yokken üretilen: 0

Hız
Adım 0

Şu an ne oldu?

Cevabın tamamını bekle, sonra göster

Model cevabı parça parça üretiyor.

Görevler0/3

  • Müşteri cevabın sonuna kadar boş ekrana baksınaçık

    İpucu

    Tamamını bekle.

  • Müşteri gitsin, model yazmaya devam etsinaçık

    İpucu

    Ayrılsın, iptal etme.

  • Cevap ilk adımda görünsün, müşteri gidince üretim dursunaçık

    İpucu

    Akıt ve iptal et.

Olay günlüğü (0)

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

  1. Varsayılanla oynat. Cevabın tamamı beklendi: müşteri on iki adım boyunca boş ekrana baktı.
  2. “Geldikçe göster” seç. İlk parça ilk adımda göründü; toplam adım aynı.
  3. “Müşteri ayrılıyor”u aç. Dördüncü parçadan sonra kimse okumadı; model sekiz parça daha üretti.
  4. “İptal et”i de aç. Müşteri gidince üretim durdu.
Hızlı kontrolBaşlangıç

Tarayıcıya akan cevap için hangi teknik sık kullanılır?

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

İptal zincirinde hangi halka eksik olursa model çalışmaya devam eder?

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

Tuzaklar

Aradaki tampon. Yerelde akan cevap, bir ters vekil sunucunun arkasında tek seferde gelebilir. Aradaki her katmanda tamponlamanın kapalı olduğundan emin ol.

Yarıda kalan cevabı saklamak. Akış ortasında model hata verirse, gelen kısım tam bir cevap sanılmamalı. Yarıda kaldığını açıkça söyle ve yeniden denemeyi öner.

Eskiyen akışlar. Kullanıcı aynı soruyu art arda gönderirse, eski akışları iptal et ve aynı anda açık akış sayısını sınırla.

Kafam karıştı, daha basit anlat

Tamponu kapat, yarım cevabı yarım diye göster, eskiyen akışı kapat.

Hızlı kontrolOrta

Akış ortasında model hata verdi. Ekranda ne olmalı?

Cevabı biliyor musun?Önce birini seç. Tekrar zamanlaması buna göre ayarlanıyor.
Derinleş · Bankacılık asistanı: akan cevap ve uçtan uca iptal 3 dosya · ~59 satır · ilk okumada atlayabilirsin
Proje dosyaları

assistant/src/main/java/com/bank/assistant/ AnswerController.java Controller: model parçaları SSE olarak akar; bağlantı kapanınca abonelik iptal edilir ve model çağrısı durur.

assistant/src/main/java/com/bank/assistant/AnswerController.java
@RestController
@RequestMapping("/assistant")
class AnswerController {
private final ChatClient chat;
AnswerController(ChatClient chat) {
this.chat = chat;
}
@GetMapping(path = "/answer", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
Flux<ServerSentEvent<String>> answer(@RequestParam String question) {
return chat.prompt()
.user(question)
.stream()
.content()
.map(chunk -> ServerSentEvent.builder(chunk).build())
// When the browser disconnects, WebFlux cancels this Flux and the
// cancellation reaches the model call: no more chunks are produced.
.doOnCancel(() -> log.info("client left, model stream cancelled"));
}
private static final Logger log = LoggerFactory.getLogger(AnswerController.class);
}

web/src/assistant/ answer.ts Tarayıcı: EventSource ile dinler; kullanıcı ayrılınca ya da yeni soru gelince bağlantıyı kapatır.

web/src/assistant/answer.ts
let current: EventSource | null = null;
export function ask(question: string, onChunk: (text: string) => void, onDone: () => void): void {
// A new question closes the previous stream instead of letting it run on.
current?.close();
const source = new EventSource(`/assistant/answer?question=${encodeURIComponent(question)}`);
current = source;
source.onmessage = (event) => onChunk(event.data);
source.onerror = () => {
source.close();
onDone();
};
}
// Leaving the page closes the connection, which cancels the model call on the server.
window.addEventListener('pagehide', () => current?.close());

assistant/src/main/java/com/bank/assistant/ CategoryService.java Yapılandırılmış cevap: koda gidecek JSON akıtılmaz, tamamlanınca doğrulanır.

assistant/src/main/java/com/bank/assistant/CategoryService.java
@Service
class CategoryService {
private final ChatClient chat;
CategoryService(ChatClient chat) {
this.chat = chat;
}
/** Structured output goes to code: wait for the whole answer, then validate it. */
SpendingCategory categorize(String description) {
SpendingCategory category = chat.prompt()
.user("Bu harcamanın kategorisi: " + description)
.call()
.entity(SpendingCategory.class);
return SpendingCategory.validated(category);
}
}

Kendini sına

Şimşek turu1/4

Cevabı akıtmak toplam üretim süresini kısaltır.

Soru 1/3İleri

Akışı bir ters vekil sunucu (proxy) arkasında yayına aldın ama parçalar tek seferde geliyor. Olası neden?

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

Aklında kalacak üç şey

  1. 1 Cevabı akıtmak toplam süreyi değil, boş bekleyişi kısaltır: ilk kelime üretildiği anda ekrana gelir.
  2. 2 Müşteri ayrılınca bağlantı kapanır; sunucu bunu model çağrısına iletmezse model yazmaya ve faturalanmaya devam eder.
  3. 3 İnsana akıt, koda tamamlanmışı ver: yarım bir JSON ayrıştırılamaz ve doğrulanamaz.
0/4 kart bu dersten toplandı