Uso de Ferramentas e Orquestração
Visão geral
Uso de ferramentas é a capacidade de um agente de IA (frequentemente um agente baseado em LLM (large language model)) de chamar funções externas — APIs, bancos de dados, interpretadores de código, mecanismos de busca, serviços internos — para realizar tarefas que excedem o que o modelo consegue fazer de forma confiável apenas em texto. Orquestração é a camada de controle que decide quais ferramentas usar, quando usá-las, como se recuperar de falhas e como coordenar múltiplas etapas (ou múltiplos agentes) em um fluxo de trabalho coerente.
Em sistemas agênticos modernos, o modelo é melhor entendido como um componente de raciocínio e decisão incorporado dentro de um sistema de software maior. A orquestração é o que torna esse sistema confiável: ela lida com roteamento, seleção de ferramentas, tentativas (retries), proteções (guardrails) e padrões de execução que transformam “um modelo esperto” em “um produto confiável”.
Este artigo se concentra em quatro temas centrais:
- Roteamento: determinar qual caminho/fluxo de trabalho adotar para uma solicitação (frequentemente incluindo se deve chamar alguma ferramenta).
- Seleção de ferramentas: escolher a(s) melhor(es) ferramenta(s) entre candidatas e fornecer entradas válidas.
- Tentativas e recuperação: lidar com falhas de ferramentas, timeouts, resultados parciais e incerteza.
- Padrões de orquestração: designs reutilizáveis (loops, planejadores, fluxos de trabalho, coordenação multiagente) para tarefas de longo horizonte.
Tópicos relacionados: Agentes de LLM, Memória e Estado, Sistemas Multiagente.
Por que o uso de ferramentas é essencial para agentes de LLM
LLMs são aprendizes de padrões poderosos, mas têm limitações estruturais:
- Elas não têm, inerentemente, acesso a dados atuais ou privados. Ferramentas permitem recuperar dados de bancos de dados, índices de busca ou bases de conhecimento internas (frequentemente junto com Geração Aumentada por Recuperação (Retrieval-Augmented Generation)).
- Elas não são garantidamente corretas sobre fatos ou aritmética. Ferramentas fornecem verdade fundamental (por exemplo, contagens de estoque, direitos do usuário) e cálculo verificável.
- Elas não conseguem tomar ações reais por conta própria. Ferramentas podem enviar e-mails, criar tickets, implantar código, cobrar pagamentos — ações que exigem autenticação e gerenciamento de efeitos colaterais.
- Elas têm janelas de contexto finitas e memória imperfeita. Orquestração e armazenamentos externos (ver Memória e Estado) gerenciam persistência, compressão e contexto de longo prazo.
Sob a perspectiva de IA, o uso de ferramentas transforma uma LLM em uma política sobre um espaço de ações expandido: “responder em texto” é uma ação, “chamar uma ferramenta com argumentos” é outra. A orquestração é o ambiente de execução da política, garantindo que as ações sejam válidas, seguras e eficientes.
Conceitos fundamentais
Ferramentas como interfaces: esquemas, contratos e efeitos colaterais
Uma “ferramenta” pode ser qualquer capacidade chamável:
- Ferramentas de informação: busca, recuperação, consultas a banco de dados, parsers de documentos
- Ferramentas de computação: execução de código, calculadoras, solucionadores de otimização
- Ferramentas de ação: enviar mensagem, atualizar CRM, criar PR, agendar reunião
- Ferramentas de controle: “pedir a um humano”, “solicitar esclarecimento”, “escalar”
Uma definição prática de ferramenta inclui:
- Nome e descrição: o que faz e quando usá-la
- Esquema de entrada: tipos, campos obrigatórios, restrições
- Esquema de saída: resultado estruturado e formato de erro
- Propriedades operacionais: latência, custo, limites de taxa, idempotência, permissões
- Propriedades de segurança: quais efeitos colaterais ocorrem e como restringi-los
Duas propriedades importam muito na orquestração:
- Idempotência: É possível tentar novamente com segurança sem duplicar efeitos colaterais?
- Determinismo: A ferramenta retorna resultados estáveis, ou varia com tempo/estado?
Para ferramentas com efeitos colaterais (cobrar um cartão, criar um ticket), chaves de idempotência fortes e modos explícitos de “simulação” (“dry run”) podem simplificar drasticamente tentativas e segurança.
Roteamento vs seleção de ferramentas (e por que são diferentes)
Embora sejam relacionados, ajuda separar:
- Roteamento: escolher um caminho de alto nível (por exemplo, “fluxo de problema de cobrança” vs “fluxo de suporte técnico” vs “responder a partir do FAQ sem ferramentas”).
- Seleção de ferramentas: escolher as chamadas específicas de ferramentas dentro de uma rota (por exemplo, “consultar assinatura”, depois “calcular reembolso proporcional”, depois “criar solicitação de reembolso”).
O roteamento é frequentemente formulado como um problema de classificação (“qual intenção?”), enquanto a seleção de ferramentas é mais próxima de planejamento/seleção de ações sob restrições.
O loop de orquestração como um sistema de controle
Um loop de controle comum se parece com:
- Observar: solicitação do usuário + estado atual
- Decidir: rotear, escolher ferramenta ou produzir resposta
- Agir: chamar ferramenta(s)
- Atualizar: armazenar resultados em estado/memória
- Recuperar: lidar com erros/tentativas/fallbacks
- Responder: finalizar saída ou continuar
Isso se assemelha a loops clássicos de agentes em aprendizado por reforço e planejamento (ver Aprendizado por Reforço (Reinforcement Learning) e Algoritmos de Planejamento (Planning Algorithms)), mas na prática a “política” é parcialmente aprendida (a LLM) e parcialmente projetada (o orquestrador).
Estratégias de roteamento
O roteamento responde: Que tipo de problema é este, e qual fluxo de trabalho deve tratá-lo?
Estratégias comuns:
Roteamento baseado em regras
- Prós: previsível, barato, fácil de auditar
- Contras: frágil, baixa cobertura para linguagem confusa
- Exemplo: se a mensagem contém “reembolso” ou “estorno”, enviar para o fluxo de cobrança.
LLM como roteador (classificação via prompt)
- Prós: flexível, boa cobertura semântica
- Contras: precisa de avaliação cuidadosa; pode ser inconsistente sem restrições
- Frequentemente implementado como uma saída estruturada (“route”: um de N rótulos) com confiança.
Roteamento baseado em embeddings (embedding-based routing)
- Calcular embeddings para a solicitação; comparar com exemplares de rotas ou descrições de rotas.
- Prós: rápido, estável; bom para similaridade semântica
- Contras: menos expressivo que uma LLM para políticas sutis; requer exemplares curados.
Roteador aprendido (classificador supervisionado)
- Treinar um modelo leve (ou fazer ajuste fino (fine-tune)) em rotas rotuladas.
- Prós: consistente, rápido, mensurável
- Contras: requer dados; retreinamento periódico conforme as rotas evoluem
Roteamento híbrido
- Usar regras para casos críticos de segurança (“cancelar conta” exige verificação).
- Usar roteamento aprendido/por LLM para casos gerais.
- Adicionar uma rota de fallback: “fazer pergunta de esclarecimento” ou “transferir para humano”.
Dica prática: o roteamento deve considerar custo e risco, não apenas semântica. “Redefinição de senha” e “excluir conta” podem parecer semelhantes textualmente, mas exigem autenticação e salvaguardas diferentes.
Estratégias de seleção de ferramentas
A seleção de ferramentas responde: Qual ferramenta devo chamar a seguir, com quais argumentos, dado o objetivo e o estado?
Geração e filtragem de candidatos
Antes de pedir para uma LLM escolher ferramentas, muitos sistemas reduzem o conjunto de ferramentas:
- Filtrar por permissões (o que o usuário/sessão atual pode fazer)
- Filtrar por contexto (apenas ferramentas relevantes para esta rota)
- Filtrar por disponibilidade (serviços degradados, limites de taxa)
- Filtrar por orçamento de custo/latência
Isso importa porque menus grandes de ferramentas aumentam confusão e chamadas alucinadas.
Abordagens de seleção
Chamada de função em etapa única (single-step function calling)
- O modelo seleciona uma chamada de ferramenta (ou nenhuma) a partir de um conjunto fornecido.
- Melhor para tarefas simples: “consultar status do pedido”, “buscar docs”.
Seleção iterativa (multietapas)
- O modelo decide uma sequência de chamadas de ferramentas, atualizando-se com base nos resultados.
- Útil quando a coleta de informações é adaptativa.
Divisão planejador + executor (planner + executor split)
- O planejador produz um plano (etapas); o executor roda as ferramentas e lida com erros.
- Melhora a controlabilidade e permite inspeção.
Heurística + LLM
- Heurísticas escolhem a “melhor” fonte de recuperação; a LLM formata consultas e sintetiza a resposta final.
- Frequentemente entrega melhor confiabilidade do que dar liberdade total à LLM.
Construção e validação de argumentos
Um grande modo de falha não é a ferramenta errada, mas argumentos errados. Boas práticas:
- Usar esquemas estruturados (por exemplo, restrições tipo JSON Schema).
- Validar argumentos antes da execução.
- Se a validação falhar, então:
- pedir ao modelo para reparar argumentos usando o erro de validação, ou
- pedir ao usuário uma pergunta de esclarecimento.
Tentativas, recuperação e robustez
Tentativas não são apenas “tentar de novo”. Uma boa política de tentativas distingue tipos de falha:
Taxonomia de falhas
- Erros transitórios de infraestrutura: timeouts, 503s, falhas de rede
→ tentar novamente com recuo exponencial e jitter - Limites de taxa / cotas: 429s
→ tentar novamente após atraso; trocar para modelo de menor custo; reduzir concorrência - Argumentos inválidos / incompatibilidade de esquema: 400s, erros de validação
→ não tentar novamente cegamente; reparar entradas - Erros de domínio no nível da ferramenta: “order_id não encontrado”, “fundos insuficientes”
→ tratar logicamente; perguntar ao usuário; escolher ferramenta ou rota alternativa - Resultados parciais: algumas páginas recuperadas, outras falharam
→ degradar com elegância; citar o que você tem; opcionalmente continuar
Padrões de confiabilidade
- Recuo exponencial + jitter: previne efeito manada
- Disjuntor (circuit breaker): parar de chamar uma ferramenta que falha e rotear para fallback
- Orçamentos de timeout: limitar o tempo total gasto em tentativas
- Chaves de idempotência: tentativas seguras para ações com efeitos colaterais
- Ferramentas de fallback: por exemplo, se a busca primária falhar, tentar índice secundário
- Escalonamento com humano no loop (human-in-the-loop): para ações de alto risco ou falhas repetidas
Um ponto sutil, mas importante: tentativas de LLM também existem. Se o modelo produz argumentos de ferramenta inválidos, você pode “tentar novamente” com um prompt de reparo que inclui o erro de esquema — frequentemente mais eficaz do que apenas amostrar novamente às cegas.
Padrões de orquestração
A seguir estão padrões comuns e reutilizáveis para construir agentes que usam ferramentas.
Chamada direta de ferramenta (etapa única)
Melhor quando o mapeamento de solicitação → chamada de ferramenta é direto.
- Rota: “status do pedido”
- Ferramenta:
get_order_status(order_id) - Resposta: renderizar resultado
Isso pode ser altamente confiável quando combinado com extração determinística (ou decodificação restrita) e validação forte.
Loop no estilo ReAct (razão + ação)
Em um loop similar ao ReAct, o agente alterna entre:
- gerar um pensamento/decisão (“Eu deveria pesquisar a documentação”)
- chamar uma ferramenta
- observar o resultado
- continuar até conseguir responder
Em produção, muitas equipes evitam expor “pensamentos” e, em vez disso, tratam o loop como transições internas de estado. A ideia-chave é a intercalação entre raciocínio e resultados de ferramentas.
Planejar e executar (plan-and-execute)
Abordagem em duas fases:
- Planejar: produzir um plano estruturado (etapas, ferramentas necessárias)
- Executar: rodar as etapas de forma determinística com checagens, tentativas e atualizações de estado
Esse padrão é útil quando:
- as tarefas são de longo horizonte,
- auditabilidade importa,
- você quer restringir ações permitidas.
Orquestração por workflow / DAG
Representar o processo como um grafo direcionado:
- nós = chamadas de ferramentas ou chamadas ao modelo
- arestas = dependências
- ramificações condicionais = decisões de roteamento
Isso é comum em ambientes corporativos onde confiabilidade e observabilidade importam mais do que autonomia aberta.
Orquestração gerente–trabalhador (hierárquica)
Um agente “gerente” delega a agentes ou módulos “trabalhadores” especializados:
- Trabalhador de pesquisa (recuperação, citações)
- Trabalhador de dados (SQL, analytics)
- Trabalhador de ação (tickets, CRM)
- Trabalhador de segurança (checagens de política)
Isso se sobrepõe a Sistemas Multiagente, mas também pode ser implementado como um único processo com múltiplos prompts/modelos.
Loops de crítico / verificador
Adicionar uma etapa explícita de verificação:
- Gerar chamada de ferramenta candidata ou resposta final
- Crítico verifica restrições (política, formato, indícios de correção)
- Se falhar, revisar
A verificação é especialmente valiosa para:
- ações críticas de segurança
- chamadas de ferramentas caras
- domínios de alta precisão (finanças, triagem médica — tipicamente com supervisão humana)
Exemplos práticos
Exemplo 1: Um agente de suporte ao cliente com roteamento
Cenário: um assistente de suporte precisa lidar com perguntas de cobrança, problemas técnicos e FAQs gerais. Ele tem ferramentas:
search_kb(query)→ artigos/trechosget_subscription(user_id)→ plano, statuscreate_ticket(category, summary, metadata)→ id do ticketissue_refund(user_id, invoice_id, amount, idempotency_key)→ status do reembolso
Um esboço mínimo de orquestração:
from dataclasses import dataclass
import time, random
@dataclass
class ToolResult:
ok: bool
data: dict | None = None
error_type: str | None = None # "timeout", "rate_limit", "validation", "domain"
error_message: str | None = None
def backoff(attempt: int) -> float:
base = min(2 ** attempt, 20)
return base + random.random()
def call_with_retries(tool_fn, args: dict, *, max_attempts=3, timeout_s=10) -> ToolResult:
for attempt in range(max_attempts):
result = tool_fn(args, timeout_s=timeout_s)
if result.ok:
return result
if result.error_type in ("timeout", "rate_limit"):
time.sleep(backoff(attempt))
continue
# Non-transient: don't retry blindly
return result
return ToolResult(ok=False, error_type="timeout", error_message="exhausted retries")
def route_intent(user_message: str) -> str:
# In practice: LLM router or classifier; keep deterministic here for illustration
msg = user_message.lower()
if "refund" in msg or "charged" in msg or "invoice" in msg:
return "billing"
if "error" in msg or "bug" in msg or "crash" in msg:
return "technical"
return "faq"
def handle_message(user_id: str, user_message: str) -> str:
route = route_intent(user_message)
if route == "faq":
kb = call_with_retries(search_kb, {"query": user_message})
if kb.ok and kb.data.get("snippets"):
return synthesize_answer(user_message, kb.data["snippets"])
return "I couldn't find a relevant article. Can you share more details?"
if route == "billing":
sub = call_with_retries(get_subscription, {"user_id": user_id})
if not sub.ok:
return "I’m having trouble accessing your subscription details. Please try again shortly."
# If refund requested, collect required identifiers safely
needs_invoice = "invoice" in user_message.lower() or "refund" in user_message.lower()
if needs_invoice and "invoice_id:" not in user_message:
return "Which invoice is this about? Please provide the invoice ID."
# Example: side-effecting call requires idempotency key
refund = call_with_retries(issue_refund, {
"user_id": user_id,
"invoice_id": extract_invoice_id(user_message),
"amount": None, # let tool compute or require explicit amount
"idempotency_key": make_idempotency_key(user_id, user_message),
})
if refund.ok:
return f"Refund initiated: {refund.data['status']} (ref: {refund.data['refund_id']})"
if refund.error_type == "domain":
return f"I can't issue that refund: {refund.error_message}"
return "Refund service is temporarily unavailable. I can create a ticket for follow-up if you want."
if route == "technical":
kb = call_with_retries(search_kb, {"query": user_message})
if kb.ok and kb.data.get("snippets"):
return synthesize_answer(user_message, kb.data["snippets"])
ticket = call_with_retries(create_ticket, {
"category": "technical",
"summary": user_message[:200],
"metadata": {"user_id": user_id},
})
if ticket.ok:
return f"I created a support ticket: {ticket.data['ticket_id']}"
return "I couldn't create a ticket right now. Please try again later."
return "Unsupported route."
O que este exemplo ilustra:
- Roteamento escolhe um fluxo de trabalho cedo.
- Seleção de ferramentas é restringida pela rota (cobrança vs técnico).
- Tentativas são aplicadas apenas a erros transitórios.
- Efeitos colaterais (reembolso) exigem chaves de idempotência e controle cuidadoso.
- A LLM pode ser usada dentro de
synthesize_answer(...)e, opcionalmente, no roteamento e na extração de argumentos — mas o orquestrador mantém o controle de segurança e confiabilidade.
Exemplo 2: Orquestração de análise de dados (recuperar → computar → explicar)
Cenário: “Quais foram os 5 principais fatores de churn no último trimestre?” Ferramentas:
run_sql(query)→ tabelafit_model(data, target)→ resumo do modeloplot(data, spec)→ artefato de gráfico
Uma orquestração robusta frequentemente:
- Usa a LLM para rascunhar uma consulta SQL em um dialeto restrito
- Valida a consulta (sem instruções destrutivas)
- Executa com timeouts e limites de linhas
- Alimenta os resultados em uma ferramenta de computação
- Gera uma explicação narrativa com citações dos outputs computados
Esse estilo de “pipeline” é frequentemente mais confiável do que deixar a LLM fazer tudo de uma vez, porque cada etapa é verificável e limitada.
Boas práticas de design de ferramentas e orquestrador
Projete ferramentas para agentes (não apenas para humanos)
- Torne entradas explícitas e tipadas: evite strings “query” sobrecarregadas quando existirem campos estruturados.
- Retorne erros estruturados: inclua tipo de erro, mensagem e dicas de reparo.
- Forneça identificadores estáveis: IDs em vez de nomes quando possível.
- Ofereça modos de “dry run” / “apenas validar” para ações perigosas.
- Adicione chaves de idempotência para operações com efeitos colaterais.
Gerencie estado explicitamente
A orquestração de ferramentas é stateful: identidade do usuário, outputs anteriores de ferramentas, orçamentos e progresso importam.
- Mantenha um objeto de estado da tarefa com resultados de ferramentas e decisões.
- Persista o que importa entre turnos (ver Memória e Estado).
- Evite colocar tudo no prompt; armazene estado estruturado fora da LLM e resuma quando necessário.
Restrinja e verifique saídas do modelo
Para reduzir alucinações e chamadas inválidas:
- Use restrições de saída estruturada (esquemas, enums).
- Valide e repare em vez de “executar no melhor esforço”.
- Considere um modelo “verificador” ou um checador baseado em regras para etapas de alto risco.
Observabilidade e avaliação
Trate o uso de ferramentas como um sistema de produção:
- Trace cada etapa: rota → seleção de ferramenta → args → latência da ferramenta → resultado
- Acompanhe métricas:
- taxa de sucesso de chamadas de ferramentas
- taxa de falhas de validação de argumentos
- contagens de tentativas
- sucesso de tarefa ponta a ponta (com rótulos humanos quando possível)
- orçamentos de custo e latência
- Avalie sistematicamente (ver Métricas de Avaliação (Evaluation Metrics)) usando suítes de teste reproduzíveis e falhas de ferramentas simuladas.
Modos comuns de falha (e mitigações)
- Rota errada (classificação incorreta): adicionar uma rota “esclarecer”; calibrar confiança; usar roteamento híbrido.
- Ferramentas ou parâmetros alucinados: restringir lista de ferramentas; validação de esquema; impor enums.
- Loops infinitos / thrashing de ferramentas: limites de etapas; condições de término; checagens de novidade (“não repetir chamada idêntica”).
- Injeção de prompt via outputs de ferramentas: tratar texto de ferramentas como não confiável; isolar conteúdo recuperado; aplicar filtragem de conteúdo antes de realimentar.
- Falhas em cascata durante indisponibilidades: disjuntores; fallbacks; degradação graciosa.
- Falha parcial silenciosa: exigir sinais explícitos de completude; rastrear dependências faltantes no estado.
Quando usar qual padrão de orquestração
- Chamada direta de ferramenta: tarefas transacionais de etapa única (consulta, atualizações simples)
- Loop ReAct: exploração aberta com ferramentas limitadas (assistentes de pesquisa)
- Planejar e executar: tarefas longas que exigem auditabilidade e execução previsível
- Workflow/DAG: pipelines corporativos, processos com alta exigência de conformidade
- Gerente–trabalhador / multiagente: especialização, paralelismo, domínios complexos (ver Sistemas Multiagente)
Na prática, a maioria dos sistemas reais são híbridos: um fluxo de trabalho roteado com um pequeno loop tipo ReAct dentro de etapas específicas, além de tentativas e verificação explícitas.
Checklist: construindo agentes confiáveis que usam ferramentas
- Roteie cedo e inclua um fallback seguro (esclarecer/escalar)
- Reduza o menu de ferramentas por rota; filtre por permissões e disponibilidade
- Use esquemas + validação para argumentos de ferramentas; implemente loops de reparo
- Trate tentativas como uma política (por tipo de erro), não como um instrumento bruto
- Adicione idempotência para ferramentas com efeitos colaterais; prefira opções de “dry run”
- Rastreie estado fora do modelo; resuma em prompts conforme necessário
- Instrumente tudo: traces, métricas e avaliações reproduzíveis
- Projete para degradação: disjuntores, fallbacks e transferência para humano
Uso de ferramentas e orquestração é onde sistemas agênticos viram engenharia. Quando bem feitos, transformam LLMs de geradores de texto impressionantes em componentes confiáveis que podem recuperar, computar, agir e se recuperar — sob restrições do mundo real.