Prompt API

منتشر شده: ۲۰ مه ۲۰۲۵، آخرین به‌روزرسانی: ۲۱ سپتامبر ۲۰۲۵

توضیح دهنده وب افزونه‌ها وضعیت کروم قصد
گیت‌هاب محاکمه مبدا محاکمه مبدا کروم ۱۳۸ مشاهده قصد آزمایش

با استفاده از Prompt API، می‌توانید درخواست‌های زبان طبیعی را در مرورگر به Gemini Nano ارسال کنید.

روش‌های زیادی برای استفاده از Prompt API وجود دارد. برای مثال، می‌توانید موارد زیر را بسازید:

  • جستجوی مبتنی بر هوش مصنوعی : به سوالات بر اساس محتوای یک صفحه وب پاسخ دهید.
  • فیدهای خبری شخصی‌سازی‌شده : فیدی بسازید که مقالات را به صورت پویا با دسته‌بندی‌ها طبقه‌بندی کند و به کاربران اجازه دهد آن محتوا را فیلتر کنند.
  • فیلترهای محتوای سفارشی . مقالات خبری را تجزیه و تحلیل کنید و به طور خودکار محتوا را بر اساس موضوعات تعریف شده توسط کاربر محو یا پنهان کنید.
  • ایجاد رویداد در تقویم . یک افزونه کروم توسعه دهید که به طور خودکار جزئیات رویداد را از صفحات وب استخراج کند، بنابراین کاربران می‌توانند تنها در چند مرحله ورودی‌های تقویم را ایجاد کنند.
  • استخراج یکپارچه مخاطبین . افزونه‌ای بسازید که اطلاعات مخاطبین را از وب‌سایت‌ها استخراج کند و تماس با یک کسب‌وکار یا افزودن جزئیات به لیست مخاطبین را برای کاربران آسان‌تر کند.

اینها فقط چند مورد از امکانات هستند و ما مشتاقیم ببینیم چه چیزی خلق می‌کنید.

بررسی نیازمندی‌های سخت‌افزاری

الزامات زیر برای توسعه‌دهندگان و کاربرانی که از ویژگی‌های این APIها در Chrome استفاده می‌کنند، وجود دارد. مرورگرهای دیگر ممکن است الزامات عملیاتی متفاوتی داشته باشند.

APIهای تشخیص زبان و مترجم در کروم دسکتاپ کار می‌کنند. این APIها در دستگاه‌های تلفن همراه کار نمی‌کنند. APIهای Prompt، Summarizer، Writer، Rewriter و Proofreader در کروم زمانی کار می‌کنند که شرایط زیر برقرار باشند:

  • سیستم عامل : ویندوز ۱۰ یا ۱۱؛ macOS 13+ (Ventura و بعد از آن)؛ لینوکس؛ یا ChromeOS (از پلتفرم ۱۶۳۸۹.۰.۰ و بعد از آن) در دستگاه‌های Chromebook Plus . Chrome برای اندروید، iOS و ChromeOS در دستگاه‌های غیر Chromebook Plus هنوز توسط APIهایی که از Gemini Nano استفاده می‌کنند پشتیبانی نمی‌شوند.
  • فضای ذخیره‌سازی : حداقل ۲۲ گیگابایت فضای خالی در درایوی که نمایه کروم شما در آن قرار دارد.
  • پردازنده گرافیکی (GPU) یا پردازنده مرکزی (CPU) : مدل‌های توکار می‌توانند با پردازنده گرافیکی (GPU) یا پردازنده مرکزی (CPU) کار کنند.
    • پردازنده گرافیکی (GPU) : دقیقاً بیش از ۴ گیگابایت حافظه ویدیویی (VRAM).
    • پردازنده : ۱۶ گیگابایت رم یا بیشتر و ۴ هسته پردازنده یا بیشتر.
  • شبکه : داده نامحدود یا اتصال بدون محدودیت حجمی.

اندازه دقیق Gemini Nano ممکن است با به‌روزرسانی مدل مرورگر تغییر کند. برای تعیین اندازه فعلی، به chrome://on-device-internals مراجعه کنید.

از API سریع استفاده کنید

API Prompt از مدل Gemini Nano در کروم استفاده می‌کند. اگرچه این API در کروم تعبیه شده است، اما اولین باری که یک منبع از API استفاده می‌کند، مدل به طور جداگانه دانلود می‌شود. قبل از استفاده از این API، سیاست استفاده‌های ممنوعه از هوش مصنوعی مولد گوگل را بپذیرید.

برای تعیین اینکه آیا مدل آماده استفاده است، LanguageModel.availability() را فراخوانی کنید.

const availability = await LanguageModel.availability();

برای شروع دانلود و نمونه‌سازی مدل زبان، فعال‌سازی کاربر را بررسی کنید. سپس، تابع create() را فراخوانی کنید.

const session = await LanguageModel.create({
  monitor(m) {
    m.addEventListener('downloadprogress', (e) => {
      console.log(`Downloaded ${e.loaded * 100}%`);
    });
  },
});

اگر پاسخ به availability() downloading بود، به پیشرفت دانلود گوش دهید و به کاربر اطلاع دهید ، زیرا ممکن است دانلود زمان ببرد.

استفاده روی لوکال هاست

تمام API های هوش مصنوعی داخلی در کروم روی localhost در دسترس هستند. پرچم‌های زیر را روی Enabled تنظیم کنید:

  • chrome://flags/#optimization-guide-on-device-model
  • chrome://flags/#prompt-api-for-gemini-nano-multimodal-input

سپس روی Relaunch یا راه‌اندازی مجدد کروم کلیک کنید. اگر با خطایی مواجه شدید، localhost را عیب‌یابی کنید .

پارامترهای مدل

تابع params() پارامترهای مدل زبان را به شما اطلاع می‌دهد. این شیء دارای فیلدهای زیر است:

await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 128, defaultTemperature: 1, maxTemperature: 2}

ایجاد یک جلسه

زمانی که API مربوط به Prompt بتواند اجرا شود، شما با استفاده از تابع create() یک session ایجاد می‌کنید.

هر جلسه می‌تواند با topK و temperature با استفاده از یک شیء گزینه‌های اختیاری سفارشی‌سازی شود. مقادیر پیش‌فرض برای این پارامترها از LanguageModel.params() برگردانده می‌شوند.

const params = await LanguageModel.params();
// Initializing a new session must either specify both `topK` and
// `temperature` or neither of them.
const slightlyHighTemperatureSession = await LanguageModel.create({
  temperature: Math.max(params.defaultTemperature * 1.2, 2.0),
  topK: params.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. [...]',
    },
  ],
});

محدود کردن پاسخ‌ها با پیشوند

شما می‌توانید علاوه بر نقش‌های قبلی، یک نقش "assistant" اضافه کنید تا پاسخ‌های قبلی مدل را شرح دهید. برای مثال:

const followup = await session.prompt([
  {
    role: "user",
    content: "I'm nervous about my presentation tomorrow"
  },
  {
    role: "assistant",
    content: "Presentations are tough!"
  }
]);

در برخی موارد، به جای درخواست پاسخ جدید، ممکن است بخواهید بخشی از پیام پاسخ "assistant" -role را از قبل پر کنید. این می‌تواند برای هدایت مدل زبان به استفاده از یک قالب پاسخ خاص مفید باشد. برای انجام این کار، prefix: true به پیام "assistant" -role انتهایی اضافه کنید. به عنوان مثال:

const characterSheet = await session.prompt([
  {
    role: 'user',
    content: 'Create a TOML character sheet for a gnome barbarian',
  },
  {
    role: 'assistant',
    content: '```toml\n',
    prefix: true,
  },
]);

ورودی و خروجی مورد انتظار را اضافه کنید

API مربوط به Prompt قابلیت‌های چندوجهی دارد و از چندین زبان پشتیبانی می‌کند. هنگام ایجاد جلسه، روش‌های expectedInputs و خروجی‌های expectedOutputs ) و زبان‌ها را تنظیم کنید.

  • type : روش مورد انتظار.
    • برای expectedInputs ، این می‌تواند text ، image یا audio باشد.
    • برای expectedOutputs ، API مربوط به Prompt فقط text مجاز می‌داند.
  • languages : آرایه‌ای برای تنظیم زبان یا زبان‌های مورد انتظار. API مربوط به Prompt، "en" ، "ja" و "es" را می‌پذیرد. پشتیبانی از زبان‌های بیشتر در حال توسعه است.
    • برای expectedInputs ، زبان اعلان سیستم و یک یا چند زبان اعلان کاربر مورد انتظار را تنظیم کنید.
    • یک یا چند زبان expectedOutputs را تنظیم کنید.
const session = await LanguageModel.create({
  expectedInputs: [
    { type: "text", languages: ["en" /* system prompt */, "ja" /* user prompt */] }
  ],
  expectedOutputs: [
    { type: "text", languages: ["ja"] }
  ]
});

اگر مدل با ورودی یا خروجی پشتیبانی نشده‌ای مواجه شود، ممکن است "NotSupportedError" DOMException دریافت کنید.

قابلیت‌های چندوجهی

با این قابلیت‌ها، شما می‌توانید:

  • به کاربران اجازه دهید پیام‌های صوتی ارسال شده در یک برنامه چت را رونویسی کنند.
  • تصویری که در وب‌سایت شما آپلود شده است را برای استفاده در کپشن یا متن جایگزین توصیف کنید.

برای استفاده از API Prompt با ورودی صدا، به دموی Mediarecorder Audio Prompt و برای استفاده از API Prompt با ورودی تصویر، به دموی Canvas Image Prompt نگاهی بیندازید.

پیام‌ها را اضافه کنید

استنتاج ممکن است کمی زمان ببرد، به خصوص هنگام درخواست با ورودی‌های چندوجهی. ارسال درخواست‌های از پیش تعیین‌شده از قبل برای پر کردن جلسه می‌تواند مفید باشد، بنابراین مدل می‌تواند پردازش را زودتر شروع کند.

اگرچه initialPrompts در ایجاد session مفید هستند، متد append() می‌تواند علاوه بر متدهای prompt() یا promptStreaming() برای ارائه promptهای زمینه‌ای اضافی پس از ایجاد session مورد استفاده قرار گیرد.

برای مثال:

const session = await LanguageModel.create({
  initialPrompts: [
    {
      role: 'system',
      content:
        'You are a skilled analyst who correlates patterns across multiple images.',
    },
  ],
  expectedInputs: [{ type: 'image' }],
});

fileUpload.onchange = async () => {
  await session.append([
    {
      role: 'user',
      content: [
        {
          type: 'text',
          value: `Here's one image. Notes: ${fileNotesInput.value}`,
        },
        { type: 'image', value: fileUpload.files[0] },
      ],
    },
  ]);
};

analyzeButton.onclick = async (e) => {
  analysisResult.textContent = await session.prompt(userQuestionInput.value);
};

وعده‌ای که توسط append() برگردانده می‌شود، پس از اعتبارسنجی، پردازش و افزودن اعلان به جلسه، محقق می‌شود. اگر اعلان نتواند افزوده شود، وعده رد می‌شود.

ارسال یک طرحواره JSON

فیلد responseConstraint را به متد prompt() یا promptStreaming() اضافه کنید تا یک JSON Schema به عنوان مقدار ارسال شود. سپس می‌توانید از خروجی ساختاریافته با Prompt API استفاده کنید.

در مثال زیر، JSON Schema اطمینان حاصل می‌کند که مدل با true یا false پاسخ می‌دهد تا مشخص کند که آیا پیام داده شده در مورد سفالگری است یا خیر.

const session = await LanguageModel.create();

const schema = {
  "type": "boolean"
};

const post = "Mugs and ramen bowls, both a bit smaller than intended, but that
happens with reclaim. Glaze crawled the first time around, but pretty happy
with it after refiring.";

const result = await session.prompt(
  `Is this post about pottery?\n\n${post}`,
  {
    responseConstraint: schema,
  }
);
console.log(JSON.parse(result));
// true

پیاده‌سازی شما می‌تواند شامل یک JSON Schema یا عبارت منظم به عنوان بخشی از پیام ارسالی به مدل باشد. این کار از مقداری از سهمیه ورودی استفاده می‌کند. می‌توانید با ارسال گزینه responseConstraint به session.measureInputUsage() میزان سهمیه ورودی مورد استفاده را اندازه‌گیری کنید.

شما می‌توانید با استفاده از گزینه omitResponseConstraintInput از این رفتار جلوگیری کنید. اگر این کار را انجام می‌دهید، توصیه می‌کنیم که در اعلان، راهنمایی‌هایی را ذکر کنید:

const result = await session.prompt(`
  Summarize this feedback into a rating between 0-5. Only output a JSON
  object { rating }, with a single property whose value is a number:
  The food was delicious, service was excellent, will recommend.
`, { responseConstraint: schema, omitResponseConstraintInput: true });

مدل را مطرح کنید

شما می‌توانید مدل را با استفاده از توابع 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 { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();

if (available !== 'unavailable') {
  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() استفاده کنید که به شما امکان می‌دهد نتایج جزئی را هنگام دریافت از مدل نمایش دهید. تابع promptStreaming() یک ReadableStream برمی‌گرداند.

const { defaultTemperature, maxTemperature, defaultTopK, maxTopK } =
  await LanguageModel.params();

const available = await LanguageModel.availability();
if (available !== 'unavailable') {
  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);
  }
}

دستور دادن را متوقف کنید

هر دو prompt() و promptStreaming() یک پارامتر دوم اختیاری با یک فیلد signal می‌پذیرند که به شما امکان می‌دهد اجرای promptها را متوقف کنید.

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

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

مدیریت جلسه

هر جلسه، زمینه مکالمه را پیگیری می‌کند. تعاملات قبلی برای تعاملات آینده در نظر گرفته می‌شوند تا زمانی که پنجره زمینه جلسه پر شود.

هر جلسه حداکثر تعداد توکن‌هایی را که می‌تواند پردازش کند، دارد. پیشرفت خود را به سمت این محدودیت با موارد زیر بررسی کنید:

console.log(`${session.inputUsage}/${session.inputQuota}`);

درباره مدیریت جلسه بیشتر بدانید.

کلون کردن یک جلسه

برای حفظ منابع، می‌توانید یک جلسه موجود را با تابع clone() کپی کنید. زمینه مکالمه بازنشانی می‌شود، اما اعلان اولیه دست نخورده باقی می‌ماند. تابع clone() یک شیء options اختیاری با یک فیلد signal می‌گیرد که به شما امکان می‌دهد یک AbortSignal برای از بین بردن جلسه کپی شده ارسال کنید.

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

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

خاتمه دادن به یک جلسه

اگر دیگر به session نیاز ندارید، تابع destroy() را برای آزاد کردن منابع فراخوانی کنید. وقتی یک session از بین می‌رود، دیگر نمی‌توان از آن استفاده کرد و هرگونه اجرای در حال انجام لغو می‌شود. اگر قصد دارید مرتباً مدل را فراخوانی کنید، ممکن است بخواهید session را نگه دارید، زیرا ایجاد یک session می‌تواند مدتی طول بکشد.

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 choosing between a t-shirt
  and a polo."
);

دموها

ما چندین دمو برای بررسی موارد استفاده‌ی فراوان Prompt API ساخته‌ایم. دموهای زیر برنامه‌های وب هستند:

برای آزمایش API Prompt در افزونه‌های کروم، افزونه‌ی آزمایشی را نصب کنید. کد منبع افزونه در گیت‌هاب موجود است.

استراتژی عملکرد

رابط برنامه‌نویسی کاربردی Prompt برای وب هنوز در حال توسعه است. در حین ساخت این رابط برنامه‌نویسی کاربردی، برای عملکرد بهینه به بهترین شیوه‌های ما در مدیریت نشست مراجعه کنید.

سیاست دسترسی، iframeها و Web Workerها

به طور پیش‌فرض، API مربوط به Prompt فقط برای پنجره‌های سطح بالا و iframe های هم‌مبنای آنها در دسترس است. دسترسی به API را می‌توان با استفاده از ویژگی allow="" در Permission Policy به iframe های چندمبنا واگذار کرد:

<!--
  The hosting site at https://main.example.com can grant a cross-origin iframe
  at https://cross-origin.example.com/ access to the Prompt API by
  setting the `allow="language-model"` attribute.
-->
<iframe src="https://cross-origin.example.com/" allow="language-model"></iframe>

به دلیل پیچیدگی ایجاد یک سند مسئول برای هر worker به منظور بررسی وضعیت سیاست مجوزها، API Prompt در حال حاضر در Web Workers در دسترس نیست.

مشارکت کنید و نظرات خود را به اشتراک بگذارید

نظرات شما می‌تواند مستقیماً بر نحوه ساخت و پیاده‌سازی نسخه‌های بعدی این API و تمام APIهای هوش مصنوعی داخلی ما تأثیر بگذارد.