יחידה 3 / 11

סטרימינג ותגובות ארוכות

רווחים:

  • יכול להסביר מה זה סטרימינג, סוגי אירועים ומדוע זה נחוץ.
  • max_tokens תופס פסק זמן ויחס פלט ארוך של 128K
  • יכול לעשות את הבחירה הנכונה בין בקשות סטרימינג ובקשות שאינן סטרימינג לפי עומס העבודה

אולי שמתם לב שבממשק צ'אט, התגובה "מוקלדת" מילה אחר מילה. זו אינה פריחה ויזואלית; היא תוצאה של טכניקה הנקראת סטרימינג ולעתים קרובות היא חובה לאינטגרציה של LLM באיכות ייצור. ביחידה זו תלמדו מהי זרימה, מאילו אירועים היא מורכבת, הקשר שלה עם פלט ארוך ופסק זמן, ומתי להשתמש בזרימה ומתי לא. נסקור את הנושא באמצעות המשימות האמיתיות של איש מקצוע - עוזר חי, הפקת דוחות ארוכה, עיבוד אצווה.

מה זה Flow?

עם בקשה שאינה זורמת (סינכרונית), אתה מחכה עד שהמודל יפיק את כל התגובה; כשהתשובה מוכנה, היא מגיעה בחתיכה אחת. בבקשת סטרימינג, השרת שולח את התגובה חלק אחר חלק כשהמודל מייצר. מבחינה טכנית, זה נעשה עם אירועים שנשלחו על ידי שרת (SSE — Server-Sent Events, שיטה שבה השרת שולח אירועים קטנים ברצף בחיבור פתוח).

ההבדל מתברר בחוויית המשתמש: בתגובה שלוקחת 8 שניות, המשתמש שאינו זרם בוהה במסך ריק למשך 8 שניות; משתמש הסטרימינג רואה את המילים הראשונות תוך ~0.5 שניות והטקסט מתחיל לזרום. זמן ההמתנה הנתפס - ההמתנה שהמשתמש מרגיש - מופחת מאוד, בעוד הזמן הכולל נשאר ללא שינוי.

סוגי זרימה של אירועים

זרימה היא רצף של אירועים. מבחינה קונספטואלית, זרימה טיפוסית הולכת כך:

אירוע

משמעות

message_start

התחילה התגובה; הגיע מידע כותרת כמו דגם ומזהה.

content_block_start

התחיל בלוק תוכן (למשל טקסט).

content_block_delta

הגיעה חתיכת טקסט קטנה (דלתא); אתה אוסף את אלה

content_block_stop

הבלוק הושלם

message_delta

מידע סיום מעודכן כגון stop_reason ושימוש

message_stop

השב שוב

הקוד שלך משלב קטעי טקסט ברצף באירועי content_block_delta; בסופו של דבר אתה מקבל את אותו טקסט בדיוק כמו התגובה הלא-מוזרמת. השימוש (מספרי סמל) בדרך כלל ברורים בסוף הזרימה - אתה עוקב אחר העלויות ברגע שהזרימה מסתיימת.

טיפ: רוב ה-SDKs הרשמיים (ערכת פיתוח תוכנה - הספרייה המוכנה של הספק) מספקים עוזר שאוסף את הזרם עבורך (למשל stream.get_final_message()). אתה לא צריך לנהל את כל המסלולים באופן ידני; השתמש בעוזר זה אם אתה רוצה את הטקסט המלא, עבד אירועים בודדים אך להדפסה חיה.

תגובות ארוכות, max_tokens ופסק זמן

הסיבה השנייה והטכנית יותר לסטרימינג היא פסק זמן. אם בקשת HTTP לא הושלמה בתוך פרק זמן מסוים, הלקוח מפסיק את החיבור. כאשר אתה מבקש פלט גדול מהמודל (למשל דיווח של 40,000 אסימונים), השיחה הלא-זרימה עלולה לחרוג מהמגבלה הזו ופסק זמן - הבקשה תיכשל, ותצטרך לשלם עבור האסימונים שנוצרו.

דגמים מודרניים יכולים להוציא עד 128,000 אסימונים בבקשה אחת. אבל כלל האצבע ברור: השתמש בזרמים אם הערך 'max_tokens' גבוה (בערך מעל 16,000). הזרמה שומרת על החיבור בחיים ומונעת הפסקות זמן; אתה גם תראה התקדמות באופן מיידי.

  • `max_tokens`: אסימוני פלט מקסימליים שהמודל יכול לייצר; תקרה קשה. אם מתרחשת הפרעה, stop_reason max_tokens מוחזר.
  • חלון הקשר: החלון בו חייב להתאים סכום הקלט + הפלט. max_tokens היא התקרה של הפלט; אל תערבב בין השניים.
זהירות: השלכת בקשות שאינן זרימה עם max_tokens גדולים היא טעות קלאסית בייצור. ללא תגובה, החיבור נופל, המשתמש רואה שגיאה, והעלות האסימון מתבזבז. פלט ארוך = זרם.

מתי לזרום ומתי לא?

סטטוס

העדפה

למה

צ'אט חי / עוזר

לזרום

זמן האחזור נתפס יורד, המשתמש רואה התקדמות

דוח ארוך / הפקת מסמכים

לזרום

מונע פסק זמן, נושא פלט גדול בבטחה

סיווג קצר (למשל תג מילה בודדת)

אין זרימה

הפלט כבר קטן; מורכבות נוספת מיותרת

עיבוד אצווה

ללא זרימה/אצווה

התוצאות אינן מוצגות באופן מיידי; ראה יחידה 7

שלב אוטומציה (ברקע)

בדרך כלל אין זרימה

אתה מעביר את התוצאה לשלב הבא, ללא תצוגה חיה

הנחיה/תבניות הניתנות להעתקה

הזרם עצמו אינו הנחיה, אך הנחיות הן קריטיות לניהול הפלט שמפיק הזרם. בהפקות ארוכות וזורמות, הטלת המבנה מלפנים מגבירה גם את האיכות וגם את העקיבות.

# חלקו את הדוח הארוך למקטעים (כדי שההתקדמות תיראה בזרימה) כתבו את הדוח עם הכותרות הבאות, בסדר הזה בדיוק. התחל כל כותרת עם '## ':## סיכום## ממצאים## המלצות## השלבים הבאים

# תן אורך יעד כדי למנוע קיטום בייצור ארוך. הטקסט הכולל יהיה כ-800 מילים. שמור על המנות מאוזנות; אל תשאיר חצי משפט בסוף.

# תן מיד את המשפט הראשון עבור עוזר הסטרימינג. תן תחילה תשובה ישירה של משפט אחד, ואז פרט. אז המשתמש רואה תוצאה מיידית בזמן ההמתנה.

# שמור על הפלט הארוך מובנה (כדי שניתן יהיה לנתח אותו מאוחר יותר) פלט את הפלט בקטעים אלה וסמן כל חלק בכותרת '### ' נפרדת כדי שאוכל לנתח אותו באופן תוכנתי: ### מבוא ### BODY ### מקורות

הנחיה חלשה / הנחיה חזקה (הפקה ארוכה)

# WEAKכתוב דוח ארוך ומפורט בנושא זה.

# STRONGכתוב דוח של כ-900 מילים בנושא זה. כותרות: ## סיכום, ## ניתוח, ## סיכונים, ## המלצות. כל כותרת צריכה להיות מקסימום 3 פסקאות. אל תשאיר חצי משפט בסוף.

גרסה חזקה; הוא קובע מראש את האורך, המבנה ואיכות הגימור. כאשר מקטעים מגיעים בזרימה, המשתמש רואה את ההתקדמות בבירור ומנהל את האורך בעצמו כנגד הסיכון של הפרעות בדגם.

שלושה מיני מארזים

מקרה 1 - תלונה על מסך ריק. עוזר לקוחות של צוות ייעוץ הגיב ללא זרימה; תגובה ממוצעת אורכת 7 שניות, משתמשים שואלים "האם זה קופא?" הוא התלונן. ברגע שנכנסתי לזרימה, המילה הראשונה הגיעה תוך ~0.6 שניות; הזמן הכולל נשאר זהה, אבל תלונות "איטיות" כמעט נעלמו.

מקרה 2 - דוח מיושן. צוות כספים הפיק דו"ח רבעוני בן 30 עמודים; עם max_tokens: 30000, הבקשה ללא זרימה תתקע בזמן קצוב של לקוח של 60 שניות, הבקשה תיכשל - והאסימונים שנוצרו ייכתבו לחשבונית. הם הלכו עם הזרם; החיבור נשאר פעיל, הדוח נמסר במלואו, ועלויות מבוזבז בוטלו.

מקרה 3 - זרימה מיותרת. צוות תפעול תייג מיילים נכנסים כ"דחופים/רגילים"; הפלט היה מילה אחת, אבל הם נהגו להשתמש בזרימה. הזרימה לא סיפקה שום תועלת בתגובה של מילה אחת, מה שהפך את הקוד למורכב שלא לצורך. כשעברתי ל-flowless, הקוד התפשט וההתנהגות נשארה זהה. לקח: סטרימינג הוא בעל ערך בפלט ארוך/חי, לא בכל מקום.

טעויות נפוצות

  • אי שימוש בזרמים בפלט ארוך: זמן קצוב ועלות אסימון מבוזבז.
  • שימוש בסטרימינג בפלט קצר: מורכבות מיותרת, אפס תועלת.
  • אי סימון 'סיבה_stop' בסוף הזרם: התגובה הקטומה עם max_tokens נחשבת להשלמת.
  • מיזוג שגוי של deltas: סיכום ידני עם עוזר SDK מייצר שגיאת רצף/חלקים חסרים.
  • מנסה לקרוא 'שימוש' באמצע הזרם: מספרי אסימונים בדרך כלל מתבהרים בסוף; עקוב אחר העלויות בסוף.
  • טעות בסטרימינג לקיצוץ בעלויות: הזרמה משפרת את החוויה והסיבולת; זה לא משנה את המחיר הסמלי.

עמוק יותר: הפסקות זרימה וחוסן

סטרימינג הוא חיבור חי; זה גם הכוח שלו וגם הפגיעות שלו. אם החיבור יירד באמצע (תנודות רשת, פסק זמן של לקוח), תשמור את הטקסט שצברת עד כה, אך התגובה לא תהיה מלאה. לקוח סטרימינג באיכות הפקה צריך להיות מוכן לכך: הוא לא צריך להתייחס לטקסט החלקי כאל "תגובה הושלמה", וגם לא לשקול שהתגובה הסתיימה עד שהוא רואה את האירוע message_stop.

העדינות השנייה היא שהזרימה אינה משנה את העלות. אם תקבל תגובה עם או בלי סטרימינג לא משפיע על מחיר האסימון; זרימה רק משפרת את החוויה והסיבולת. אז "אם נלך לשדר, האם הם יהיו זולים יותר?" התשובה לשאלה היא לא - עבור עלות, הסתכל על היחידה החמישית והשישית (בחירת דגם, מטמון).

הנקודה השלישית היא להגיע לאיזון מעשי: עם עוזרים חיים, הגעה מהירה של המילה הראשונה (עיכוב נתפס) מוערכת מאוד; לכן, בקשת המודל להזין ישירות את התשובה ולתת תחילה תוצאה קצרה (דרך הנחיית המערכת ביחידה הרביעית) מכפילה את התועלת מהזרימה. אם המשתמש רואה משהו משמעותי בשנייה הראשונה, הוא ממתין בסבלנות לפרט שאחריו. מצד שני, לזרימה אין תרומה לעבודות הפועלות ברקע, שהפלט שלהן עובר לשלב האוטומציה הבא; הקריטריון היחיד שיש הוא שהעבודה בוצעה בצורה נכונה ומלאה.

לסיכום

הזרמה מאחזרת את התגובה חלק אחר חלק, מפחיתה את זמן ההשהיה הנתפסת ומונעת פסק זמן בתפוקות גדולות. כמעט חובה עבור עוזר חי והפקת מסמכים ארוכים; זה מיותר לעבודות קצרות/רקע. בהפקות ארוכות, הטלת המבנה והאורך מלפנים בהנחיה מגבירה הן את האיכות והן את העקיבות; כאשר הזרימה מסתיימת, stop_reason והשימוש בהחלט נבדקים.

משימת יישום

בחר שני תרחישים: אחד חי/ארוך (למשל דיווח ללקוח), אחד קצר/רקע (למשל תיוג). (1) החלט והצדק אם תשתמש בזרימה עבור כל אחד מהם. (2) כתוב הנחיה שכופה את המבנה של התסריט הארוך (כותרות + אורך יעד). (3) קבע ערכי max_tokens. (4) רשום אילו בדיקות תבצע עם stop_reason ושימוש בסוף הזרימה.

רשימת בדיקה

  • [ ] אני יכול להסביר מה זה סטרימינג וכיצד הוא מפחית את ההשהיה הנתפסת.
  • [ ] הבנתי את סוגי האירועים הבסיסיים של הצטרפות הזרם והדלתא.
  • [ ] אני יודע על הצורך להזרים עם max_tokens גדולים ויחס הזמן הקצוב.
  • [ ] אני יכול להחליט באיזה עומס עבודה אשתמש בסטרימינג ובאיזה לא.
  • [ ] אני יכול לבדוק stop_reason ושימוש בסוף הזרם.