Unitate 3 / 11

Streaming și răspunsuri lungi

Câștiguri:

  • Poate explica ce este streamingul, tipurile de evenimente și de ce este necesar.
  • max_tokens înțelege timeout și relația de ieșire lungă de 128K
  • Poate face alegerea corectă între solicitările de streaming și non-streaming în funcție de volumul de muncă

Poate ați observat că într-o interfață de chat, răspunsul este „dactilografiat” cuvânt cu cuvânt. Aceasta nu este o înflorire vizuală; Este rezultatul unei tehnici numite streaming și este adesea obligatoriu pentru integrarea LLM la calitatea producției. În această unitate, veți învăța ce este fluxul, din ce evenimente constă, relația acestuia cu producția lungă și timeout și când să utilizați fluxul și când nu. Vom acoperi subiectul prin sarcinile reale ale unui profesionist - asistent live, generare lungă de rapoarte, procesare în loturi.

Ce este Flow?

Cu o cerere non-streaming (sincronă), așteptați până când modelul produce întregul răspuns; Când răspunsul este gata, acesta ajunge dintr-o singură bucată. Într-o cerere de streaming, serverul trimite răspunsul bucată cu bucată pe măsură ce modelul generează. Din punct de vedere tehnic, acest lucru se realizează cu evenimente trimise de server (SSE — Server-Sent Events, o metodă prin care serverul trimite evenimente mici în succesiune printr-o conexiune deschisă).

Diferența devine evidentă în experiența utilizatorului: la un răspuns care durează 8 secunde, utilizatorul non-stream se uită la un ecran gol timp de 8 secunde; Utilizatorul de streaming vede primele cuvinte în ~0,5 secunde și textul începe să curgă. Latența percepută - așteptarea pe care o simte utilizatorul - este mult redusă, în timp ce timpul total rămâne neschimbat.

Tipuri de evenimente de flux

Fluxul este o succesiune de evenimente. Conceptual, un flux tipic este astfel:

incident

Înțeles

mesaj_start

Răspunsul a început; Au sosit informații din antet, cum ar fi modelul și ID-ul.

content_block_start

A început un bloc de conținut (de exemplu, text).

content_block_delta

A sosit o mică bucată de text (delta); tu colectezi astea

content_block_stop

bloc finalizat

mesaj_delta

Informații de sfârșit actualizate, cum ar fi stop_reason și utilizare

mesaj_oprire

Răspunde peste

Codul dvs. combină secvenţial bucăţi de text în evenimente content_block_delta; ajungeți să obțineți același text exact ca răspunsul netransmis în flux. utilizarea (numerele indicative) sunt de obicei clare la sfârșitul fluxului - ține evidența costurilor odată ce fluxul s-a încheiat.

Sfat: majoritatea SDK-urilor oficiale (kit de dezvoltare software — biblioteca gata creată a furnizorului) oferă un ajutor care colectează fluxul pentru dvs. (de exemplu, stream.get_final_message()). Nu trebuie să gestionați manual toate piesele; Utilizați acest ajutor dacă doriți textul complet, procesați evenimente individuale, dar pentru imprimare live.

Răspunsuri lungi, max_tokens și Timeout

A doua și mai tehnică cauză a streamingului este timeout. Dacă o solicitare HTTP nu este finalizată într-o anumită perioadă de timp, clientul întrerupe conexiunea. Când solicitați o ieșire mare de la model (de exemplu, un raport de 40.000 de jetoane), apelul non-flow poate depăși această limită și poate expira - cererea va eșua și va trebui să plătiți pentru jetoanele generate.

Modelele moderne pot scoate până la 128.000 de jetoane într-o singură solicitare. Dar regula generală este clară: utilizați fluxuri dacă valoarea `max_tokens` este mare (aproximativ peste 16.000). Streamingul menține conexiunea vie și previne expirarea timpului; De asemenea, veți vedea progresul instantaneu.

  • `max_tokens`: Numărul maxim de jetoane de ieșire pe care modelul le poate produce; un tavan dur. Dacă apare o întrerupere, stop_reason max_tokens este returnat.
  • Fereastra context: fereastra în care trebuie să se potrivească suma intrărilor + ieșirii. max_tokens este plafonul ieșirii; Nu amesteca cele doua.
Atenție: Aruncarea cererilor non-flow cu max_tokens mari este o greșeală clasică în producție. Fără răspuns, conexiunea se întrerupe, utilizatorul vede o eroare și costul simbolului este irosit. Ieșire lungă = flux.

Când să curgă și când nu?

Stare

preferinta

De ce

Chat live / asistent

curgere

Latența percepută scade, utilizatorul vede progresul

Raport lung / producție de documente

curgere

Previne timeout-ul, efectuează o producție mare în siguranță

Clasificare scurtă (de exemplu, etichetă cu un singur cuvânt)

nici un flux

Ieșirea este deja mică; complexitate suplimentară inutilă

Prelucrare în lot

fără curgere/lot

Rezultatele nu sunt afișate instantaneu; Vezi unitatea 7

Pas de automatizare (în fundal)

De obicei, fără flux

Treci rezultatul la pasul următor, fără afișare live

Solicitare/Șabloane copiabile

Fluxul în sine nu este un prompt, dar solicitările sunt critice pentru gestionarea rezultatului produs de flux. În producțiile lungi și fluide, impunerea structurii din față crește atât calitatea, cât și trasabilitatea.

# Împărțiți raportul lung în secțiuni (astfel încât progresul să fie vizibil în flux) Scrieți raportul cu următoarele titluri, în această ordine exactă. Începeți fiecare titlu cu „## „:## Rezumat## Constatări## Recomandări## Pașii următori

# Dați lungimea țintei pentru a evita trunchierea în producția lungă. Textul total va avea aproximativ 800 de cuvinte. Păstrați porțiile echilibrate; Nu lăsa o jumătate de propoziție la sfârșit.

# Dați imediat prima propoziție pentru asistentul de streaming. Dați mai întâi un răspuns direct cu o propoziție, apoi intrați în detalii. Deci, utilizatorul vede un rezultat imediat în timp ce așteaptă.

# Păstrați ieșirea lungă structurată (pentru a putea fi analizată mai târziu) Afișați rezultatul în aceste secțiuni și marcați fiecare secțiune cu un antet separat „###”, astfel încât să o pot analiza programatic: ### INTRODUCERE ### BODY ### SURSE

Prompt slab / Prompt puternic (producție lungă)

# SLAB Scrieți un raport lung și detaliat pe această temă.

# STRONGScrieți un raport de aproximativ 900 de cuvinte pe acest subiect. Titluri: ## Rezumat, ## Analiză, ## Riscuri, ## Recomandări. Fiecare titlu trebuie să aibă maximum 3 paragrafe. Nu lăsa o jumătate de propoziție la sfârșit.

Versiune puternică; Determină în prealabil lungimea, structura și calitatea finisajului. Pe măsură ce secțiunile vin în flux, utilizatorul vede progresul în mod clar și gestionează singur lungimea împotriva riscului de întrerupere a modelului.

Trei mini carcase

Cazul 1 — Reclamație cu ecran necompletat. Asistentul client al unei echipe de consultanță a răspuns fără flux; răspunsul mediu durează 7 secunde, utilizatorii întreabă „îngheață?” s-a plâns el. Odată ce am intrat în flux, primul cuvânt a venit în ~0,6 secunde; Timpul total a rămas același, dar plângerile „lente” aproape au dispărut.

Cazul 2 – Raport învechit. O echipă financiară avea un raport trimestrial de 30 de pagini; Cu max_tokens: 30000, cererea fără flux s-ar bloca într-o perioadă de expirare a clientului de 60 de secunde, cererea ar eșua - iar tokenurile generate vor fi înscrise pe factură. Au mers cu fluxul; conexiunea a rămas activă, raportul a fost livrat integral, iar costurile irosite au fost eliminate.

Cazul 3 – Flux inutil. O echipă de operațiuni eticheta e-mailurile primite drept „urgente/regulate”; Ieșirea a fost un cuvânt, dar în mod obișnuit au folosit flux. Fluxul nu a oferit niciun beneficiu în răspunsul cu un singur cuvânt, făcând codul complex inutil. Când am trecut la flowless, codul s-a simplificat și comportamentul a rămas același. Lecție: streamingul este valoros în ieșirea lungă/live, nu peste tot.

Greșeli comune

  • Nu folosiți fluxuri în ieșire lungă: Timeout și costul jetonului irosit.
  • Utilizarea fluxului în flux scurt: complexitate inutilă, beneficiu zero.
  • Nu se bifează `stop_reason` la sfârșitul fluxului: răspunsul trunchiat cu max_tokens este considerat complet.
  • Îmbinarea incorectă a deltelor: însumarea manuală cu ajutorul SDK produce o eroare de secvență/părți lipsă.
  • Încercarea de a citi „utilizarea” la mijlocul fluxului: numerele de simboluri devin de obicei clare la sfârșit; Urmăriți costurile la final.
  • Confundarea streamingului cu reducerea costurilor: Streamingul îmbunătățește experiența și rezistența; Nu modifică prețul tokenului.

Mai adânc: întreruperi de flux și rezistență

Streamingul este o conexiune live; Aceasta este atât puterea, cât și vulnerabilitatea sa. Dacă conexiunea scade la mijloc (fluctuație de rețea, timeout client), veți păstra textul pe care l-ați acumulat până acum, dar răspunsul va fi incomplet. Un client de streaming de calitate de producție ar trebui să fie pregătit pentru aceasta: nu ar trebui să trateze textul parțial ca un „răspuns finalizat”, nici nu ar trebui să considere răspunsul ca fiind terminat până când nu vede evenimentul message_stop.

A doua subtilitate este că fluxul nu modifică costul. Dacă primiți un răspuns cu sau fără streaming, nu afectează prețul simbolului; fluxul nu face decât să îmbunătățească experiența și rezistența. Deci, „dacă mergem în streaming, vor fi mai ieftine?” Răspunsul la întrebare este nu - pentru cost, uitați-vă la a 5-a și a 6-a unitate (selectarea modelului, cache).

Al treilea punct este de a atinge un echilibru practic: cu asistenți în direct, sosirea rapidă a primului cuvânt (întârziere percepută) este foarte apreciată; Prin urmare, a cere modelului să introducă răspunsul direct și să dea mai întâi un rezultat scurt (prin intermediul promptului de sistem din a 4-a unitate) multiplica beneficiul fluxului. Dacă utilizatorul vede ceva semnificativ în prima secundă, așteaptă cu răbdare detaliul care urmează. Pe de altă parte, fluxul nu are nicio contribuție la joburile care rulează în fundal, a căror ieșire merge la următorul pas de automatizare; Singurul criteriu este ca lucrarea să fie finalizată corect și complet.

Pe scurt

Streamingul preia răspunsul bucată cu bucată, reducând latența percepută și prevenind timeout-urile la debite mari. Aproape obligatoriu pentru asistentul live și producția de documente lungi; Este inutil pentru lucrări scurte/de fundal. În producțiile lungi, impunerea structurii și lungimii din față cu promptitudine crește atât calitatea, cât și trasabilitatea; Când fluxul este terminat, stop_reason și utilizarea sunt cu siguranță verificate.

Sarcina de aplicare

Alegeți două scenarii: unul live/lung (de exemplu, raportați către client), unul scurt/de fundal (de exemplu, etichetare). (1) Decideți și justificați dacă veți folosi flux pentru fiecare. (2) Scrieți un prompt care impune structura pentru scriptul lung (titluri + lungimea țintă). (3) Determinați valorile max_tokens. (4) Listați ce verificări veți efectua cu stop_reason și utilizare la sfârșitul fluxului.

lista de verificare

  • [ ] Pot explica ce este streamingul și cum reduce latența percepută.
  • [ ] Am înțeles tipurile de evenimente de bază ale îmbinării fluxului și delta.
  • [ ] Știu despre necesitatea de a transmite în flux cu max_tokens mari și despre relația de timeout.
  • [ ] Pot decide în ce sarcină de lucru voi folosi streaming și în care nu.
  • [ ] Pot verifica stop_reason și utilizarea la sfârșitul fluxului.