R
Interview Deckreact · next.js · senior/staff
0·0·122
IA Avançado

Agentes e Function Calling

LLMs que executam ferramentas, tomam decisões sequenciais e operam em loops de raciocínio.

Agentes LLM combinam raciocínio com ação: o modelo decide qual ferramenta usar, executa, processa o resultado, e continua. Function calling (OpenAI) / tool use (Anthropic) permite definir funções que o modelo pode invocar com parâmetros estruturados. Padrões: ReAct (Reason + Act em loop), Plan-and-Execute (planejar, depois executar), e Reflexion (avaliar e melhorar saída). Frameworks: LangChain, LlamaIndex, Vercel AI SDK.

Problema
LLMs sozinhos não conseguem: buscar informações atuais, executar código, fazer chamadas de API, ou completar tarefas que requerem múltiplos passos com estados intermediários.
Solução
Definir tools como funções tipadas com description clara. O LLM decide quando e como chamar. O app executa a função e retorna o resultado. O LLM continua com o resultado. Loop até o LLM decidir que terminou (stop condition).
Tip
A description das tools é o prompt mais importante para agentes — o modelo decide qual tool usar baseado nela. Seja específico: "busca no banco de dados de produtos por nome ou categoria" é melhor que "busca produtos". Limite o número de tools por agente — muitas opções aumentam a chance de escolha errada.
// Tool use com Anthropic SDK
import Anthropic from '@anthropic-ai/sdk'

const tools = [
  {
    name: 'search_products',
    description: 'Busca produtos no catálogo por nome, categoria ou preço máximo',
    input_schema: {
      type: 'object',
      properties: {
        query: { type: 'string', description: 'Termo de busca' },
        max_price: { type: 'number', description: 'Preço máximo em reais' },
        category: { type: 'string', enum: ['eletronicos', 'roupas', 'livros'] }
      },
      required: ['query']
    }
  }
]

async function runAgent(userMessage: string) {
  const messages = [{ role: 'user', content: userMessage }]

  for (let i = 0; i < 10; i++) { // max 10 iterações
    const response = await client.messages.create({
      model: 'claude-opus-4-5', tools, messages,
      max_tokens: 1024,
    })

    if (response.stop_reason === 'end_turn') break // terminou

    if (response.stop_reason === 'tool_use') {
      const toolUse = response.content.find(b => b.type === 'tool_use')
      const result = await executeTooll(toolUse.name, toolUse.input)

      messages.push(
        { role: 'assistant', content: response.content },
        { role: 'user', content: [{ type: 'tool_result', tool_use_id: toolUse.id, content: JSON.stringify(result) }] }
      )
    }
  }
}
Q.Diferença entre function calling e tool use?
A.Mesma ideia, nomes diferentes por provider. OpenAI chama de "function calling", Anthropic de "tool use", Google de "function declarations". Todos permitem definir um schema JSON das funções, o modelo retorna um JSON estruturado com a função a chamar e os parâmetros, e você executa e retorna o resultado.
Q.O que é o padrão ReAct?
A.Reason + Act: o agente alterna entre raciocinar (Thought: preciso buscar X) e agir (Action: search("X")). Cada ciclo é: Thought → Action → Observation (resultado da tool). O modelo usa a observation para o próximo raciocínio. Isso cria um loop de raciocínio + ação mais confiável do que só gerar a resposta final diretamente.
Q.Como garantir que um agente não entra em loop infinito?
A.Max iterations limit obrigatório. Timeout por execução total. Stop conditions explícitas no system prompt ("quando tiver a resposta final, use a tool respond()"). Detectar estados repetidos (mesma tool com mesmos parâmetros 2x). Human-in-the-loop para agentes que executam ações irreversíveis (enviar email, deletar dados).
88/122← →