
Evitando Loops de Agentes
Eu ainda me lembro do dia em que nosso bot de suporte, que deveria ser uma vitrine da IA agente em ação, começou a agir como se estivesse preso em algum tipo de loop bizarro. Os clientes faziam uma pergunta e, em vez de fornecer uma resposta útil, o bot apenas repetia as mesmas frases prontas repetidamente, nunca realmente abordando o problema em questão. Era como se o bot tivesse ficado preso em uma conversa sem fim consigo mesmo, incapaz de escapar do ciclo de conversa sem sentido.
Depois de investigar os logs, descobrimos a causa raiz: nosso bot foi projetado como um sistema multi-agente, com diferentes agentes responsáveis por lidar com diferentes aspectos da conversa. O problema surgiu quando esses agentes começaram a conversar entre si de uma maneira que criou uma espécie de loop de feedback. O Agente A fazia uma pergunta ao Agente B, que então pedia ao Agente C, que por sua vez perguntava ao Agente A, e assim por diante. Antes que percebêssemos, todo o sistema estava atolado em um mar de conversas circulares, sem uma maneira clara de quebrar o ciclo.
Percebemos que precisávamos implementar algum tipo de proteção para evitar esse tipo de comportamento. É aí que o LangGraph e o Protocolo de Contexto do Modelo (MCP) entraram em cena. Usando essas ferramentas, poderíamos criar um fluxo de conversa mais estruturado e intencional entre nossos agentes. Especificamente, usamos a API StateGraph do LangGraph para definir os possíveis estados de nossa conversa e o método add_conditional_edges para especificar as condições sob as quais um agente poderia transitar de um estado para outro.
Aqui está um exemplo simplificado de como poderíamos implementar isso usando Python:
import langgraph as lg
# Defina os possíveis estados de nossa conversa
states = ['inicial', 'pergunta_feita', 'resposta_recebida', 'seguimento_perguntado']
# Crie um StateGraph para gerenciar o fluxo da conversa
graph = lg.StateGraph(states)
# Defina as condições para transitar entre estados
graph.add_conditional_edges([
('inicial', 'pergunta_feita', lambda context: context['entrada_usuario'] is not None),
('pergunta_feita', 'resposta_recebida', lambda context: context['resposta_agente'] is not None),
('resposta_recebida', 'seguimento_perguntado', lambda context: context['seguimento_usuario'] is not None)
])
# Defina as ações a serem tomadas em cada estado
def perguntar(context):
# Código para perguntar ao usuário vai aqui
pass
def fornecer_resposta(context):
# Código para fornecer uma resposta ao usuário vai aqui
pass
def perguntar_seguimento(context):
# Código para perguntar uma questão de seguimento vai aqui
pass
# Crie um dicionário para armazenar as ações para cada estado
actions = {
'inicial': perguntar,
'pergunta_feita': fornecer_resposta,
'resposta_recebida': perguntar_seguimento
}
# Use o StateGraph para gerenciar o fluxo da conversa
def gerenciador_conversa(context):
estado_atual = graph.get_current_state(context)
acao = actions[estado_atual]
acao(context)
# Teste o gerenciador de conversa
context = {'entrada_usuario': 'Olá'}
gerenciador_conversa(context)
Neste exemplo, definimos um StateGraph com quatro estados possíveis: inicial, pergunta_feita, resposta_recebida e seguimento_perguntado. Em seguida, usamos o método add_conditional_edges para especificar as condições sob as quais a conversa pode transitar de um estado para outro. Finalmente, definimos um dicionário de ações a serem tomadas em cada estado.
Empresas brasileiras que utilizam bots de suporte podem enfrentar problemas semelhantes com loops de conversa. Implementar guardrails e protocolos como o MCP pode melhorar a eficiência e a experiência do usuário. A adoção de soluções estruturadas é crucial para evitar falhas em sistemas de IA.
