שיטות מומלצות לניהול סשנים באמצעות Prompt API

Thomas Steiner
Thomas Steiner

תאריך פרסום: 27 בינואר 2025

הסבר פיתוח אתרים תוספים סטטוס Chrome כוונת רכישה
GitHub ניסיוני ב-EPP Chrome 138 תצוגה כוונה לערוך ניסוי

אחת מהתכונות העיקריות של Prompt API היא סשנים. הם מאפשרים לנהל שיחה אחת או יותר עם מודל ה-AI, בלי שהמודל יאבד את הקשר של מה שנאמר. במדריך הזה נספק שיטות מומלצות לניהול סשנים באמצעות מודל השפה.

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

איך מפעילים סשנים עם הנחיה ראשונית

הנחיה ראשונית מגדירה את ההקשר של הסשן בהתחלה. לדוגמה, אפשר להשתמש בהנחיה הראשונית כדי להורות למודל איך להשיב.

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }],
});
console.log(await languageModel.prompt('Tell me a joke.'));
// 'Avast ye, matey! What do you call a lazy pirate?\n\nA **sail-bum!**\n\nAhoy
// there, me hearties!  Want to hear another one? \n'

שכפול של סשן ראשי

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

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

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }]
});

// The original session `languageModel` remains unchanged, and
// the two clones can be interacted with independently from each other.
const firstClonedLanguageModel = await languageModel.clone();
const secondClonedLanguageModel = await languageModel.clone();
// Interact with the sessions independently.
await firstClonedLanguageModel.prompt('Tell me a joke about parrots.');
await secondClonedLanguageModel.prompt('Tell me a joke about treasure troves.');
// Each session keeps its own context.
// The first session's context is jokes about parrots.
await firstClonedLanguageModel.prompt('Tell me another.');
// The second session's context is jokes about treasure troves.
await secondClonedLanguageModel.prompt('Tell me another.');

שחזור סשן קודם

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

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

// Restore the session from localStorage, or initialize a new session.
// The UUID is hardcoded here, but would come from a
// session picker in your user interface.
const uuid = '7e62c0e0-6518-4658-bc38-e7a43217df87';

function getSessionData(uuid) {
  try {
    const storedSession = localStorage.getItem(uuid);
    return storedSession ? JSON.parse(storedSession) : false;
  } catch {
    return false;
  }
}

let sessionData = getSessionData(uuid);

// Initialize a new session.
if (!sessionData) {
  // Get the current default parameters so they can be restored as they were,
  // even if the default values change in the future.
  const { defaultTopK, defaultTemperature } =
    await LanguageModel.params();
  sessionData = {
    initialPrompts: [],
    topK: defaultTopK,
    temperature: defaultTemperature,
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);

// Keep track of the ongoing conversion and store it in localStorage.
const prompt = 'Tell me a joke';
try {
  const stream = languageModel.promptStreaming(prompt);
  let result = '';
  // You can already work with each `chunk`, but then store
  // the final `result` in history.
  for await (const chunk of stream) {
    // In practice, you'd render the chunk.
    console.log(chunk);
    result = chunk;
  }

  sessionData.initialPrompts.push(
    { role: 'user', content: prompt },
    { role: 'assistant', content: result },
  );

  // To avoid growing localStorage infinitely, make sure to delete
  // no longer used sessions from time to time.
  localStorage.setItem(uuid, JSON.stringify(sessionData));
} catch (err) {
  console.error(err.name, err.message);
}

שמירה על מכסת הסשנים על ידי מתן אפשרות למשתמש להפסיק את המודל

לכל סשן יש חלון הקשר שאפשר לראות על ידי גישה לשדות הרלוונטיים של הסשן: maxTokens,‏ tokensLeft ו-tokensSoFar.

const { maxTokens, tokensLeft, tokensSoFar } = languageModel;

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

גם השיטה prompt() וגם השיטה promptStreaming() מקבלות פרמטר שני אופציונלי עם שדה signal, כדי לאפשר למשתמש להפסיק את הסשן.

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

try {
  const stream = languageModel.promptStreaming('Write me a poem!', {
    signal: controller.signal,
  });
  for await (const chunk of stream) {
    console.log(chunk);
  }
} catch (err) {
  // Ignore `AbortError` errors.
  if (err.name !== 'AbortError') {
    console.error(err.name, err.message);
  }
}

הסרה של סשנים שלא בשימוש

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

הדגמה (דמו)

בדמו לניהול סשנים באמצעות AI תוכלו לראות איך זה עובד. אפשר ליצור כמה שיחות במקביל באמצעות Prompt API, לטעון מחדש את הכרטיסייה או אפילו להפעיל מחדש את הדפדפן ולהמשיך מהמקום שבו הפסקתם. קוד המקור ב-GitHub

ניצול מלוא הפוטנציאל של Prompt API

אם תנהל את סשנים של AI באופן שקול באמצעות השיטות והשיטות המומלצות האלה, תוכלו לממש את מלוא הפוטנציאל של Prompt API ולספק אפליקציות יעילות יותר, עם תגובה מהירה יותר ומותאמות יותר למשתמש. אפשר גם לשלב בין הגישות האלה, למשל, לאפשר למשתמש לשכפל סשן עבר ששוחזר כדי שיוכל להריץ תרחישים של "מה אם".

תודות

הבדיקה של המדריך בוצעה על ידי Sebastian Benz,‏ Andre Bandarra,‏ François Beaufort ו-Alexandra Klepper.