Gerir 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 a gestão do estado.

Tal como nas aplicações Web, um agente é inerentemente sem estado. Uma instância diferente do seu agente pode processar qualquer turno específico da conversação. Para alguns agentes, esta simplicidade é preferível—o agente pode operar sem informações adicionais, ou as informações necessárias estão garantidas na mensagem a receber. Para outros, o estado (como o ponto em que a conversação parou ou os dados recebidos anteriormente sobre o utilizador) é necessário para que o agente tenha uma conversação útil.

Porque é que preciso de estado?

Manter o estado permite que o seu agente tenha conversações mais significativas ao recordar certas informações sobre um utilizador ou uma conversação. Por exemplo, se já falou com um utilizador anteriormente, pode guardar informações anteriores sobre ele, para não ter de solicitar novamente esses dados. O estado também mantém dados por mais tempo do que o turno atual, para que o seu agente mantenha informações ao longo de uma conversação com vários turnos.

No que diz respeito aos agentes, existem algumas camadas na utilização do estado: a camada de armazenamento, a gestão de estado e AgentApplication.

Camada de armazenamento

Começando pelo back-end, onde a informação de estado é realmente armazenada, encontra‑se a camada de armazenamento. Pode considerar isto como o seu armazenamento físico, como dentro da memória, no Azure ou num servidor de terceiros.

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

O armazenamento de memória implementa armazenamento dentro da memória para efeitos de teste. O armazenamento de dados dentro da memória destina-se apenas a testes locais, uma vez que este armazenamento é volátil e temporário. Os dados são limpos cada vez que o agente reinicia.

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 liga-se a uma base de dados NoSQL particionada do Cosmos DB.

Para obter instruções sobre como estabelecer ligação a outras opções de armazenamento, consulte Descrição geral do armazenamento do SDK de Agentes

Gestão de estados

A gestão de estado automatiza a leitura e a escrita do estado do seu agente para a 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 essa informação é armazenada. Por exemplo, quando obtém uma propriedade que definiu como uma classe ou objeto específicos, sabe como os 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 destes "registos":

  • Estado do utilizador
  • Estado da conversação

Todos estes registos são subclasses da classe de estado do agente, que pode ser derivada para definir outros tipos de registos com âmbitos diferentes.

Estes registos predefinidos têm um âmbito de visibilidade específico, dependendo do registo:

  • O estado do utilizador está disponível em qualquer turno em que o agente esteja a conversar com esse utilizador nesse canal, independentemente da conversação
  • O estado da conversação está disponível em qualquer turno de uma conversação específica, independentemente do utilizador, como em conversações de grupo

O estado do utilizador e o estado da conversação têm âmbito definido por canal. A mesma pessoa a utilizar canais diferentes para aceder ao seu agente aparece como utilizadores diferentes, um para cada canal, e cada um com um estado de utilizador 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 utilizando 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 utilizando o ID do canal e o ID da conversação. Por exemplo, {Activity.ChannelId}/conversations/{Activity.Conversation.Id}#YourPropertyName

Quando utilizar cada tipo de estado

O estado da conversação é adequado para monitorizar o contexto da conversação, por exemplo:

  • Se o agente fez uma pergunta ao utilizador e qual foi essa pergunta
  • Qual é o tópico atual da conversação ou qual foi o último
  • Registo do histórico do chat

O estado do utilizador é adequado para monitorizar informações sobre o utilizador, tais como:

  • Informações não críticas sobre o utilizador, como o nome e as preferências, uma definição de alarme ou uma preferência de alerta
  • Informações sobre a última conversação que teve com o agente
    • Por exemplo, um agente de suporte ao produto pode monitorizar os produtos sobre os quais o utilizador perguntou.

AgentApplication

  • Os processadores de rotas que adicionar receberão uma instância TurnState. Aceda ao estado da conversação ou de utilizador a partir desta instância.
  • O estado é automaticamente carregado e guardado.