Agent 中的狀態遵循與新式 Web 應用程式同樣的範例。 Agents SDK 提供一些抽象概念,讓狀態管理變得更輕鬆。
與 Web 應用程式一樣,Agent 本身是無狀態的。 Agent 的不同執行個體可以處理交談的任何指定回合。 對某些 Agent 來說,這種簡單方式比較可取;Agent 可以在沒有額外資訊的情況下運作,或者所需的資訊保證就在傳入的訊息中。 若是 Agent,狀態 (例如交談上次離開位置或先前收到的使用者相關資料) 是 Agent 進行有效交談的必要條件。
為何需要狀態?
維護狀態可讓 Agent 記住使用者或交談的特定資訊,以進行更有意義的交談。 例如,如果您先前已與某位使用者交談過,即可儲存該使用者的先前資訊,之後就不必重複詢問。 系統還會將資料保留到目前回合結束之後,讓 Agent 在多回合交談過程中持續保有相關資訊。
關於 Agent,使用狀態涉及幾個層面:儲存層、狀態管理和 AgentApplication。
儲存層
從實際儲存狀態資訊的後端開始,就是儲存層。 您可以將此視為實際儲存體,例如記憶體內部、Azure 或協力廠商伺服器。
Agents SDK 包含一些儲存層實作:
記憶體儲存體實作記憶體內部儲存體以供測試之用。 記憶體內部資料儲存體僅適用於本機測試,因為此儲存體是揮發性暫存儲存體。 每次 Agent 重新啟動時,都會清除資料。
Azure Blob 記憶體會連接至 Azure Blob 記憶體物件資料庫。
Azure Cosmos DB 分割儲存體會連接至分割 Cosmos DB NoSQL 資料庫。
如需有關如何連接至其他儲存體選項的指示,請參閱 Agents SDK 儲存體概觀
狀態管理
狀態管理將 Agent 狀態的讀取和寫入自動化到基礎儲存層。 狀態會儲存為狀態屬性,這實際上是 Agent 可透過狀態管理物件讀取和寫入的索引鍵/值組,無需顧慮特定基礎實作。 這些狀態屬性定義了該資訊的儲存方式。 例如,當您擷取已定義為特定類別或物件的屬性時,即可知道該資料的結構方式。
這些狀態屬性歸類為具有範圍的「貯體」,而這些貯體只是協助整理這些屬性的集合。 SDK 包含下列三個「貯體」:
- 使用者狀態
- 交談狀態
所有這些貯體都是 Agent 狀態類別的子類別,可衍生來定義具有不同範圍的其他類型貯體。
根據貯體而定,這些預先定義的貯體會限定在特定可見度:
- 不論交談為何,Agent 都會在該管道上與該使用者進行交談的任何回合中提供使用者狀態
- 不論使用者的情況如何 (例如在群組交談中),交談狀態都可以在特定交談的任何回合中取得
使用者狀態和交談狀態由管道決定範圍。 使用不同管道存取 Agent 的同一個人員會顯示為不同的使用者 (每個管道各一個),各有不同的使用者狀態。
每個預先定義貯體所使用的索引鍵都是特定使用者和交談或 Agent 專屬的。 設定狀態屬性值時,系統會在內部為您定義索引鍵,其中包含回合內容中的資訊,以確保每個使用者或交談都歸入正確的貯體和屬性。 具體來說,索引鍵的定義如下:
- 使用者狀態使用管道識別碼和表單識別碼建立索引鍵。 例如,
{Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName - 交談狀態使用管道識別碼和交談識別碼建立索引鍵。 例如,
{Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName
各類型狀態的使用時機
交談狀態適合用於追蹤交談內容,例如:
- Agent 是否向使用者提出問題,以及詢問哪個問題
- 目前的交談主題,或上一個交談主題
- 錄製聊天歷程記錄
使用者狀態適合用於追蹤使用者的相關資訊,例如:
- 非關鍵的使用者資訊,例如姓名與偏好設定、鬧鐘設定,或提醒偏好設定
- 他們與 Agent 上次交談的相關資訊
- 例如,產品支援 Agent 可能會追蹤使用者所詢問的產品。
AgentApplication
- 您新增的路由處理常式會隨
TurnState執行個體一起提供。 從此執行個體存取交談或使用者狀態。 - 狀態會自動載入及儲存。