エージェント内の状態は、最新の Web アプリケーションと同じパラダイムに従います。 Agents SDK には、状態管理を容易にするためにいくつかの抽象化が用意されています。
Web アプリと同様に、エージェントは本質的にステートレスです。 エージェントの別のインスタンスは、会話の任意のターンを処理できます。 一部のエージェントでは、この簡略化が推奨されます。エージェントは追加情報なしで動作するか、必要な情報が受信メッセージ内に含まれるように保証されます。 他のユーザーの場合、エージェントが有用な会話を行うためには、状態 (会話が中断した場所やユーザーに関して以前に受信したデータなど) が必要です。
状態が必要な理由
状態を維持すると、エージェントは、ユーザーまたは会話に関する特定の事柄を覚えておくことで、より意味のある会話を行えます。 たとえば、以前にユーザーと話したことがある場合は、ユーザーに関する以前の情報を保存して、もう一度要求する必要がないようにすることができます。 また、状態は現在のターンよりも長くデータを保持するため、エージェントは複数ターンの会話の過程で情報を保持します。
エージェントに関連するため、状態を使用するには、ストレージ 層、状態管理、AgentApplication といういくつかのレイヤーがあります。
ストレージ レイヤー
バックエンドから始めて、状態情報が実際に格納されるのがストレージ レイヤーです。 これは、インメモリ、Azure、サード パーティのサーバーなどの物理ストレージと考えることができます。
Agents SDK には、ストレージ レイヤーの実装がいくつか含まれています。
メモリ ストレージは、テスト目的でメモリ内ストレージを実装します。 メモリ内データ ストレージは、このストレージが揮発性で一時的であるため、ローカル テストのみを目的としています。 データは、エージェントが再起動されるたびにクリアされます。
Azure Blob Storage は、Azure Blob Storage オブジェクト データベースに接続します。
Azure Cosmos DB パーティション分割ストレージは、パーティション分割された Cosmos DB NoSQL データベースに接続します。
他のストレージ オプションに接続する方法については、「エージェント SDK ストレージの概要」を参照してください。
ステート管理
状態管理により、基になるストレージ レイヤーに対するエージェントの状態の読み取りと書き込みが自動化されます。 状態は状態プロパティとして格納されます。これは実質的にキーと値のペアであり、エージェントは、特定の基になる実装を気にすることなく、状態管理オブジェクトを通じて読み書きできます。 これらの状態プロパティは、その情報の格納方法を定義します。 たとえば、特定のクラスまたはオブジェクトとして定義したプロパティを取得すると、そのデータがどのように構造化されるかがわかります。
これらの状態プロパティは、範囲が設定された「バケット」としてまとめられます。これは、これらのプロパティを整理するのに役立つ単なるコレクションです。 SDK には、次の 3 つの "バケット" が含まれています。
- ユーザー状態
- 会話の状態
これらのバケットはすべてエージェント状態クラスのサブクラスであり、異なるスコープを持つ他の種類のバケットを定義するために派生させることができます。
これらの定義済みバケットのスコープは、バケットに応じて特定の可視性に設定されます。
- ユーザーの状態は、会話に関係なく、エージェントがそのチャネルでそのユーザーと会話している任意のターンで使用できます
- 会話の状態は、グループ会話など、ユーザーに関係なく、特定の会話で任意のターンで使用できます
ユーザーの状態と会話の状態は、チャネルによってスコープ指定されます。 エージェントにアクセスするために異なるチャネルを使用している同じユーザーは、チャネルごとに 1 つずつ、それぞれ異なるユーザー状態で表示されます。
これらの定義済みバケットごとに使用されるキーは、ユーザーと会話 (agenth) に固有です。 状態プロパティの値を設定する場合、キーは内部的に定義され、各ユーザーまたは会話が正しいバケットとプロパティに確実に配置されるように、ターン コンテキストに情報が含まれます。 具体的には、キーは次のように定義されます。
- ユーザー状態では、チャネル ID と FROM ID を使用してキーが作成されます。 たとえば、
{Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyNameのように指定します。 - 会話状態では、チャネル ID と会話 ID を使用してキーが作成されます。 たとえば、
{Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyNameのように指定します。
各種類の状態を使用する場合
会話の状態は、次のような会話のコンテキストを追跡する場合に適しています。
- エージェントがユーザーに質問したかどうか、およびどの質問が
- 会話の現在のトピックとは何か、または最後のトピックは何でしたか
- チャット履歴の記録
ユーザーの状態は、次のようなユーザーに関する情報を追跡する場合に適しています。
- 重要でないユーザー情報 (名前と基本設定、アラーム設定、アラート設定など)
- エージェントとの最後の会話に関する情報
- たとえば、製品サポート エージェントは、ユーザーが質問した製品を追跡できます。
AgentApplication
- 追加するルート ハンドラーは、
TurnStateインスタンスで提供されます。 このインスタンスから会話またはユーザーの状態にアクセスします。 - 状態が自動的に読み込まれ、保存されます。