Prompt API を使用したセッション管理のベスト プラクティス

公開日: 2025 年 1 月 27 日

商品の解説 ウェブ 拡張機能 Chrome ステータス インテント
GitHub オリジン トライアル オリジン トライアル Chrome 138 表示 試験運用の目的
GitHub オリジン トライアル サンプリング パラメータのオリジン トライアル Chrome 148 表示 試験運用の目的

Prompt API の重要な機能の 1 つにセッションがあります。 セッションを使用すると、モデルが発言内容のコンテキストを失うことなく、AI モデルとの会話を 1 つまたは複数継続できます。このガイドでは、言語モデルを使用したセッション管理のベスト プラクティスについて説明します。

1 人のユーザーが AI とやり取りする従来のチャットボットを構築している場合は、1 つ以上の並行セッションのセッション管理を行うことをおすすめします。また、1 人のサポート エージェントが複数の顧客に並行して対応し、AI を活用してさまざまな会話を追跡する顧客関係管理システムを使用している場合も、セッション管理を行うことをおすすめします。

最初のプロンプトでセッションを初期化する

最初のプロンプト は、セッションの開始時にセッションのコンテキストを設定します。たとえば、最初のプロンプトを使用して、モデルがどのように応答するかを指示できます。

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }],
});
console.log(await languageModel.prompt('Tell me a joke.'));
// 'Avast ye, matey! What do you call a lazy pirate?\n\nA **sail-bum!**\n\nAhoy
// there, me hearties!  Want to hear another one? \n'

メイン セッションのクローンを作成する

セッションが終了した後に新しいセッションを開始する場合や、複数の独立した会話を並行して行う場合は、メイン セッションのクローンを作成できます。

クローンは、最初のプロンプトとシステム プロンプト、セッションのやり取り履歴を継承します。これは、たとえば、最初のプロンプトでメイン セッションを初期化した場合に便利です。これにより、アプリはこの作業を 1 回だけ行えば済みます。すべてのクローンは、メイン セッションから最初のプロンプトを継承します。

const languageModel = await LanguageModel.create({
  initialPrompts: [{
    role: 'system',
    content: 'You are a helpful assistant and you speak like a pirate.'
  }]
});

// The original session `languageModel` remains unchanged, and
// the two clones can be interacted with independently from each other.
const firstClonedLanguageModel = await languageModel.clone();
const secondClonedLanguageModel = await languageModel.clone();
// Interact with the sessions independently.
await firstClonedLanguageModel.prompt('Tell me a joke about parrots.');
await secondClonedLanguageModel.prompt('Tell me a joke about treasure troves.');
// Each session keeps its own context.
// The first session's context is jokes about parrots.
await firstClonedLanguageModel.prompt('Tell me another.');
// The second session's context is jokes about treasure troves.
await secondClonedLanguageModel.prompt('Tell me another.');

過去のセッションを復元する

最初のプロンプトを使用すると、一連のプロンプトと回答の例をモデルに提供して、より良い結果を生成できます。これは、期待どおりの回答を作成するために、 n ショット プロンプトでよく使用されます。

モデルとの継続的な会話を追跡している場合は、この方法を使用してセッションを復元できます。たとえば、ブラウザを再起動した後、ユーザーが中断したところからモデルとのやり取りを再開できるようにします。1 つの方法として、ローカル ストレージにセッション履歴を記録する方法があります。

// Restore the session from localStorage, or initialize a new session.
// The UUID is hardcoded here, but would come from a
// session picker in your user interface.
const uuid = '7e62c0e0-6518-4658-bc38-e7a43217df87';

function getSessionData(uuid) {
  try {
    const storedSession = localStorage.getItem(uuid);
    return storedSession ? JSON.parse(storedSession) : false;
  } catch {
    return false;
  }
}

let sessionData = getSessionData(uuid);

// Initialize a new session.
if (!sessionData) {  
  sessionData = {
    initialPrompts: [],
  };
}

// Initialize the session with the (previously stored or new) session data.
const languageModel = await LanguageModel.create(sessionData);

// Keep track of the ongoing conversion and store it in localStorage.
const prompt = 'Tell me a joke';
try {
  const stream = languageModel.promptStreaming(prompt);
  let result = '';
  // You can already work with each `chunk`, but then store
  // the final `result` in history.
  for await (const chunk of stream) {
    // In practice, you'd render the chunk.
    console.log(chunk);
    result = chunk;
  }

  sessionData.initialPrompts.push(
    { role: 'user', content: prompt },
    { role: 'assistant', content: result },
  );

  // To avoid growing localStorage infinitely, make sure to delete
  // no longer used sessions from time to time.
  localStorage.setItem(uuid, JSON.stringify(sessionData));
} catch (err) {
  console.error(err.name, err.message);
}

ユーザーがモデルを停止できるようにしてセッションの割り当てを維持する

各セッションにはコンテキスト ウィンドウがあり、セッションの関連フィールド contextWindowcontextUsage にアクセスして確認できます。

const { contextWindow, contextUsage } = languageModel;
const contextWindowLeft = contextWindow - contextUsage;

このコンテキスト ウィンドウを超えると、セッションは最も古いメッセージを追跡できなくなります。コンテキストが重要な場合は、結果が悪くなる可能性があります。 割り当てを維持するには、モデルの回答が役に立たないと判断したユーザーが AbortController でセッションを停止できるようにします。

prompt() メソッドと promptStreaming() メソッドの両方で、ユーザーがセッションを停止できるようにする signal フィールドを含む省略可能な 2 番目のパラメータを受け取ります。

const controller = new AbortController();
stopButton.onclick = () => controller.abort();

try {
  const stream = languageModel.promptStreaming('Write me a poem!', {
    signal: controller.signal,
  });
  for await (const chunk of stream) {
    console.log(chunk);
  }
} catch (err) {
  // Ignore `AbortError` errors.
  if (err.name !== 'AbortError') {
    console.error(err.name, err.message);
  }
}

使用されていないセッションを削除する

各セッションはメモリを消費します。大規模なセッションを複数開始すると、問題が発生する可能性があります。 使用されていないセッションを破棄して、 リソースの可用性を高めます。

デモ

AI セッション管理デモで、AI セッション管理の動作をご確認ください。Prompt API を使用して複数の並行会話を作成し、タブを再読み込みしたり、 ブラウザを再起動したりして、中断したところから再開します。 ソースコードについては、GitHub をご覧ください

Prompt API の可能性を最大限に引き出す

これらの手法とベスト プラクティスを使用して AI セッションを慎重に管理することで、Prompt API の可能性を最大限に引き出し、より効率的でレスポンシブなユーザー中心のアプリケーションを提供できます。また、これらのアプローチを組み合わせることもできます。たとえば、ユーザーが復元された過去のセッションのクローンを作成して、仮説検証シナリオを実行できるようにします。

謝辞

このガイドは、 Sebastian BenzAndre BandarraFrançois Beaufort、および Alexandra Klepperによってレビューされました。