Melhores práticas de design para evitar mensagens duplicadas

Note

Este artigo descreve características e comportamentos do arnês padrão. Aprenda como acessar recursos padrão em agentes e fluxos de agentes padrão do Access.

No ambiente padrão, vários componentes podem lidar com a solicitação de um usuário, e cada um age de acordo com sua própria perspectiva. Um tópico pode mostrar uma mensagem ou um Cartão Adaptativo, uma ferramenta pode retornar dados, e um filho ou agente conectado pode responder a partir de seu próprio contexto. A camada de orquestração continua o plano a partir de um contexto que pode não corresponder à resposta que o usuário recebe. Quando esses pontos de vista se afastam, o usuário pode ver uma mensagem repetida ou uma resposta perdida. Os fabricantes encontram esse comportamento com mais frequência em modelos mais novos do que em modelos mais antigos.

Entenda por que as duplicações ocorrem antes de projetar uma solução. Saiba mais sobre a distribuição de contexto no harness padrão.

Note

Mensagens repetidas e mensagens duplicadas geralmente são questões de design relacionadas ao gerenciamento do contexto, não bugs. Elas ocorrem quando o usuário vê uma resposta, mas o componente que continua o plano tem informações diferentes sobre o que já foi respondido.

Para entender esses casos de uso, considere duas superfícies separadamente: a saída visível pelo usuário (o que o usuário vê no chat) e o contexto ativo (as informações que um componente tem disponíveis ao decidir o que fazer em seguida). Os criadores não veem o contexto ativo diretamente. Portanto, é importante entender a perspectiva de cada componente e usar entradas e saídas para manter essas perspectivas alinhadas.

Para depurar um sintoma em um agente ativo, comece com Solucionar mensagens duplicadas e respostas perdidas e depois volte a este artigo para orientações de redesign.

Projeto com contexto em mente

Se uma solicitação é tratada por uma única etapa seguida de um Fim de todos os tópicos, o gerenciamento de contexto não entra em ação. Mas quando uma requisição precisa encadear vários componentes, ou quando o usuário faz mais de uma solicitação na mesma sessão, o gerenciamento de contexto importa. A maioria dos casos de uso reais abrange vários componentes por sessão, então projete de acordo.

  • Um componente, depois Encerrar todos os tópicos. Um único tópico, ferramenta, agente filho ou agente conectado lida com a solicitação e a sessão termina. Se esse componente escreve a resposta completa e reporta essa conclusão, a camada de orquestração não tem motivo para escrever outra resposta.
  • Vários componentes na sessão. Uma sessão pode executar vários componentes antes de fornecer ao usuário uma resposta completa. Uma sessão também pode abranger múltiplos pedidos. Um componente pode responder a parte do pedido, enquanto outro deve responder ao restante. Todo componente que funciona deve informar o que fez. Caso contrário, um componente posterior pode agir com base em um contexto que parece não ter sido respondido e responder novamente.
Quando o contexto importa Example Design de som
Nenhum contexto usado Um tópico mostra a resposta completa em uma mensagem ou Cartão Adaptativo. O nó Encerrar todos os tópicos impede que a camada de orquestração responda novamente.
A camada de orquestração usa contexto Um tópico mostra uma tabela para a parte A, então a camada de orquestração responde à parte B usando conhecimento ou outro agente. Cada componente reporta o que respondeu e retorna quaisquer valores que as etapas seguintes precisem, então a camada de orquestração não responde duas vezes.
O componente usa contexto Um tópico responde à parte A para o usuário, depois outro agente trata da parte B. Se o agente receber um contexto principal em que a parte A parece não ter sido respondida, ele responde à parte A novamente. Exclua o contexto pai do agente conectado sempre que possível, e os componentes retornam resultados que confirmam o que foi respondido e o que ainda resta.

Componentes de projeto para relatar o que aconteceu

Um componente envia uma mensagem repetida ou mensagens duplicadas quando a camada de orquestração não consegue detectar trabalho que um componente anterior concluiu. Use sempre a mesma abordagem de design para evitar mensagens duplicadas — instrua cada componente a reportar suas ações à camada de orquestração. Para cada parte da solicitação, atribua exatamente um componente para escrever a resposta que o usuário recebe. Todo outro componente faz seu trabalho e retorna contexto sem escrever para o usuário.

Use essas práticas juntas como uma única abordagem de design:

  1. Retorne resultados que registram o que aconteceu. Só as saídas geralmente são suficientes para modelos mais antigos.
  2. Adicione uma instrução ao tópico ou descrição do subagente que defina o que significa uma execução bem-sucedida. Essa abordagem torna o design robusto.
  3. Adicione uma instrução de nível superior para que a camada de orquestração verifique essas saídas antes de responder. Modelos mais novos se beneficiam mais dessa abordagem.

Apenas componentes que suportam saídas personalizadas podem retornar saídas e incluir instruções de descrição. Para componentes que não suportam saídas personalizadas, evite mensagens duplicadas limitando o contexto que recebem e adicionando uma instrução de nível superior.

Componente Relata de volta com Corrigir
Tema answered (Verdadeiro/Falso), choiceReceived (Verdadeiro/Falso) e uma saída de valor exibido ou resumo (Texto) Devolva os resultados e adicione uma instrução à descrição do tópico. Os tópicos de design como mini-agentes que evitam mensagens duplicadas fornecem exemplos de descrições de tópicos.
Subagente (filho ou agente conectado) answered (Verdadeiro/Falso), interactionSummary (Texto), openQuestions (Texto) Retorne as saídas, adicione um parâmetro de escopo e adicione uma instrução à descrição do subagente. Subagentes de projeto que evitam mensagens duplicadas fornecem exemplos de descrições de subagentes.
Conhecimento (um chamado ao conhecimento) Não dá para personalizar o contexto, posso repetir uma resposta. Mantenha um contexto limpo e de alto nível e influencie os pedidos enviados.
Nó de respostas generativas Não dá para personalizar o contexto, pode repetir uma resposta, e a resposta pode ser repetida depois. Mantenha um contexto de topo limpo, influencie a solicitação escrita na entrada do nó e faça com que o tópico host retorne a saída ou uma saída em estado respondido.

Projete uma instrução robusta de nível superior para evitar mensagens repetidas

As saídas mantêm a camada de orquestração informada. Adicione uma instrução de nível superior que diga aos modelos mais novos para verificarem as saídas antes de responder.

A seguinte instrução de agente de alto nível é um exemplo projetado para funcionar entre casos de uso, independentemente de um componente se comunicar diretamente com o usuário ou não. Edite e personalize conforme necessário.

Sempre que qualquer tópico ou agente for invocado, procure a saída booleana 'answered' antes de decidir o que responder. Tópicos e agentes têm seu próprio canal de comunicação com o usuário. Se 'respondido' for verdadeiro, sempre assuma que a solicitação foi respondida adequadamente usando pelo menos uma das variáveis de saída e verifique quais delas com base na descrição de saída. Não faça um comentário constrangedor sobre o conteúdo já respondido. Apenas forneça as respostas não respondidas e continue a conversa naturalmente com o próximo passo.

O termo canal não se refere a um canal de integração como o Teams ou um site. É um dispositivo de aviso que informa à camada de orquestração que o usuário pode já ter visto a resposta ou feito uma seleção por outro componente, como um tópico, cartão ou subagente. Esta formulação é a que melhor leva o modelo a verificar sua resposta antes de responder.

Gerenciar tópicos

Um tema frequentemente se comunica diretamente com o usuário mostrando uma mensagem, fazendo uma pergunta ou apresentando um Cartão Adaptativo. O contexto de orquestração recebe o texto do tópico como texto simples, mas não registra se o usuário o viu. O contexto também não recebe ações ou seleções do Cartão Adaptativo. Se o tópico responde ao usuário, mas não reporta essa ação para a camada de orquestração, a camada de orquestração trata a solicitação como não resolvida e responde novamente.

Projete um tema como um mini-agente. Retorne uma saída com status de respondido para que a camada de orquestração saiba que a solicitação foi atendida e retorne qualquer valor que o tópico exiba ou qualquer seleção coletada de que uma etapa posterior precise. Os resultados disponibilizam as ações e resultados para o restante do plano. Adicione uma instrução à descrição do tópico que defina o que significa uma corrida bem-sucedida.

Saiba mais em Projete tópicos como miniagentes que evitam mensagens duplicadas.

Gerencie agentes filhos e conectados

Projete agentes filhos e conectados como você projeta qualquer outro componente. O vai e vem deles com o usuário é invisível para o pai, que só aprende o que aconteceu por meio de saídas, e somente depois que o agente termina.

Agentes filhos e conexos também podem receber solicitações previamente não respondidas que permanecem no contexto do agente pai.

Para cada agente, especifique sua tarefa com uma entrada, especifique se ela responde ao usuário ou permanece em silêncio, e retorne saídas que informem ao agente pai o que aconteceu.

Saiba mais sobre Subagentes de Design que evitam mensagens duplicadas.

Lidar com o conhecimento

Conhecimento é uma construção de alto nível que o agente invoca. Ele recebe uma solicitação baseada no design do agente e recebe o contexto do agente. A maioria dos problemas de mensagens repetidas ocorre quando o contexto do agente carece de informações de outros componentes. Conhecimento de design para influenciar como o agente formula o pedido. Certifique-se de que outros componentes usem suas saídas corretamente.

Gerenciar nós de respostas generativas

Um nó de respostas generativas fica dentro de um tópico e responde com base no conhecimento. Ele recebe o contexto pai junto com tudo o que é passado nos seus dados de entrada, de modo que se comporta como conhecimento de nível superior e enriquece sua resposta com base no contexto atual. Ele pode escrever sua resposta diretamente no painel de chat ou armazená-la em uma variável de tópico, mas não pode retornar nada ao contexto de nível superior sozinho. Como qualquer conteúdo de tópico, sua resposta permanece no tema, a menos que o tema retorne um resultado.

Um nó de respostas generativas não precisa de tratamento especial além da regra que se aplica a todos os tópicos: passar o resultado como saída do tópico. Se o nó responder ao usuário nesse tópico, adicione uma saída de estado respondido e uma saída de valor exibido. Essas saídas dão à camada de orquestração um registro de que a solicitação foi respondida e impedem que uma etapa posterior responda novamente.

Garanta que descrições e instruções estejam alinhadas ao ponto de vista

Descrições e instruções também fazem parte do contrato de contexto.

Esta instrução leva ao tópico:

When the user asks about their account balance, call the Account balance topic.

Essa instrução roteia e atribui a propriedade da resposta à camada de orquestração:

When the user asks about their account balance, call the Account balance topic and give the balance.

Se o tópico já exibe o saldo, a segunda instrução cria um segundo fluxo de resposta. Se o tópico não retornar balanceValue, a camada de orquestração pode chamar o tópico novamente ou responder que não sabe o valor.

Use descrições e instruções que correspondam ao ponto de vista:

  • Uma descrição do tópico ajuda a camada de orquestração a decidir quando e como usar o tema. Também segue instruções sobre o que fazer ou gerar em seguida.
  • Uma descrição de agente conexo vem do ponto de vista do pai.
  • Uma instrução de agente conexo é lida do ponto de vista do agente conectado.
  • Uma descrição de saída de tópico ou agente conectado indica à camada de orquestração como interpretar o valor retornado.

Para um tópico que mostra uma resposta ao usuário e define answered=true, descreva tanto quando rotear para o tópico quanto o que significa uma execução bem-sucedida:

This topic handles account balance requests.
If its answered output is true, the user has already received their response and it should not be answered again.

Para um tópico que apenas gera saídas, descreva tanto quando encaminhar para o tópico quanto como responder:

This topic handles account balance requests and responds with the balance value in italics.

Restaurar o contexto em conversas longas

Um valor que um componente tinha pode sair do contexto ativo de duas maneiras. Em uma sessão longa, um valor que estava disponível há alguns turnos pode não estar mais no contexto ativo. Ou um componente busca um resultado completo, usa a parte relevante para produzir uma resposta e retorna apenas essa resposta, de modo que o restante do resultado nunca chega à camada de orquestração. De qualquer forma, o agente pode buscar os dados novamente ou pedir ao usuário informações que ele já possui, o que o usuário percebe como uma resposta perdida. A camada de orquestração se comporta como se nunca tivesse recebido o valor.

Projete para esse cenário recuperando e salvando contexto importante e disponibilizando-o novamente quando necessário:

  • Devolva um resultado completo, não apenas a parte usada para responder. Um resultado buscado frequentemente tem mais de um campo, muitas linhas e texto longo. Retorne todos os dados de que uma interação posterior possa precisar na forma de saídas, para que a camada de orquestração tenha acesso a eles sem precisar buscá-los novamente.

  • Salve e disponibilize valores entre interações. Nos pontos adequados, antes ou depois de uma chamada de ferramenta, encaminhe para um tópico que possa armazenar ou fornecer o valor por meio das entradas e saídas e de uma variável global, para que o plano não busque esse valor nem o solicite novamente.

Tip

O comportamento autônomo do agente pressupõe um projeto de agente que leve em conta o contexto em cada etapa e sob todos os pontos de vista.