Gerenciar estado

O estado dentro de um agente segue os mesmos paradigmas que os aplicativos Web modernos. O SDK de Agentes fornece algumas abstrações para facilitar o gerenciamento de estado.

Assim como acontece com aplicativos Web, um agente é, por natureza, sem estado. Uma instância diferente do seu agente pode lidar com qualquer turno determinado da conversa. Para alguns agentes, essa simplicidade é preferencial: o agente pode operar sem informações adicionais ou as informações necessárias devem estar dentro da mensagem de entrada. Para outras pessoas, o estado (como onde a conversa parou ou os dados recebidos anteriormente sobre o usuário) é necessário para que o agente tenha uma conversa útil.

Por que preciso do estado?

Manter o estado possibilita que seu agente tenha conversas mais significativas lembrando certas coisas sobre um usuário ou conversa. Por exemplo, se você já conversou com um usuário anteriormente, poderá salvar informações anteriores sobre eles, para que não precise pedir novamente. O estado também mantém os dados por mais tempo do que o turno atual, para que o agente mantenha as informações ao longo de uma conversa de vários turnos.

Como se refere aos agentes, há algumas camadas para usar o estado: a camada de armazenamento, o gerenciamento de estado e o AgentApplication.

Camada de armazenamento

A partir do back-end, em que as informações de estado são realmente armazenadas, está a camada de armazenamento. Você pode pensar nisso como seu armazenamento físico, como na memória, no Azure ou em um servidor de terceiros.

O SDK de Agentes inclui algumas implementações para a camada de armazenamento:

O armazenamento de memória implementa o armazenamento na memória para fins de teste. O armazenamento de dados na memória destina-se apenas a testes locais, pois esse armazenamento é volátil e temporário. Os dados são limpos sempre que o agente é reiniciado.

O Armazenamento de Blobs do Azure conecta-se a um banco de dados de objeto do Armazenamento de Blobs do Azure.

O armazenamento particionado do Azure Cosmos DB conecta-se a um banco de dados NoSQL do Cosmos DB particionado.

Para obter instruções sobre como se conectar a outras opções de armazenamento, consulte Visão geral do Armazenamento do SDK de Agentes

Gerenciamento de estado

O gerenciamento de estado automatiza a leitura e gravação do estado do agente na camada de armazenamento subjacente. O estado é armazenado como propriedades de estado, que são efetivamente pares de chave-valor que seu agente pode ler e gravar por meio do objeto de gerenciamento de estado sem se preocupar com a implementação subjacente específica. Essas propriedades de estado definem como essas informações são armazenadas. Por exemplo, ao recuperar uma propriedade que você definiu como uma classe ou objeto específico, você sabe como esses dados serão estruturados.

Essas propriedades de estado são agrupadas em compartimentos com um escopo definido, que são apenas coleções para ajudar na organização dessas propriedades. O SDK inclui três desses "buckets":

  • Estado do usuário
  • Estado da conversa

Todos esses buckets são subclasses da classe de estado do agente, que podem ser derivadas para definir outros tipos de buckets com escopos diferentes.

Esses compartimentos predefinidos estão associados a uma determinada visibilidade, dependendo do tipo de compartimento.

  • O estado do usuário está disponível a qualquer momento que o agente esteja conversando com esse usuário nesse canal, independentemente da conversa
  • O estado da conversa está disponível em qualquer turno em uma conversa específica, independentemente do usuário, como em conversas em grupo

Os estados do usuário e da conversa são definidos por canal. A mesma pessoa que usa canais diferentes para acessar seu agente é exibida como usuários diferentes, um para cada canal e cada um com um estado de usuário distinto.

As chaves usadas para cada um desses buckets predefinidos são específicas para o usuário e a conversa ou o agente. Ao definir o valor da sua propriedade de estado, a chave é definida internamente para você, com informações contidas no contexto de turno para garantir que cada usuário ou conversa seja atribuído ao bucket e à propriedade corretos. Especificamente, as chaves são definidas da seguinte maneira:

  • O estado do usuário cria uma chave usando a ID do canal e a ID. Por exemplo, {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
  • O estado da conversa cria uma chave usando a ID do canal e a ID da conversa. Por exemplo, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName

Quando usar cada tipo de estado

O estado da conversa é bom para acompanhar o contexto da conversa, como:

  • Se o agente fez uma pergunta ao usuário e qual pergunta foi
  • Qual é o tópico atual da conversa ou qual foi o último
  • Histórico de chat de gravação

O estado do usuário é bom para acompanhar informações sobre o usuário, como:

  • Informações de usuário não críticas, como nome e preferências, uma configuração de alarme ou uma preferência de alerta
  • Informações sobre a última conversa que tiveram com o agente
    • Por exemplo, um agente de suporte ao produto pode rastrear quais produtos o usuário perguntou.

AgentApplication

  • Os manipuladores de rota adicionados serão fornecidos com uma instância TurnState. Acesse a conversa ou o estado do usuário desta instância.
  • O estado é carregado e salvo automaticamente.