Gerenciar estado

O estado dentro de um agente segue os mesmos paradigmas das aplicações web modernas. O SDK de agentes fornece algumas abstrações para facilitar o gerenciamento de estado.

Tal como acontece com as aplicações Web, um agente é inerentemente apátrida. Uma instância diferente do seu agente pode processar qualquer turno específico da conversação. Para alguns agentes, essa simplicidade é preferível — o agente pode operar sem informações adicionais ou as informações necessárias têm a garantia de estar dentro da mensagem recebida. Para outros, o estado (como onde a conversa parou ou dados recebidos anteriormente sobre o usuário) é necessário para que o agente tenha uma conversa útil.

Por que eu preciso de estado?

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

No que diz respeito aos agentes, há algumas camadas para usar o estado: a camada de armazenamento, o gerenciamento de estado e o AgentApplication.

Camada de armazenamento

Começando no back-end, onde as informações de estado são realmente armazenadas, é a camada de armazenamento. Você pode pensar nisso como seu armazenamento físico, como na memória, Azure ou 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, uma vez que este armazenamento é volátil e temporário. Os dados são apagados sempre que o agente é reiniciado.

O Armazenamento de Blobs do Azure ligue-se a uma base de dados de objetos do mesmo serviço.

O armazenamento particionado do Azure Cosmos DB se conecta 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

Gestão do Estado

O gerenciamento de estado automatiza a leitura e a gravação do estado do seu agente na camada de armazenamento subjacente. O estado é armazenado como propriedades de estado, que são efetivamente pares chave-valor que o seu agente pode ler e escrever através do objeto de gestão 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, quando você recupera uma propriedade que definiu como uma classe ou objeto específico, sabe como esses dados serão estruturados.

Estas propriedades de estado são agrupadas em registos com um âmbito específico, que são apenas coleções para ajudar a estruturar estas propriedades. O SDK inclui três desses "buckets":

  • Estado do utilizador
  • Estado da conversação

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 conjuntos predefinidos têm um determinado âmbito de visibilidade, dependendo do conjunto:

  • O estado do usuário está disponível em qualquer turno em 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

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

As chaves usadas para cada um destes registos predefinidos são específicas para o utilizador e a conversação, ou agente. Ao definir o valor da sua propriedade de estado, a chave é definida internamente para si, com informações contidas no contexto de turno para garantir que cada utilizador ou conversação é colocado no registo e na propriedade corretos. Especificamente, as chaves são definidas da seguinte forma:

  • O estado do utilizador cria uma chave usando o ID do canal e o ID de origem. Por exemplo, {Activity.ChannelId}/users/{Activity.From.Id}#YourPropertyName
  • O estado da conversação cria uma chave usando o ID do canal e o ID da conversa. Por exemplo, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName

Quando usar cada tipo de estado

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

  • Se o agente fez uma pergunta ao usuário e qual foi essa pergunta
  • Qual é o tema atual da conversa, ou qual foi a última
  • Gravando o histórico do bate-papo

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

  • Informações não críticas do usuário, 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 sobre.

AgentApplication

  • Os manipuladores de rota que você adicionar receberão uma TurnState instância. Aceda à conversação ou ao estado do utilizador a partir desta instância.
  • O estado é carregado e salvo automaticamente.