公開日: 2025 年 5 月 20 日
商品の解説 | ウェブ | 拡張機能 | Chrome ステータス | インテント |
---|---|---|---|---|
GitHub | 表示 | テストの目的 |
Prompt API を使用すると、ブラウザで Gemini Nano に自然言語リクエストを送信できます。
Prompt API の使用方法は多岐にわたります。ウェブ アプリケーションまたはウェブサイトでは、次のものを作成できます。
- AI を活用した検索: ウェブページの内容に基づいて質問に回答します。
- パーソナライズされたニュース フィード: 記事をカテゴリで動的に分類し、ユーザーがそのコンテンツをフィルタリングできるようにするフィードを構築します。
これらは可能性のほんの一例です。皆様がどのようなものを作成されるか、楽しみにしております。
ハードウェア要件を確認する
言語検出 API と翻訳 API は、パソコンでは Chrome でのみ動作します。
Prompt API、Summarizer API、Writer API、Rewriter API は、次の条件を満たす場合に Chrome で動作します。
- オペレーティング システム: Windows 10 または 11、macOS 13 以降(Ventura 以降)、Linux。Gemini Nano を基盤とする API は、Android 版 Chrome、iOS 版 Chrome、ChromeOS 版 Chrome ではまだサポートされていません。
- ストレージ: 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
: デフォルトの top-K 値(デフォルト:3
)。maxTopK
: 最大上位 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 の形状に関するフィードバックは、既存の Issue にコメントするか、Prompt API GitHub リポジトリで新しい Issue を開いて共有してください。
- Web Incubator Community Group に参加して、標準化の取り組みに参加します。