WebGPUで動くブラウザ内ローカルAI「Gemma Gem」

APIキーを渡すという「無防備な儀式」の終焉

新しいAI系のブラウザ拡張機能を試すたび、設定画面でOpenAIやAnthropicのAPIキーを入力させられる。私たちはいつから、この無防備な儀式に慣れきってしまったのだろうか。社内システム、プライベートなメール、銀行の明細——ブラウザ上に表示されている機密性の高いテキストを丸ごと外部のクラウドへ送信することへの漠然とした不安は、圧倒的な利便性の前にかき消されている。

だが、「ブラウザ内で、すべてを完結させることはできないか?」というハッカーたちの野心は、決して潰えていなかった。WebGPUの普及と、実用に耐えうる軽量LLMの進化によって、その理想はついに現実のものになろうとしている。

ブラウザに常駐する完全ローカルな自律型エージェント

いま注目すべきは、単にブラウザでLLMを動かすだけのチャットUIではない。Webページを自律的に「操作」するエージェント機能の実現だ。「Gemma Gem」というプロジェクトは、まさにその最前線を示している。

このChrome拡張機能は、GoogleのGemma 4モデル(E2BまたはE4B)をWebGPU経由で、完全にオンデバイスで動作させる。APIキーは不要。クラウド接続も不要。データがあなたのPCから一歩も外に出ることはない。それでいて、表示中のページを読み込み、ボタンをクリックし、フォームに入力し、必要であればページコンテキストでJavaScriptまで実行する「手足」を備えているのだ。

Manifest V3の制約を逆手にとった設計

Chrome拡張機能の開発者であれば、Manifest V3(MV3)の厳格なセキュリティモデルに苦しめられた経験があるはずだ。DOMにアクセスできるContent Script、バックグラウンドで動くService Worker——それぞれ役割が分断されており、重い機械学習モデルをどこで動かすのかが常にネックとなる。

Gemma Gemは、この分断を見事なアーキテクチャで乗り越えている。

コンテキスト 役割と実行されるツール(抜粋)
Offscreen Document Transformers.jsとWebGPUによるモデル推論、エージェントループ
Service Worker メッセージルーティング、take_screenshot, run_javascript
Content Script チャットUI描画、click_element, type_text, read_page_content

推論という重い負荷はOffscreen Documentに押し込め、Service Workerをハブとして使い、Content ScriptがDOMという「現実世界」に干渉する。この三位一体の設計は、今後のブラウザ内AIエージェントにおける一つのデザインパターンになるだろう。

さらに特筆すべきは、エージェントのコアロジックを担う agent/ ディレクトリの設計思想だ。Chrome拡張特有のAPIに密結合させず、インターフェースを通じて依存を逆転させている。

// 外部依存を持たないエージェントの設計イメージ
export interface ToolExecutor {
  execute(toolName: string, args: any): Promise<string>;
}
export interface ModelBackend {
  stream(prompt: string): AsyncGenerator<string>;
}

このように設計されているため、Gemma Gemの自律型エージェントのコア部分は、容易に別の環境やスタンドアロンのライブラリへと移植できる。拡張機能のガワを被ってはいるが、中身は極めて汎用的なエッジAIの実装なのだ。

数ギガバイトのローカルモデルが日常になる日

もちろん、初回のモデルダウンロードにはE2Bで約500MB、E4Bで約1.5GBのディスク容量を必要とする。しかし、一度キャッシュされてしまえば、あとは完全なオフライン環境でも動作する。q4f16量子化によって最適化されたモデルは、最新のWebGPU環境であれば驚くほど滑らかにトークンを生成し続ける。

これまで私たちは、強力なAIの恩恵を受ける対価として、自身のコンテキストを巨大なサーバーへ差し出してきた。しかし、Gemma Gemが証明したのは、個人のデバイスの中に十分に賢く、かつ「自分だけのために動く手足を持ったアシスタント」を飼えるという事実だ。

Webブラウザは単なるビューアから、あなた専属のAIが住まうOSへと変貌しようとしている。外部のクラウドに依存しない真のパーソナルAIの時代は、もう始まっている。

参考リポジトリ: kessler/gemma-gem

コメントする