Agentes

Um agente é um modelo rodando em um loop, escolhendo a próxima ferramenta a chamar até que uma tarefa seja concluída. O resto deste capítulo é o que isso significa, onde ele vale a pena, e onde isso custa silenciosamente.
O loop de agente
Em uso de ferramentas o modelo chamou uma função e você enviou o resultado de volta. Mas algumas tarefas levam vários passos, e você não sabe os passos com antecedência. "Encontre o voo mais barato e reserve-o" pode significar pesquisar, comparar, verificar um calendário, depois reservar, e o modelo tem que descobrir essa sequência conforme avança.
Então, em vez de lidar com uma única chamada de ferramenta, você coloca tudo em um loop. Este ciclo repetido é o loop de agente, uma volta repetida até que a tarefa seja concluída:
- Envie a conversa e as ferramentas disponíveis para o modelo.
- O modelo chama uma ferramenta ou fornece uma resposta final.
- Se chamou uma ferramenta, execute-a, adicione o resultado à conversa, e volte ao passo 1.
- Se deu uma resposta final, pare.
A cada volta o modelo vê tudo o que aconteceu até agora, incluindo resultados anteriores de ferramentas, e decide o próximo movimento. Essa é a única diferença em relação ao uso de ferramentas: você continua em loop até que o modelo esteja satisfeito de ter terminado.
A mudança real é quem está dirigindo. Em todos os capítulos até agora, seu código decidiu o fluxo de controle: você escolheu quando chamar o modelo, quando executar uma ferramenta, o que viria depois. Um agente entrega essa decisão ao modelo. O loop continua perguntando "o que deveria acontecer a seguir?" e a previsão do modelo é a resposta a cada vez. Você troca controle por flexibilidade, e essa troca é a fonte tanto do alcance quanto do risco.
Por baixo, nada novo está acontecendo. É a mesma previsão em um contexto crescente, o round-trip de uso de ferramentas repetido. O modelo não elabora um plano e o segue. A cada volta ele prevê o melhor próximo passo a partir do que pode ver agora, então o loop executa novamente.
Quando isso funciona, parece um raciocínio em direção a um objetivo. Quando não funciona, o agente fica em loop ou segue uma rota sem saída, porque nenhuma parte do sistema está mantendo o plano geral.
Um agente mínimo
Aqui está o loop em código. Ele reutiliza as definições de ferramentas e implementações do uso de ferramentas e as envolve em um loop que executa até que o modelo pare de pedir ferramentas.
import json
def run_agent(user_text, tools, tool_impls, max_steps=6):
messages = [{"role": "user", "content": user_text}]
step = 0
while step < max_steps:
response = client.chat.completions.create(model=MODEL, messages=messages, tools=tools)
message = response.choices[0].message
messages.append(message)
calls = message.tool_calls
if not calls:
return message.content # nenhuma ferramenta desejada: esta é a resposta final
# execute cada ferramenta solicitada e realimente os resultados
for call in calls:
args = json.loads(call.function.arguments)
result = tool_impls[call.function.name](args)
messages.append({"role": "tool", "tool_call_id": call.id, "content": json.dumps(result)})
step += 1
return "Stopped: the agent reached its step limit." # rede de segurançaLeia de cima para baixo: chame o modelo, coloque sua mensagem na conversa, e se pediu ferramentas, execute todas e anexe os resultados, então faça um loop novamente. Quando o modelo retorna texto em vez de uma chamada de ferramenta, esse texto é a resposta final e você o retorna.
O valor max_steps define um limite de passos, a rede de segurança que mantém o loop de sair do controle, que a próxima seção trata. A forma aqui combina com o SDK de um provedor; os nomes dos campos diferem entre provedores, mas o loop é o mesmo em todos os lugares.
Parando e guardrails
Um loop que deixa um modelo decidir quando parar pode falhar em parar. Pode chamar ferramentas para sempre, repetir a si mesmo, ou perseguir uma rota sem saída. Porque cada passo é uma chamada de modelo cobrada por tokens, um agente descontrolado queima dinheiro e tempo rápido.
Então guardrails, os limites que você coloca em torno do loop, são parte do design, não um passo de polimento que você adiciona depois:
- Um limite de passos. Coloque um teto no número de loops, do jeito que
max_stepsfaz. Quando atingido, pare e retorne. - Valide entradas de ferramentas. O modelo escolhe os argumentos, então verifique-os antes de executar qualquer coisa com consequências reais.
- Limite o que as ferramentas podem fazer. Dê ao agente o mínimo de poder que precisa. Uma ferramenta que lê é mais segura que uma que deleta.
- Acompanhe o custo. Várias chamadas de modelo por tarefa se multiplicam rapidamente, então acompanhe tokens e defina um orçamento.
O fio que une esses: o modelo está improvisando o caminho, então você coloca os limites no lugar que não vai. Assuma que o agente fará a coisa errada pelo menos uma vez, e torne isso sobrevivível.
Quando um fluxo de trabalho vence um agente
Agentes são empolgantes, o que torna tentador chegar a um quando você não precisa. A regra simples: se você já conhece os passos, não use um agente. Escreva-os como código simples, um fluxo de trabalho, onde cada passo executa em ordem fixa.
Um fluxo de trabalho é mais confiável, mais barato, e muito mais fácil de debugar, porque você controla o caminho em vez de esperar o modelo encontrá-lo. Reserve agentes para tarefas abertas onde os passos dependem do que é descoberto ao longo do caminho.
Muitos recursos que parecem precisar de um agente são melhores como uma chamada de saída estruturada ou uma consulta RAG conectada manualmente. Chegue a um agente apenas quando não conseguir escrever os passos com antecedência.
Na prática
A função run_agent acima é tudo. Dê a ela uma pergunta, um conjunto de ferramentas, e suas implementações, e ela faz loop até terminar ou até atingir o limite de passos. Uma pequena tarefa mostra o loop valendo a pena:
answer = run_agent(
"Qual é o tempo em São Paulo e devo trazer um guarda-chuva?",
tools, # inclui get_weather do capítulo de uso de ferramentas
tool_impls, # {"get_weather": ...}
)
# O agente chama get_weather, lê "nublado", então responde em uma única volta final:
# "Está nublado em São Paulo a 25 graus, então um guarda-chuva é uma ideia sensata."Uma ferramenta, um loop, uma resposta. A mesma estrutura escala para várias ferramentas e vários passos sem mudar de forma. Uma vez que consegue construir coisas tão capazes, a próxima pergunta é como você sabe que realmente funcionam, que é o que evals trata.
run_agent é todo o padrão: dê a ele uma pergunta, ferramentas, e suas implementações, e ele faz loop até o modelo parar de pedir ferramentas ou atingir o limite de passos. Uma ferramenta e um loop escalam para muitas sem mudar de forma. A próxima pergunta é como você sabe que realmente funciona, que é evals. 
