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

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

הסבר פיתוח אתרים תוספים הסטטוס של Chrome המטרה
GitHub גרסת מקור לניסיון בגרסת מקור לניסיון 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 דוגמאות, כדי ליצור תשובות שתואמות לציפיות שלכם.

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

// 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);
}

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

לכל סשן יש חלון הקשר שאפשר לראות כשניגשים לשדות הרלוונטיים inputQuota ו-inputUsage של הסשן.

const { inputQuota, inputUsage } = languageModel;
const inputQuotaLeft = inputQuota - inputUsage;

אם חורגים מחלון ההקשר הזה, המודל מאבד את היכולת לעקוב אחרי ההודעות הכי ישנות בסשן. אם ההקשר היה חשוב, יכול להיות שהתוצאות יהיו גרועות יותר. כדי לשמור על המכסה, אם משתמש קובע שהתשובה של המודל לא מועילה, צריך לאפשר לו להפסיק את הסשן באמצעות 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 בפעולה בהדגמה של ניהול סשנים באמצעות AI. אתם יכולים ליצור כמה שיחות מקבילות באמצעות Prompt API, לטעון מחדש את הכרטיסייה או אפילו להפעיל מחדש את הדפדפן, ולהמשיך מהמקום שבו הפסקתם. אפשר לעיין בקוד המקור ב-GitHub.

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

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

תודות

המדריך הזה נבדק על ידי סבסטיאן בנץ, אנדרה בנדרה, פרנסואה בופור ואלכסנדרה קלפר.