公開日: 2024 年 11 月 11 日、最終更新日: 2025 年 5 月 20 日
商品の解説 | ウェブ | 拡張機能 | Chrome ステータス | インテント |
---|---|---|---|---|
GitHub | 表示 | テストの目的 |
Prompt API を使用すると、ブラウザで Gemini Nano に自然言語リクエストを送信できます。
Chrome 拡張機能で Prompt API を使用する方法はたくさんあります。次に例を示します。
- カレンダーの予定を即座に作成する。ウェブページからイベントの詳細を自動的に抽出する Chrome 拡張機能を開発します。これにより、ユーザーは数ステップでカレンダーの予定を作成できます。
- シームレスな連絡先の抽出。ウェブサイトから連絡先情報を抽出する拡張機能を作成して、ユーザーがビジネスに連絡したり、連絡先リストに詳細情報を追加したりしやすくします。
- 動的コンテンツ フィルタリング。ニュース記事を分析し、ユーザー定義のトピックに基づいてコンテンツを自動的にぼかしたり非表示にしたりする Chrome 拡張機能を作成します。
これらは可能性のほんの一例です。皆様がどのようなものを作成されるか、楽しみにしております。
ハードウェア要件を確認する
Chrome でこれらの API を使用して機能を操作するデベロッパーとユーザーには、次の要件があります。他のブラウザでは動作要件が異なる場合があります。
言語検出 API と翻訳 API は、パソコン版 Chrome で動作します。これらの API はモバイル デバイスでは動作しません。Prompt API、Summarizer API、Writer API、Rewriter API は、次の条件を満たす場合に Chrome で動作します。
- オペレーティング システム: Windows 10 または 11、macOS 13 以降(Ventura 以降)、Linux。Gemini Nano を使用する API は、Chrome for Android、iOS、ChromeOS ではまだサポートされていません。
- ストレージ: Chrome プロファイルを含むボリュームに 22 GB 以上の空き容量が必要です。
- GPU: 4 GB を超える VRAM。
- ネットワーク: 無制限のデータ通信または従量制でない接続。
Gemini Nano の正確なサイズは、ブラウザがモデルを更新するにつれて変化する可能性があります。現在のサイズを確認するには、chrome://on-device-internals
にアクセスして [モデルのステータス] に移動します。リストに表示された [ファイルパス] を開いて、モデルのサイズを確認します。
拡張機能で Prompt API を使用する
この API を使用する前に、Google の生成 AI の使用禁止に関するポリシーを確認してください。
LanguageModel
Namespace では、次の 2 つの拡張関数を使用できます。
availability()
を使用して、モデルの機能と利用可能かどうかを確認します。create()
を使用して言語モデル セッションを開始します。
モデルのダウンロード
Prompt API は Chrome で Gemini Nano モデルを使用します。API は Chrome に組み込まれていますが、拡張機能が API を初めて使用するときに、モデルは個別にダウンロードされます。
モデルを使用する準備ができているかどうかを判断するには、非同期 LanguageModel.availability()
関数を呼び出します。次のいずれかのレスポンスが返されます。
"unavailable"
は、実装がリクエストされたオプションをサポートしていないか、言語モデルのプロンプトをまったくサポートしていないことを意味します。"downloadable"
は、実装がリクエストされたオプションをサポートしているものの、それらのオプションを使用してセッションを作成する前に、何か(言語モデル自体やファインチューニングなど)をダウンロードする必要があることを意味します。"downloading"
は、実装がリクエストされたオプションをサポートしているが、それらのオプションを使用してセッションを作成する前に、進行中のダウンロード オペレーションを完了する必要があることを意味します。"available"
は、実装が新しいダウンロードを必要とせずにリクエストされたオプションをサポートしていることを意味します。
モデルのダウンロードをトリガーして言語モデル セッションを作成するには、非同期の LanguageModel.availability()
関数を呼び出します。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."
);
デモ
Chrome 拡張機能で Prompt API をテストするには、デモ拡張機能をインストールします。拡張機能のソースコードは GitHub で入手できます。
参加してフィードバックを共有する
皆様からのご意見は、この API の将来のバージョンと、すべての組み込み AI API の構築と実装に直接影響します。
- Chrome の実装に関するフィードバックについては、バグレポートまたは機能リクエストを送信してください。
- API の形状に関するフィードバックは、既存の Issue にコメントするか、Prompt API GitHub リポジトリで新しい Issue を開いて共有してください。
- GitHub で Prompt API のサンプル拡張機能をダウンロードします。
- Web Incubator Community Group に参加して、標準化の取り組みに参加します。