エージェント内の状態は、最新の Web アプリケーションと同じパラダイムに従っています。 Agents SDK には、状態管理を容易にするためのいくつかの抽象化機能が用意されています。
Webアプリと同様、エージェントは本質的にステートレスです。 会話の各ターンは、異なるエージェントのインスタンスによって処理される場合があります。 一部のエージェントでは、この単純さが好まれます。エージェントは、追加情報なしでも動作できるか、あるいは必要な情報が必ず受信メッセージに含まれていることが保証されます。 また、場合によっては、エージェントが有意義な会話を行うために、状況情報 (たとえば、会話がどこで中断したか、あるいはそのユーザーについて以前に受け取ったデータなど) が必要となります。
なぜ状態が必要なのですか?
状態を維持することで、エージェントはユーザーや会話に関する特定の情報を記憶し、より有意義な会話を行うことができます。 たとえば、以前にそのユーザーとやり取りをしたことがある場合、そのユーザーに関する過去の情報を保存しておけば、改めてその情報を尋ねる必要がなくなります。 また、状態は現在のターンよりも長い期間データを保持するため、エージェントはマルチターン会話の中で情報を維持することができます。
エージェントに関しては、状態の使用にはいくつかのレイヤーがあります。具体的には、ストレージ層、状態管理、そして AgentApplication です。
ストレージ レイヤー
ストレージ層は、状態の情報が実際に格納されているバックエンドから始まります。 これは、インメモリ、Azure、またはサードパーティのサーバーなど、物理的なストレージと考えることができます。
Agents SDK には、ストレージ層向けの実装がいくつか含まれています:
メモリ ストレージは、テスト目的でインメモリ ストレージを実装しています。 インメモリ データストレージは、揮発性かつ一時的なものであるため、ローカルでのテストにのみ使用することを目的としています。 エージェントが再起動するたびに、データは消去されます。
Azure Blob Storage は、Azure Blob Storage オブジェクト データベースに接続します。
Azure Cosmos DB パーティション型ストレージは、パーティション化された Cosmos DB NoSQL データベースに接続します。
その他のストレージ オプションへの接続方法については、Agents SDK ストレージの概要 を参照してください
状態管理
状態管理により、エージェントの状態の読み取りと書き込みが、基盤となるストレージ層に対して自動化されます。 状態は「状態プロパティ」として保存されます。これは実質的にキーと値のペアであり、エージェントは、具体的な内部実装を気にすることなく、状態管理オブジェクトを通じて読み書きを行うことができます。 これらの状態プロパティは、その情報の保存方法を定義します。 たとえば、特定のクラスやオブジェクトとして定義したプロパティを取得する場合、そのデータがどのように構造化されているかを把握できます。
これらの状態プロパティは、スコープ付きの「バケット」にまとめられています。これらは、単にそれらのプロパティを整理するためのコレクションです。 この SD には、このような「バケット」が 3 つ含まれています:
- ユーザー状態
- 会話状態
これらのバケットはすべて、エージェント状態クラスのサブクラスであり、このクラスを派生させることで、異なるスコープを持つ他の種類のバケットを定義することができます。
これらの事前定義されたバケットは、バケットごとに異なる特定の可視範囲に設定されています:
- ユーザーの状態は、会話の内容にかかわらず、エージェントがそのチャンネル上でそのユーザーと会話しているターンであればいつでも利用可能です
- 会話の状態は、グループ会話など、ユーザーに関係なく、特定の会話内のどのターンでも確認できます
ユーザーの状態と会話の状態は、チャネルごとにスコープが定義されます。 同じユーザーが異なるチャネルを通じてエージェントにアクセスした場合、チャネルごとに別々のユーザーとして表示され、それぞれに固有のユーザー状態が割り当てられます。
これらの事前定義されたバケットのそれぞれに使用されるキーは、ユーザーと会話、あるいはエージェントごとに固有のものとなります。 state プロパティの値を設定する際、各ユーザーや会話が正しいバケットとプロパティに割り当てられるよう、ターン コンテキストに含まれる情報に基づいて、キーが内部的に自動的に定義されます。 具体的には、キーは次のように定義されています:
- ユーザーの状態は、チャネル ID と from ID を使用してキーを作成します。 例:
{Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName - 会話状態は、チャネル ID と会話 ID を使用してキーを作成します。 例:
{Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
各状態の使用タイミング
会話の状態は、次のような会話の文脈把握に役立ちます。例:
- エージェントがユーザーに質問をしたかどうか、また、その質問がどのようなものだったか
- 現在の会話のトピックや直前のトピック
- チャット履歴の記録
ユーザーの状態は、次のようなユーザーに関する情報を追跡する際に役立ちます。
- 名前や基本設定、アラーム設定、アラート設定など、重要度の低いユーザー情報
- そのエージェントと最後に交わした会話に関する情報
- たとえば、製品サポート エージェントは、ユーザーがどの製品について問い合わせたかを追跡する場合があります。
AgentApplication
- 追加したルート ハンドラーには、
TurnStateのインスタンスが渡されます。 このインスタンスから会話やユーザーの状態にアクセスします。 - 状態は自動的に読み込まれ、保存されます。