أفضل الممارسات لإدارة جلسات الذكاء الاصطناعي باستخدام واجهة برمجة التطبيقات Prompt API

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

Prompt API هي إحدى واجهات برمجة التطبيقات المدمجة للذكاء الاصطناعي التي يستكشفها فريق Chrome. يمكنك اختباره على الجهاز باستخدام تطبيقاتك من خلال الانضمام إلى برنامج المعاينة المبكّرة، أو اختباره في مرحلة الإنتاج في إضافات Chrome من خلال الاشتراك في الإصدار التجريبي من Prompt API لإضافة Chrome. من الميزات الرئيسية لواجهة برمجة التطبيقات 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.');

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

المفهوم الثالث الذي يجب تعلُّمه هو مفهوم الطلبات الأولية. الغرض الأصلي من هذه الطريقة هو استخدامها لطلبات n مثال، أي إعداد النموذج باستخدام مجموعة من 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);
  }
}

عرض توضيحي

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

الاستنتاجات

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

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

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