公開日: 2024 年 11 月 11 日、最終更新日: 2025 年 5 月 20 日
商品の解説 | ウェブ | 拡張機能 | Chrome のステータス | インテント |
---|---|---|---|---|
GitHub | 表示 | テストの目的 |
Prompt API を使用すると、ブラウザで Gemini Nano に自然言語リクエストを送信できます。
Chrome 拡張機能で Prompt API を使用する方法は多数あります。次に例を示します。
- 即時カレンダーの予定。ウェブページから予定の詳細を自動的に抽出する Chrome 拡張機能を開発して、ユーザーが数ステップでカレンダーの予定を作成できるようにします。
- シームレスな連絡先の抽出。ウェブサイトから連絡先情報を抽出する拡張機能を作成して、ユーザーがビジネスに連絡したり、連絡先リストに詳細情報を追加したりしやすくします。
- 動的コンテンツ フィルタリング。ニュース記事を分析し、ユーザー定義のトピックに基づいてコンテンツを自動的にぼかしたり非表示にしたりできる Chrome 拡張機能を作成します。
これらはほんの一例ですが、皆様がどのようなものを作成されるか楽しみにしております。
拡張機能で Prompt API を使用する
LanguageModel
Namespace で使用できる拡張関数は次の 2 つです。
availability()
: モデルの機能と利用可能かどうかを確認します。create()
: 言語モデル セッションを開始します。
モデルのダウンロード
Prompt API は、Chrome で Gemini Nano モデルを使用します。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
: デフォルトの トップ K 値(デフォルト:3
)。maxTopK
: 最大 Top-K 値(8
)。defaultTemperature
: デフォルトの温度(1.0
)。温度値は0.0
~2.0
の範囲内にする必要があります。
await LanguageModel.availability();
// {available: 'readily', defaultTopK: 3, maxTopK: 8, defaultTemperature: 1}
セッションを作成する
Prompt API を実行できるようになったら、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."
。これは想定された動作ではありません。チャンクは 1 つの長いストリームの連続した部分であるため、プラットフォーム上の他のストリーミング 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
フィールドを含む 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 のシェイプに関するフィードバックは、既存の問題にコメントするか、Prompt API GitHub リポジトリで新しい問題を報告してください。
- GitHub で Prompt API サンプル拡張機能をダウンロードします。
- Web Incubator コミュニティ グループに参加して、標準化の取り組みに参加してください。