Prompt API

تاريخ النشر: 11 تشرين الثاني (نوفمبر) 2024، تاريخ آخر تعديل: 20 أيار (مايو) 2025

فيديو الشرح الويب الإضافات حالة Chrome النيّة بالشراء
Github تجريبية في EPP الإصدار التجريبي من Chrome الإصدار التجريبي من Chrome 137 العرض الرغبة في إجراء تجربة

باستخدام Prompt API، يمكنك إرسال طلبات بلغة طبيعية إلى Gemini Nano في المتصفّح.

هناك العديد من الطرق لاستخدام Prompt API في إضافات Chrome. على سبيل المثال:

  • أحداث التقويم الفورية: يمكنك تطوير إضافة Chrome تُستخرج تلقائيًا تفاصيل الأحداث من صفحات الويب، ما يتيح للمستخدمين إنشاء إدخالات تقويم ببضع خطوات فقط.
  • استخراج جهات الاتصال بسلاسة أنشئ إضافة تستخرج معلومات الاتصال من المواقع الإلكترونية، ما يسهّل على المستخدمين التواصل مع نشاط تجاري أو إضافة تفاصيل إلى قائمة جهات الاتصال.
  • فلترة المحتوى الديناميكية: أنشئ إضافة Chrome تحلِّل مقالات الأخبار وتمويه المحتوى أو إخفائه تلقائيًا استنادًا إلى topics التي يحدّدها المستخدم

هذه ليست سوى بعض الأفكار، ولكننا متحمّسون لرؤية ابتكاراتك.

استخدام واجهة برمجة التطبيقات Prompt API في الإضافات

تتوفّر لك دالتَا إضافة في مساحة الاسم LanguageModel:

  • availability() للاطّلاع على ميزات النموذج ومعرفة ما إذا كان متاحًا
  • create() لبدء جلسة نموذج لغوي.

تنزيل النموذج

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

لتحديد ما إذا كان النموذج جاهزًا للاستخدام، استخدِم الدالة غير المتزامنة LanguageModel.availability(). من المفترض أن يعرض هذا الإجراء أحد الرسائل التالية:

  • 'no': يتيح المتصفّح استخدام Prompt API، ولكن لا يمكن استخدامه في الوقت الحالي. وقد يرجع ذلك لعدد من الأسباب، مثل عدم توفّر مساحة كافية على القرص لتنزيل النموذج.
  • 'readily': يتيح المتصفّح استخدام Prompt API، ويمكن استخدامه على الفور.
  • 'after-download': يتيح المتصفّح استخدام Prompt API، ولكن عليه أولاً تنزيل النموذج.

لبدء تنزيل النموذج وإنشاء جلسة النموذج اللغوي، استخدِم الدالة LanguageModel.availability() غير المتزامنة. إذا كان الردّ على availability() هو 'after-download'، من أفضل الممارسات الاستماع إلى مستوى تقدّم التنزيل. بهذه الطريقة، يمكنك إبلاغ المستخدم في حال استغراق عملية التحميل لبعض الوقت.

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener("downloadprogress", (e) => {
      console.log(`Downloaded ${e.loaded} of ${e.total} bytes.`);
    });
  },
});

إمكانات النماذج

تُعلمك الدالة availability() أيضًا بقدرات availability() نموذج اللغة. بالإضافة إلى available، يحتوي العنصر أيضًا على الحقول التالية:

await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

إنشاء جلسة

بعد أن تصبح واجهة برمجة التطبيقات Prompt API قابلة للتشغيل، يمكنك إنشاء جلسة باستخدام الدالة create(). يمكنك توجيه النموذج باستخدام دالة prompt() أو دالة promptStreaming().

تخصيص جلستك

يمكن تخصيص كل جلسة باستخدام topK وtemperature باستخدام عنصر options اختياري. يتم عرض القيم التلقائية لهذه المَعلمات من LanguageModel.availability().

const capabilities = await LanguageModel.availability();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(availability.defaultTemperature * 1.2, 2.0),
  topK: capabilities.defaultTopK,
});

يقبل عنصر الخيارات الاختياري في الدالة create() أيضًا حقل signal، ما يتيح لك تمرير AbortSignal لإلغاء الجلسة.

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

const session = await LanguageModel.create({
  signal: controller.signal,
})

الطلبات الأولية

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

const session = await LanguageModel.create({
  initialPrompts: [
    { role: 'system', content: 'You are a helpful and friendly assistant.' },
    { role: 'user', content: 'What is the capital of Italy?' },
    { role: 'assistant', content: 'The capital of Italy is Rome.'},
    { role: 'user', content: 'What language is spoken there?' },
    { role: 'assistant', content: 'The official language of Italy is Italian. [...]' }
  ]
});

حدود الجلسات

تحتوي جلسة نموذج لغوي معيّنة على الحد الأقصى لعدد الرموز التي يمكنها معالجتها. يمكنك التحقّق من معدّل الاستخدام والتقدّم نحو هذا الحدّ باستخدام السمات التالية في عنصر الجلسة:

console.log(`${session.tokensSoFar}/${session.maxTokens}
(${session.tokensLeft} left)`);

الاحتفاظ بحالة الجلسة

تتتبّع كل جلسة سياق المحادثة. يتمّ أخذ التفاعلات السابقة في الاعتبار للتفاعلات المستقبلية إلى أن تمتلئ نافذة السياق للجلسة.

const session = await LanguageModel.create({
  initialPrompts: [{
    role: "system",
    content: "You are a friendly, helpful assistant specialized in clothing choices."
  }]
});

const result1 = await session.prompt(
  "What should I wear today? It is sunny. I am unsure between a t-shirt and a polo."
);
console.log(result1);

const result2 = await session.prompt(
  "That sounds great, but oh no, it is actually going to rain! New advice?"
);
console.log(result2);

نسخ جلسة

للحفاظ على الموارد، يمكنك استنساخ جلسة حالية باستخدام الدالة clone(). تتم إعادة ضبط سياق المحادثة، ولكن تظل المطالبة الأولية intact سليمة. تأخذ الدالة clone() عنصر خيارات اختياريًا يحتوي على حقل signal، ما يتيح لك تمرير AbortSignal لمحاولة إتلاف الجلسة التي تم نسخها.

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

const clonedSession = await session.clone({
  signal: controller.signal,
});

توجيه طلب إلى النموذج

يمكنك توجيه النموذج باستخدام دالة prompt() أو دالة promptStreaming().

إخراج غير مخصّص للبث

إذا كنت تتوقّع نتيجة قصيرة، يمكنك استخدام الدالة prompt() التي تعرض الردّ فور توفّره.

// Start by checking if it's possible to create a session based on the
// availability of the model, and the characteristics of the device.
const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  const session = await LanguageModel.create();

  // Prompt the model and wait for the whole result to come back.
  const result = await session.prompt("Write me a poem!");
  console.log(result);
}

إخراج البث

إذا كنت تتوقّع استجابة أطول، يجب استخدام الدالة promptStreaming() التي تتيح لك عرض نتائج جزئية عند ورودها من النموذج.

const {available, defaultTemperature, defaultTopK, maxTopK } =
  await LanguageModel.availability();

if (available !== 'no') {
  const session = await LanguageModel.create();

  // Prompt the model and stream the result:
  const stream = session.promptStreaming('Write me an extra-long poem!');
  for await (const chunk of stream) {
    console.log(chunk);
  }
}

تُعرِض promptStreaming() ReadableStream تكون أجزاؤه متعاقبة تعتمد على بعضها. على سبيل المثال، "Hello," و"Hello world," و"Hello world I am," "Hello world I am an AI.". هذا ليس السلوك المقصود. وننوي المواءمة مع واجهات برمجة تطبيقات البث الأخرى على المنصة، حيث تكون الأجزاء متتالية وتشكل بثًا طويلاً واحدًا. وهذا يعني أنّ الإخراج سيكون تسلسلًا مثل "Hello" و" world" و" I am" و" an AI".

في الوقت الحالي، لتحقيق السلوك المقصود، يمكنك تنفيذ ما يلي: يعمل هذا الإجراء مع السلوك العادي وغير العادي.

let result = '';
let previousChunk = '';

for await (const chunk of stream) {
  const newChunk = chunk.startsWith(previousChunk)
      ? chunk.slice(previousChunk.length) : chunk;
  console.log(newChunk);
  result += newChunk;
  previousChunk = chunk;
}
console.log(result);

إيقاف عرض طلب

يقبل كلّ من prompt() وpromptStreaming() مَعلمة ثانية اختيارية باستخدام حقل signal، ما يتيح لك إيقاف عرض طلبات التأكيد.

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

const result = await session.prompt(
  'Write me a poem!',
  { signal: controller.signal }
);

إنهاء جلسة

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

await session.prompt(
  "You are a friendly, helpful assistant specialized in clothing choices."
);

session.destroy();

// The promise is rejected with an error explaining that
// the session is destroyed.
await session.prompt(
  "What should I wear today? It is sunny, and I am unsure between a
  t-shirt and a polo."
);

عرض توضيحي

لاختبار Prompt API في إضافات Chrome، ثبِّت الإضافة التجريبية. يتوفّر رمز المصدر للإضافة على GitHub.

واجهة تجريبية لواجهة برمجة التطبيقات Prompt API

المشاركة وتقديم الملاحظات

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