公開日: 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% 必要としますか?それともハイブリッド アプローチを使用できますか?この質問に回答したら、次のステップとして、最適なモデル ダウンロード戦略を実装します。
このガイドで説明したように、モデルのダウンロードの進行状況をユーザーに表示することで、アプリをクライアントサイドで使用できるかどうかをユーザーが常に把握できるようにしてください。
これは一度限りの課題ではありません。ストレージの圧迫や新しいモデル バージョンの利用可能化によりブラウザがモデルを削除した場合、ブラウザはモデルを再度ダウンロードする必要があります。クライアントサイド アプローチとハイブリッド アプローチのどちらを採用しても、ユーザーに可能な限り最高の体験を提供し、残りの処理はブラウザに任せることができます。