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

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

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

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

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

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

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
  systemPrompt: '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 מהמקור, וגם היסטוריית אינטראקציות פוטנציאליות בסשנים. אפשר להשתמש באפשרות הזו, למשל, אם אתם מפעילים את הסשן הראשי באמצעות הנחיה של המערכת. כך האפליקציה צריכה לבצע את הפעולה הזו רק פעם אחת, וכל העותקים הכפולים יורשים מהסשן הראשי.

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;
const languageModel = await aiNamespace.languageModel.create({
  systemPrompt: '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.');

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

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

// Make this work in web apps and in extensions.
const aiNamespace = self.ai || chrome.aiOriginTrial || chrome.ai;

// 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 aiNamespace.languageModel.capabilities();
  sessionData = {
    systemPrompt: '',
    initialPrompts: [],
    topK: defaultTopK,
    temperature: defaultTemperature,
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await aiNamespace.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

מסקנות

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

תודות

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