公開日: 2025 年 5 月 20 日
商品の解説 | ウェブ | 拡張機能 | Chrome のステータス | インテント |
---|---|---|---|---|
GitHub | 表示 | テストの目的 |
Prompt API を使用すると、ブラウザで Gemini Nano に自然言語リクエストを送信できます。
Prompt API を使用する方法は数多くあります。ウェブ アプリケーションまたはウェブサイトでは、次のことを作成できます。
- AI を活用した検索: ウェブページのコンテンツに基づいて質問に回答します。
- パーソナライズされたニュース フィード: 記事をカテゴリで動的に分類し、ユーザーがそのコンテンツをフィルタできるようにするフィードを作成します。
これらはほんの一例です。皆様がどのようなものを作成されるか、楽しみにしております。
ハードウェア要件を確認する
Language Detector API と Translator API は、パソコンの Chrome でのみ動作します。
Prompt API、Summarizer API、Writer API、Rewriter API は、次の条件を満たしている場合に Chrome で動作します。
- オペレーティング システム: Windows 10 または 11、macOS 13 以降(Ventura 以降)、Linux。Android、iOS、ChromeOS 版 Chrome は、Gemini Nano を基盤とする API ではまだサポートされていません。
- ストレージ: Chrome プロファイルを含むボリュームに 22 GB 以上の空き容量。
- GPU: 4 GB を超える VRAM。
- ネットワーク: データ通信無制限または無制限接続。
これらの要件は、開発プロセスと、作成した機能を利用するユーザーに存在します。
Prompt API を使用する
この API を使用する前に、Google の生成 AI の使用禁止に関するポリシーをご確認ください。
LanguageModel
名前空間で使用できる関数は次の 2 つです。
availability()
: モデルの機能と利用可能かどうかを確認します。create()
: 言語モデル セッションを開始します。
モデルのダウンロード
Prompt API は、Chrome の Gemini Nano モデルを使用します。API は Chrome に組み込まれていますが、オリジンが API を初めて使用するときにモデルが個別にダウンロードされます。
モデルが使用可能かどうかを確認するには、非同期の LanguageModel.availability()
関数を呼び出します。次のいずれかのレスポンスが返されます。
"unavailable"
は、実装がリクエストされたオプションをサポートしていないか、言語モデルのプロンプトをまったくサポートしていないことを意味します。"downloadable"
は、リクエストされたオプションが実装でサポートされていることを意味します。ただし、これらのオプションを使用してセッションを作成するには、何か(言語モデル自体やファインチューニングなど)をダウンロードする必要があります。"downloading"
は、実装がリクエストされたオプションをサポートしていることを意味します。ただし、これらのオプションを使用してセッションを作成するには、進行中のダウンロード オペレーションを完了する必要があります。"available"
は、新しいダウンロードを必要とせずに、リクエストされたオプションを実装がサポートしていることを意味します。
モデルのダウンロードをトリガーして言語モデル セッションを作成するには、非同期の LanguageModel.create()
関数を呼び出します。availability()
へのレスポンスが 'downloadable'
の場合、ダウンロードの進行状況をリッスンすることをおすすめします。これにより、ダウンロードに時間がかかる場合にユーザーに通知できます。
const session = await LanguageModel.create({
monitor(m) {
m.addEventListener("downloadprogress", (e) => {
console.log(`Downloaded ${e.loaded * 100}%`);
});
},
});
モデルの機能
params()
関数は、言語モデルのパラメータに関する情報を提供します。このオブジェクトには次のフィールドがあります。
defaultTopK
: デフォルトの トップ K 値(デフォルト:3
)。maxTopK
: 最大 Top-K 値(8
)。defaultTemperature
: デフォルトの温度(1.0
)。温度値は0.0
~2.0
の範囲内にする必要があります。maxTemperature
: 最大温度。
await LanguageModel.params();
// {defaultTopK: 3, maxTopK: 8, defaultTemperature: 1, maxTemperature: 2}
セッションを作成する
Prompt API を実行できるようになったら、create()
関数を使用してセッションを作成します。モデルにプロンプトを表示するには、prompt()
関数または promptStreaming()
関数を使用します。
セッションをカスタマイズする
各セッションは、オプション オブジェクトを使用して 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. [...]' }
]
});
セッションの制限
特定の言語モデル セッションで処理できるトークンの最大数があります。使用量と上限までの進捗状況を確認するには、セッション オブジェクトの次のプロパティを使用します。
console.log(`${session.inputUsage}/${session.inputQuota}`);
セッションの永続性
各セッションは、会話のコンテキストを追跡します。セッションのコンテキスト ウィンドウがいっぱいになるまで、以前のインタラクションは今後のインタラクションに考慮されます。
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 {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
フィールドを含む 2 番目のパラメータ(省略可)を指定できます。これにより、プロンプトの実行を停止できます。
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 138 Canary からの音声入力と画像入力をサポートしています。API はテキスト出力を返します。
これらの機能により、次のことができます。
- ユーザーがチャット アプリで送信された音声メッセージを文字起こしできるようにします。
- ウェブサイトにアップロードした画像を説明して、キャプションや代替テキストに使用します。
const session = await LanguageModel.create({
// { type: "text" } is not necessary to include explicitly, unless
// you also want to include expected input languages for text.
expectedInputs: [
{ type: "audio" },
{ type: "image" }
]
});
const referenceImage = await (await fetch("/reference-image.jpeg")).blob();
const userDrawnImage = document.querySelector("canvas");
const response1 = await session.prompt([{
role: "user",
content: [
{ type: "text", value: "Give a helpful artistic critique of how well the second image matches the first:" },
{ type: "image", value: referenceImage },
{ type: "image", value: userDrawnImage }
]
}]);
console.log(response1);
const audioBlob = await captureMicrophoneInput({ seconds: 10 });
const response2 = await session.prompt([{
role: "user",
content: [
{ type: "text", value: "My response to your critique:" },
{ type: "audio", value: audioBlob }
]
}]);
マルチモーダル デモ
音声入力で Prompt API を使用する場合は Mediarecorder Audio Prompt デモを、画像入力で Prompt API を使用する場合は Canvas Image Prompt デモをご覧ください。
パフォーマンス戦略
ウェブ向けの Prompt API はまだ開発中です。この API の構築中は、最適なパフォーマンスを得るために、セッション管理に関するベスト プラクティスをご覧ください。
フィードバック
お寄せいただいたフィードバックは、この API の今後の開発と Gemini Nano の改善に役立てさせていただきます。専用のタスク API(音声文字変換や画像の説明用の API など)が作成される可能性もあります。これにより、お客様のニーズとユーザーのニーズを満たすことができます。
参加してフィードバックを共有する
皆様からのご意見は、この API とすべての組み込み AI API の今後のバージョンの構築と実装に直接影響します。
- 早期プレビュー プログラムに参加する。
- Chrome の実装に関するフィードバックについては、バグの報告または機能リクエストを送信してください。
- API のシェイプに関するフィードバックは、既存の問題にコメントするか、Prompt API GitHub リポジトリで新しい問題を報告してください。
- Web Incubator コミュニティ グループに参加して、標準化の取り組みに参加してください。