モデルのダウンロードをお客様に伝える

公開日: 2025 年 10 月 1 日

組み込み AI API を使用する前に、基盤となるモデルとカスタマイズ(ファインチューニングなど)をネットワークからダウンロードし、圧縮データを抽出して、メモリに読み込む必要があります。このガイドでは、ダウンロードを待っている間のユーザー エクスペリエンスを向上させるためのベスト プラクティスについて説明します。

ダウンロードの進捗状況をモニタリングして共有する

組み込みの AI API には、セッションを開始する create() 関数があります。create() 関数には monitor オプションがあり、ダウンロードの進行状況にアクセスしてユーザーと共有できます。

組み込みの AI API はクライアントサイド AI 用に構築されており、データはブラウザとユーザーのデバイスで処理されますが、一部のアプリケーションではサーバーでデータを処理できます。モデルのダウンロードの進行状況でユーザーにどのように対応するかは、データ処理をローカルでのみ実行する必要があるかどうかによって異なります。これが true の場合、アプリケーションはクライアントサイドのみです。そうでない場合は、アプリケーションでハイブリッド実装を使用できます。

クライアントサイドのみ

クライアントサイドのデータ処理が必要になる場合があります。たとえば、患者が個人情報に関する質問をできる医療アプリでは、その情報がユーザーのデバイスにのみ保存されることを望んでいる可能性があります。ユーザーは、モデルとすべてのカスタマイズがダウンロードされて準備が整うまで待つ必要があります。その後、データ処理機能を使用できます。

この場合、モデルがまだ利用可能でない場合は、ダウンロードの進行状況に関する情報をユーザーに公開する必要があります。

<style>
  progress[hidden] ~ label {
    display: none;
  }
</style>

<button type="button">Create LanguageModel session</button>
<progress hidden id="progress" value="0"></progress>
<label for="progress">Model download progress</label>

組み込みモデルのダウンロード中は、アプリをまだ使用できません。

これを機能させるには、JavaScript が少し必要です。このコードは、まず進行状況インターフェースを初期状態(進行状況が非表示でゼロ)にリセットし、API がサポートされているかどうかを確認してから、API の可用性を確認します。

  • API は 'unavailable' です。このデバイスでは、アプリケーションをクライアントサイドで使用できません。この機能を利用できないことをユーザーに警告します。
  • API は 'available' です。API はすぐに使用できるため、進行状況 UI を表示する必要はありません。
  • API は 'downloadable' または 'downloading': ダウンロードが完了すると、API を使用できます。進行状況インジケータを表示し、downloadprogress イベントが発生するたびに更新します。ダウンロード後、不確定状態を表示して、ブラウザがモデルを取得し、メモリに読み込んでいることをユーザーに知らせます。
const createButton = document.querySelector('.create');
const promptButton = document.querySelector('.prompt');
const progress = document.querySelector('progress');
const output = document.querySelector('output');

let sessionCreationTriggered = false;
let session = null;

const createSession = async (options = {}) => {
  if (sessionCreationTriggered) {
    return;
  }

  progress.hidden = true;
  progress.value = 0;

  try {
    if (!('LanguageModel' in self)) {
      throw new Error('LanguageModel is not supported.');
    }

    const availability = await LanguageModel.availability();
    if (availability === 'unavailable') {
      throw new Error('LanguageModel is not available.');
    }

    let modelNewlyDownloaded = false;
    if (availability !== 'available') {
      modelNewlyDownloaded = true;
      progress.hidden = false;
    }
    console.log(`LanguageModel is ${availability}.`);
    sessionCreationTriggered = true;

    const llmSession = await LanguageModel.create({
      monitor(m) {
        m.addEventListener('downloadprogress', (e) => {
          progress.value = e.loaded;
          if (modelNewlyDownloaded && e.loaded === 1) {
            // The model was newly downloaded and needs to be extracted
            // and loaded into memory, so show the undetermined state.
            progress.removeAttribute('value');
          }
        });
      },
      ...options,
    });

    sessionCreationTriggered = false;
    return llmSession;
  } catch (error) {
    throw error;
  } finally {
    progress.hidden = true;
    progress.value = 0;
  }
};

createButton.addEventListener('click', async () => {
  try {
    localSession = await createSession({
      expectedInputs: [{ type: 'text', languages: ['en'] }],
      expectedOutputs: [{ type: 'text', languages: ['en'] }],
    });
    promptButton.disabled = false;
  } catch (error) {
    output.textContent = error.message;
  }
});

promptButton.addEventListener('click', async () => {
  output.innerHTML = '';
  try {
    const stream = localSession.promptStreaming('Write me a poem');
    for await (const chunk of stream) {
      output.append(chunk);
    }
  } catch (err) {
    output.textContent = err.message;
  }
});

モデルがブラウザにアクティブにダウンロードされている間にユーザーがアプリに入ると、進行状況インターフェースには、まだ不足しているデータに基づいて、ブラウザがダウンロード プロセスのどこにあるかが示されます。

このフローの動作を示すデモをご覧ください。組み込みの AI API(この例では Prompt API)が利用できない場合、アプリは使用できません。組み込みの AI モデルをまだダウンロードする必要がある場合は、進行状況インジケーターがユーザーに表示されます。ソースコードは GitHub で確認できます。

ハイブリッド実装

クライアントサイド AI を使用したいが、一時的にデータをクラウドに送信できる場合は、ハイブリッド実装を設定できます。つまり、ユーザーはローカルモデルをダウンロードしながら、機能をすぐに利用できます。モデルがダウンロードされたら、ローカル セッションに動的に切り替えます。

ハイブリッドには任意のサーバーサイド実装を使用できますが、同等の結果品質を確保するには、クラウドとローカルの両方で同じモデル ファミリーを使用することをおすすめします。Gemini API とウェブアプリのスタートガイドでは、Gemini API のさまざまなアプローチについて説明しています。

組み込みモデルのダウンロード中は、アプリはクラウドモデルにフォールバックし、すでに使用可能になっています。

デモでは、このフローの動作を確認できます。組み込み AI API が利用できない場合、デモはクラウドの Gemini API にフォールバックします。組み込みモデルをまだダウンロードする必要がある場合は、進行状況インジケーターがユーザーに表示され、モデルがダウンロードされるまでアプリはクラウドの Gemini API を使用します。GitHub の完全なソースコードをご覧ください。

まとめ

アプリはどのカテゴリに該当しますか?クライアントサイドの処理を 100% 必要としますか?それともハイブリッド アプローチを使用できますか?この質問に回答したら、次のステップとして、最適なモデル ダウンロード戦略を実装します。

このガイドで説明したように、モデルのダウンロードの進行状況をユーザーに表示することで、アプリをクライアントサイドで使用できるかどうかをユーザーが常に把握できるようにしてください。

これは一度限りの課題ではありません。ストレージの圧迫や新しいモデル バージョンの利用可能化によりブラウザがモデルを削除した場合、ブラウザはモデルを再度ダウンロードする必要があります。クライアントサイド アプローチとハイブリッド アプローチのどちらを採用しても、ユーザーに可能な限り最高の体験を提供し、残りの処理はブラウザに任せることができます。