Опубликовано: 11 ноября 2024 г., Последнее обновление: 20 мая 2025 г.
Объяснитель | Веб | Расширения | Статус Хрома | Намерение |
---|---|---|---|---|
GitHub | Вид | Намерение экспериментировать |
С помощью API Prompt вы можете отправлять запросы на естественном языке в Gemini Nano через браузер.
Существует множество способов использования Prompt API в расширениях Chrome. Например:
- Мгновенные события календаря . Разработайте расширение Chrome, которое автоматически извлекает сведения о событиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
- Бесперебойное извлечение контактов . Создайте расширение, которое извлекает контактную информацию с веб-сайтов, упрощая для пользователей возможность связаться с компанией или добавить данные в свой список контактов.
- Динамическая фильтрация контента . Создайте расширение Chrome, которое анализирует новостные статьи и автоматически размывает или скрывает контент на основе заданных пользователем тем.
Это всего лишь несколько вариантов, но нам не терпится увидеть, что вы создадите.
Используйте Prompt API в расширениях
В пространстве имен LanguageModel
вам доступны две функции расширения:
-
availability()
для проверки возможностей модели и ее доступности. -
create()
для запуска сеанса языковой модели.
Модель скачать
Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель загружается отдельно при первом использовании API расширением.
Чтобы определить, готова ли модель к использованию, вызовите асинхронную функцию 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()
также информирует вас о возможностях языковой модели. Помимо available
, объект также имеет следующие поля:
-
defaultTopK
: значение top-K по умолчанию (по умолчанию:3
). -
maxTopK
: максимальное значение top-K (8
). -
defaultTemperature
: Температура по умолчанию (1.0
). Значение температуры должно быть в диапазоне от0.0
до2.0
.
await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}
Создать сессию
Как только API Prompt может быть запущен, вы создаете сеанс с помощью функции create()
. Вы можете вызвать модель с помощью функции prompt()
или promptStreaming()
.
Настройте свой сеанс
Каждый сеанс может быть настроен с помощью topK
и temperature
с использованием необязательного объекта параметров. Значения по умолчанию для этих параметров возвращаются из 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()
. Контекст разговора сбрасывается, но начальный запрос остается нетронутым. Функция 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."
. Это не предполагаемое поведение. Мы намерены согласовать его с другими потоковыми 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.
Участвуйте и делитесь отзывами
Ваш вклад может напрямую повлиять на то, как мы создаем и реализуем будущие версии этого API, а также всех встроенных API ИИ.
- Чтобы оставить отзыв о реализации Chrome, отправьте отчет об ошибке или запрос на добавление функции .
- Поделитесь своим отзывом о форме API, прокомментировав существующую проблему или открыв новую в репозитории Prompt API GitHub .
- Загрузите пример расширения Prompt API на GitHub .
- Примите участие в работе над стандартами, присоединившись к группе сообщества Web Incubator .
Опубликовано: 11 ноября 2024 г., Последнее обновление: 20 мая 2025 г.
Объяснитель | Веб | Расширения | Статус Хрома | Намерение |
---|---|---|---|---|
GitHub | Вид | Намерение экспериментировать |
С помощью API Prompt вы можете отправлять запросы на естественном языке в Gemini Nano через браузер.
Существует множество способов использования Prompt API в расширениях Chrome. Например:
- Мгновенные события календаря . Разработайте расширение Chrome, которое автоматически извлекает сведения о событиях с веб-страниц, чтобы пользователи могли создавать записи календаря всего за несколько шагов.
- Бесперебойное извлечение контактов . Создайте расширение, которое извлекает контактную информацию с веб-сайтов, упрощая для пользователей возможность связаться с компанией или добавить данные в свой список контактов.
- Динамическая фильтрация контента . Создайте расширение Chrome, которое анализирует новостные статьи и автоматически размывает или скрывает контент на основе заданных пользователем тем.
Это всего лишь несколько вариантов, но нам не терпится увидеть, что вы создадите.
Используйте Prompt API в расширениях
В пространстве имен LanguageModel
вам доступны две функции расширения:
-
availability()
для проверки возможностей модели и ее доступности. -
create()
для запуска сеанса языковой модели.
Модель скачать
Prompt API использует модель Gemini Nano в Chrome. Хотя API встроен в Chrome, модель загружается отдельно при первом использовании API расширением.
Чтобы определить, готова ли модель к использованию, вызовите асинхронную функцию 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()
также информирует вас о возможностях языковой модели. Помимо available
, объект также имеет следующие поля:
-
defaultTopK
: значение top-K по умолчанию (по умолчанию:3
). -
maxTopK
: максимальное значение top-K (8
). -
defaultTemperature
: Температура по умолчанию (1.0
). Значение температуры должно быть в диапазоне от0.0
до2.0
.
await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}
Создать сессию
Как только API Prompt может быть запущен, вы создаете сеанс с помощью функции create()
. Вы можете вызвать модель с помощью функции prompt()
или promptStreaming()
.
Настройте свой сеанс
Каждый сеанс может быть настроен с помощью topK
и temperature
с использованием необязательного объекта параметров. Значения по умолчанию для этих параметров возвращаются из 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()
. Контекст разговора сбрасывается, но начальный запрос остается нетронутым. Функция 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."
. Это не предполагаемое поведение. Мы намерены согласовать его с другими потоковыми 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.
Участвуйте и делитесь отзывами
Ваш вклад может напрямую повлиять на то, как мы создаем и реализуем будущие версии этого API, а также всех встроенных API ИИ.
- Чтобы оставить отзыв о реализации Chrome, отправьте отчет об ошибке или запрос на добавление функции .
- Поделитесь своим отзывом о форме API, прокомментировав существующую проблему или открыв новую в репозитории Prompt API GitHub .
- Загрузите пример расширения Prompt API на GitHub .
- Примите участие в работе над стандартами, присоединившись к группе сообщества Web Incubator .