Prompt API в расширениях Chrome, Prompt API в расширениях Chrome

Опубликовано: 11 ноября 2024 г.

Prompt API для расширений теперь доступен в пробной версии Origin, поэтому вы можете создавать расширения Chrome, использующие Gemini Nano , нашу самую эффективную языковую модель, в браузере.

Существует множество вариантов использования Prompt API с расширениями Chrome. Вот несколько примеров:

  • Мгновенные события календаря. Разработайте расширение Chrome, которое автоматически извлекает сведения о событиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
  • Бесшовное извлечение контактов. Создайте расширение, которое извлекает контактную информацию с веб-сайтов, чтобы пользователям было проще связаться с компанией или добавить информацию в свой список контактов.
  • Динамическая фильтрация контента. Создайте расширение Chrome, которое анализирует новостные статьи и автоматически размывает или скрывает контент на основе определенных пользователем тем.

Это всего лишь несколько возможностей, но мы рады видеть, что вы создаете.

Доступность

  • Присоединяйтесь к пробной версии Prompt API origin , работающей в Chrome 131–136, чтобы создавать расширения с помощью этого API. Если вы новичок в пробных версиях Origin , это ограниченные по времени программы, открытые для всех разработчиков и предлагающие ранний доступ к экспериментальным функциям платформы. Разработчики могут тестировать, собирать отзывы пользователей и работать над будущим запуском.
    • Хотя могут существовать ограничения на использование, вы можете интегрировать эти функции для тестирования в реальном времени и сбора отзывов пользователей. Цель — информировать о будущих итерациях этого API, поскольку мы работаем над его более широкой доступностью.
  • Присоединяйтесь к программе ранней предварительной версии, чтобы заранее ознакомиться с новыми встроенными API-интерфейсами искусственного интеллекта и получить доступ к обсуждению в нашем списке рассылки.

Примите участие в испытании происхождения

Чтобы использовать Prompt API в расширениях Chrome, добавьте разрешение "aiLanguageModelOriginTrial" в файл manifest.json , как указано в следующем фрагменте, а также любые другие разрешения, которые могут потребоваться вашему расширению.

Чтобы зарегистрировать свое расширение для пробной версии Origin, используйте URL-адрес chrome-extension://YOUR_EXTENSION_ID в качестве веб-источника . Например, chrome-extension://ljjhjaakmncibonnjpaoglbhcjeolhkk .

Регистрация пробной версии Chrome Origin

Идентификатор расширения создается динамически. После назначения вы можете заставить идентификатор оставаться стабильным, добавив свойство key в манифест.

После того как вы подписались на исходную пробную версию, вы получаете сгенерированный токен, который необходимо передать в массиве в качестве значения поля trial_tokens в манифесте.

{
  "manifest_version": 3,
  "name": "YOUR_EXTENSION_NAME",
  "permissions": ["aiLanguageModelOriginTrial"],
  "trial_tokens": ["GENERATED_TOKEN"],
}

Добавить поддержку локального хоста

Чтобы получить доступ к Prompt API на localhost во время пробной версии Origin, вам необходимо обновить Chrome до последней версии. Затем выполните следующие действия:

  1. Откройте Chrome на одной из этих платформ: Windows, Mac или Linux.
  2. Перейдите на chrome://flags/#optimization-guide-on-device-model .
  3. Выберите «Включено BypassPerfRequirement» .
    • При этом проверки производительности пропускаются, что может помешать вам загрузить Gemini Nano на ваше устройство.
  4. Нажмите «Перезапустить» или перезапустите Chrome.

Используйте API подсказок

После того как вы запросили разрешение на использование Prompt API, вы можете создать свое расширение. В пространстве имен chrome.aiOriginTrial.languageModel доступны две новые функции расширения:

  • capabilities() , чтобы проверить, на что способна модель и доступна ли она.
  • create() чтобы начать сеанс языковой модели.

Загрузка модели

Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель загружается отдельно, когда расширение впервые использует API.

Чтобы определить, готова ли модель к использованию, вызовите асинхронную функцию chrome.aiOriginTrial.languageModel.capabilities() . Он возвращает объект AILanguageModelCapabilities с available полем, которое может принимать три возможных значения:

  • 'no' : текущий браузер поддерживает Prompt API, но в данный момент его нельзя использовать. Это может произойти по ряду причин, например, из-за недостаточного свободного места на диске для загрузки модели.
  • 'readily' : текущий браузер поддерживает Prompt API, и его можно использовать сразу.
  • 'after-download' : текущий браузер поддерживает Prompt API, но сначала необходимо загрузить модель.

Чтобы запустить загрузку модели и создать сеанс языковой модели, вызовите асинхронную функцию chrome.aiOriginTrial.languageModel.create() . Если ответом на capabilities() был 'after-download' , лучше всего следить за ходом загрузки. Таким образом, вы можете сообщить пользователю, если загрузка займет некоторое время.

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

Возможности модели

Функция capabilities() также информирует вас о возможностях языковой модели. Помимо available , результирующий объект AILanguageModelCapabilities также имеет следующие поля:

await chrome.aiOriginTrial.languageModel.capabilities();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}

Создать сеанс

Убедившись, что Prompt API может работать, вы создаете сеанс с помощью функции create() , которая затем позволяет вам запрашивать модель с помощью функции prompt() или promptStreaming() .

Параметры сеанса

Каждый сеанс можно настроить с помощью topK и temperature используя дополнительный объект параметров. Значения по умолчанию для этих параметров возвращаются из chrome.aiOriginTrial.languageModel.capabilities() .

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

Необязательный объект опций функции create() также принимает поле signal , которое позволяет передать AbortSignal для уничтожения сеанса.

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

const session = await chrome.aiOriginTrial.languageModel.create({
  signal: controller.signal,
})
Системные подсказки

С помощью системных подсказок вы можете придать языковой модели некоторый контекст.

const session = await chrome.aiOriginTrial.languageModel.create({
  systemPrompt: 'You are a helpful and friendly assistant.',
});
await session.prompt('What is the capital of Italy?');
// 'The capital of Italy is Rome.'

Начальные подсказки

С помощью первоначальных запросов вы можете предоставить языковой модели контекст предыдущих взаимодействий, например, чтобы позволить пользователю возобновить сохраненный сеанс после перезапуска браузера.

const session = await chrome.aiOriginTrial.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 chrome.aiOriginTrial.languageModel.create({
  systemPrompt: '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() . Контекст разговора сбрасывается, но начальное приглашение или системные приглашения останутся нетронутыми. Функция 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 chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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 chrome.aiOriginTrial.languageModel.capabilities();

if (available !== 'no') {
  const session = await chrome.aiOriginTrial.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." . Это не предполагаемое поведение. Мы намерены согласовать его с другими API потоковой передачи на платформе, где фрагменты представляют собой последовательные части одного длинного потока. Это означает, что вывод будет такой последовательностью, как "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

Участвуйте и делитесь отзывами

Начните тестировать Prompt API прямо сейчас в своих расширениях Chrome, присоединившись к пробной версии Origin и поделитесь своими отзывами. Ваш вклад может напрямую повлиять на то, как мы создаем и реализуем будущие версии этого API, а также всех встроенных API-интерфейсов искусственного интеллекта.