أفضل الممارسات لإدارة الجلسات باستخدام Prompt API

تاريخ النشر: 27 كانون الثاني (يناير) 2025

الشرح الويب الإضافات حالة Chrome النيّة بالشراء
Github ميزة تجريبية في EPP خلف علم مرحلة التجربة والتقييم لا تنطبق لا تنطبق

من الميزات الرئيسية لواجهة برمجة التطبيقات Prompt API هي الجلسات. تتيح لك هذه الميزات إجراء محادثة واحدة أو محادثات متعددة جارية مع نموذج الذكاء الاصطناعي، بدون أن يفقد النموذج أثرًا في سياق ما تم قوله. يقدّم هذا الدليل أفضل الممارسات المتعلّقة بإدارة الجلسات باستخدام نموذج اللغة.

قد تحتاج إلى إدارة جلسة واحدة أو أكثر من الجلسات الموازية إذا كنت بصدد إنشاء برنامج محادثة تقليدي يتفاعل فيه مستخدم واحد مع الذكاء الاصطناعي. أو إذا كان لديك أنظمة لإدارة علاقات العملاء يتعامل فيها أحد موظّفي الدعم مع عملاء متعدّدين بشكل متزامن ويستفيد من الذكاء الاصطناعي لمساعدة موظّف الدعم في تتبُّع المحادثات المختلفة.

بدء جلسة باستخدام طلب نظام

طلب من النظام لإعداد سياق الجلسة في البداية على سبيل المثال، يمكنك استخدام طلب النظام لإعلام النموذج بالطريقة التي يجب أن يستجيب بها.

// 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.');

استعادة جلسة سابقة

باستخدام الطلبات الأولية، يمكنك إعداد النموذج باستخدام مجموعة من أمثلة الطلبات والردود، وذلك للحصول على نتائج أفضل. ويتم استخدام هذا الإجراء غالبًا في طلبات متعددة اللقطات لإنشاء ردود تعكس توقعاتك.

إذا كنت تتتبّع المحادثات الجارية مع النموذج، يمكنك استخدام هذه الممارسة لإعادة جلسة. على سبيل المثال، بعد إعادة تشغيل المتصفّح، يمكنك مساعدة المستخدم في مواصلة التفاعل مع النموذج من حيث توقّف. ومن الطرق التي يمكنك اتّباعها تتبُّع سجلّ الجلسات في مساحة التخزين المحلية.

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

عرض توضيحي

يمكنك الاطّلاع على إدارة الجلسات بالذكاء الاصطناعي في العرض التقديمي لإدارة الجلسات بالذكاء الاصطناعي. يمكنك إنشاء محادثات متعدّدة ومتزامنة باستخدام Prompt API، وإعادة تحميل علامة التبويب أو حتى إعادة تشغيل المتصفّح، ومواصلة المحادثة من حيث توقّفت. يمكنك الاطّلاع على الرمز المصدر على GitHub.

الاستنتاجات

من خلال إدارة جلسات الذكاء الاصطناعي بعناية باستخدام هذه الأساليب وأفضل الممارسات، يمكنك الاستفادة إلى أقصى حد من إمكانات Prompt API، وتقديم تطبيقات أكثر فعالية وسرعة استجابة وتركيزًا على المستخدم. يمكنك أيضًا الجمع بين هذين الأسلوبين، على سبيل المثال، من خلال السماح للمستخدم بنسخ جلسة سابقة تم استعادتها، كي تتمكّن من تنفيذ سيناريوهات "ماذا لو".

الشكر والتقدير

راجع هذا الدليل كلّ من سيباستيان بينز، أندريه باندرا، فرانسوا بافورت، أليكساندرا كلبر.