Prompt APIとは?

Prompt APIは、W3C Web Machine Learning Community Groupによる実験的なウェブプラットフォーム提案で、ブラウザが提供する大規模言語モデルをwindow.LanguageModelインターフェースを通じてJavaScriptに公開します。ページはLanguageModel.create()セッションを作成し、オプションでシステムプロンプトで設定してから、prompt()またはpromptStreaming()を呼び出して応答を取得します。

ホストされたLLM APIを呼び出すのとは異なり、モデルはユーザーのデバイス上で実行されます。つまり、入力はマシンから出ることはなく、モデルがキャッシュされるとページはオフラインで動作し、リクエストごとのコストはありません。Chromeでは基礎となるモデルはGemini Nanoですが、APIは意図的にモデルに依存しないため、他のブラウザは異なる実装をプラグインできます。

セッションはステートフルです。コンテキストウィンドウ内の会話履歴をトークンで測定して追跡します。ウィンドウが満杯になると、最も古い非システムメッセージが自動的に削除され(contextoverflowイベントが発火)、session.contextUsagesession.contextWindowをいつでも検査して、残りのスペースを確認できます。

ツールの説明

このプレイグラウンドはwindow.LanguageModelに接続されたインタラクティブなチャットサーフェースです。システムプロンプトを設定し、メッセージを送信し、モデルがトークンをリアルタイムでストリーミングするのを見ることができます。プログレスバーはモデルの可用性とダウンロード進捗を表示し、トークン使用量バーはセッションのコンテキストウィンドウがどのくらい消費されているかを報告します。

セッションは最初の送信時に遅延作成され、システムプロンプトを変更するまでメッセージ間で再利用されます。その時点で破棄され、新しい指示で新しいセッションが作成されます。

機能

  • ストリーミング応答promptStreaming()を使用するため、トークンは生成されるとチャットに表示されます。
  • システムプロンプトエディタ — すべての応答を条件付ける永続的なロールまたは動作を定義します。
  • 停止ボタンAbortControllerを使用してセッションを破棄せずに進行中のプロンプトを中止します。
  • ライブコンテキスト使用量contextUsagecontextWindowに対して視覚化し、会話がオーバーフローしようとしているときを確認できます。
  • 可用性とダウンロード進捗 — モデルがフェッチされている間、availability()状態とdownloadprogressイベントを表示します。

ユースケース

  • ローカルでプロンプトを試す — クラウドAPIの料金を支払わずにシステムプロンプトとフューショットパターンを反復処理します。
  • オンデバイスAI実現可能性のテスト — Prompt APIが利用可能であることを確認し、コンテキストウィンドウの大きさを確認し、ハードウェア上の応答速度をベンチマークします。
  • プライバシーに配慮したドラフト作成 — サードパーティサーバーに送信すべきではないテキストをブレーンストーミングまたは言い換えます。

要件

  • Prompt APIを実装するブラウザ。Chrome 138以上はこれを実験的に公開しています。古いバージョンでは、chrome://flags/#prompt-api-for-gemini-nanoを介して有効にし、オンデバイスモデルをダウンロードする必要があります。
  • セキュアコンテキスト(HTTPSまたはlocalhost)。
  • モデルのハードウェア要件を満たすデバイス(十分なディスク容量、RAM、およびサポートされているGPU/CPU)。サポートされていないデバイスでは、availability()unavailableを返します。
  • モデルをダウンロードするための初期帯域幅。その後のセッションはキャッシュされたモデルを再利用します。

動作方法

  1. マウント時に、ツールはtypeof window.LanguageModelをチェックします。存在しない場合、警告がチャット入力に置き換わります。
  2. LanguageModel.availability()availabledownloadabledownloading、またはunavailableのいずれかを報告します。結果はプログレスバーに表示されます。
  3. 初めて送信を押すと、ツールはdownloadprogressイベントをUIにストリーミングするmonitorLanguageModel.create()を呼び出します。システムプロンプトが設定されている場合、initialPrompts: [{ role: "system", content: ... }]を介して渡されます。
  4. ユーザーメッセージはsession.promptStreaming(text, { signal })を通じて送信されます。返されたReadableStream<string>はチャンクごとに消費され、アシスタントメッセージに追加されます。
  5. 各応答の後、session.contextUsagesession.contextWindowが読み取られ、トークン使用量バーに反映されます。
  6. 停止を押すと、controller.abort()が呼び出され、進行中のストリームがAbortErrorで拒否され、次のプロンプト用にセッションが生きたままになります。
  7. システムプロンプトを編集するとキャッシュされたセッションが無効になります。既存のセッションはdestroy()され、次の送信は更新された指示で新しいセッションを作成します。

オプションの説明

  • システムプロンプト — 最初のsystemロールメッセージとして渡される自由形式の指示。すべての後続のターンを条件付けます。空白のままにするとシステムメッセージなしでセッションが作成されます。
  • 送信 / 停止送信は入力をuserメッセージとして送信します。停止は以前のメッセージを削除せずにストリーミング応答を中止します。
  • トークン使用量 — 現在のセッションの使用済み / 合計トークン。使用済み合計に近づくと、次のプロンプトで古いユーザー/アシスタントペアが削除されます。
  • モデルステータスavailability()downloadprogressの組み合わせ読み取り。モデルがダウンロード中は、バーがアニメーション化され、パーセンテージが表示されます。

制限事項

  • Prompt APIは実験的です。メソッド名、オプション(例:inputUsagecontextUsage)、およびイベントセマンティクスはChromeリリース間で変更される可能性があります。
  • 出力品質、事実性、および指示追従は、ブラウザが提供するモデルに完全に依存し、保証されません。
  • コンテキストウィンドウはホストされたLLMと比べて小さいです。長い会話はオーバーフローし、最初のターンが静かに削除されます。
  • APIはウェブワーカーに公開されておらず、クロスオリジンiframeで権限ポリシー(language-model)委任が必要な場合があります。
  • このツールは意図的にtemperaturetopK、ツール使用、マルチモーダル入力、構造化出力(responseConstraint)、またはセッションクローニングを公開しません。これらは仕様の一部ですが、プレイグラウンドから除外されて、プレーンチャットに焦点を当てています。

FAQ

APIがサポートされていないと表示されるのはなぜですか? window.LanguageModelはブラウザで未定義です。デスクトップで最新のChromeを試し、必要に応じてPrompt APIフラグを有効にして、chrome://componentsを介してオンデバイスモデルのダウンロードを待ちます。

最初の応答が遅いのはなぜですか? 最初の呼び出しはモデルダウンロード(プログレスバーを監視)とセッション作成ステップをトリガーする可能性があります。後のプロンプトは同じセッションを再利用し、ほぼ即座にストリーミングを開始します。

プロンプトはデバイスから出ますか? いいえ。モデルはローカルで実行されます。テキストはこのツールによってサーバーに送信されません。

コンテキストが満杯になるとどうなりますか? セッションはcontextoverflowイベントを発火させ、最も古い非システムターンを削除してスペースを作ります。システムプロンプトは保持されます。

会話の途中でシステムプロンプトを変更すると、応答スタイルがクリアされたのはなぜですか? システムプロンプトを編集すると、現在のセッションが破棄され、次の送信で新しいセッションが作成されます。新しいセッションは以前のターンのメモリを持ちません。