DEV Community

Captain
Captain

Posted on

Entendendo o Agentic Coding via Primeiros Princípios: Da Teoria à Prática (Parte 1)

Primeiros Princípios: A Essência dos LLMs

Como um LLM "pensa"?

O funcionamento de um grande modelo de linguagem resume-se a uma única tarefa: prever o próximo token.
Ao receber uma pergunta, o LLM não elabora uma resposta completa mentalmente para depois transcrevê-la. Ele opera em um ciclo contínuo: observa o texto disponível (sua pergunta + o que ele já escreveu) e calcula qual é o próximo termo mais provável. Esse processo, repetido exaustivamente, é chamado de Geração Autorregressiva.
Compreender esse mecanismo revela traços fundamentais da IA:

  1. O raciocínio é a própria escrita: Não existe "pensamento" separado da saída de dados. O modelo pensa enquanto fala. É por isso que técnicas como Chain-of-Thought (Cadeia de Pensamento) são eficazes; você está, literalmente, dando ao modelo mais "espaço de rascunho" para processar a lógica antes de chegar ao veredito.

  2. O contexto é a única memória: O LLM não possui um depósito de memórias independente da conversa atual. Sua "compreensão" limita-se ao que cabe na janela de contexto. Fora dali, o mundo não existe.

  3. A natureza é probabilística: Cada passo é uma aposta estatística. Por isso, a mesma pergunta pode gerar respostas distintas.

O Gargalo dos Coding Agents
Essa arquitetura autorregressiva é poderosa e versátil, mas cria limitações críticas para o desenvolvimento de software — um campo definido por cadeias longas de dependências e regras rígidas.

  1. Ótimos locais vs. Planejamento Global Prever o próximo passo não garante uma visão macro. O agente pode escrever um trecho de código funcional, mas arquiteturalmente inconsistente, gerando uma "dívida técnica" instantânea por falta de um plano mestre.

  2. O Efeito Bola de Neve Se o modelo interpreta mal um requisito no início, ele passará o restante do tempo tentando ser coerente com esse erro. Se ele "inventar" uma função inexistente, passará a acreditar fielmente na existência dela até que o erro de compilação o traga de volta à realidade.

  3. A Fluidez impede a Precisão LLMs são excelentes em criar arquivos novos, mas medíocres em realizar edições cirúrgicas. Eles tendem a reescrever blocos inteiros em vez de alterar apenas a linha necessária, o que polui os diffs e torna a revisão de código um pesadelo.

  4. O Conflito entre Probabilidade e Sintaxe O código exige rigor absoluto; o LLM entrega verossimilhança estatística. Erros em condições de borda, concorrência ou tipagem genérica são comuns porque, para o modelo, a solução "parece correta" textualmente, mesmo sendo logicamente falha.

  5. Pensamento Linear e Unilateral Diferente de um desenvolvedor humano que testa várias hipóteses em paralelo, o LLM tende a apostar em um único caminho precocemente. Se esse caminho for um beco sem saída, ele raramente consegue "voltar atrás" e explorar alternativas de forma sistêmica.

Attention: O "olhar" do modelo sobre o contexto

Para prever o próximo token, o modelo precisa identificar o que é relevante no mar de informações anteriores. Esse processo de filtragem é realizado pelo mecanismo de Attention (Atenção).
Pense na Atenção como um holofote dinâmico: a cada nova palavra gerada, o modelo varre todo o contexto e atribui pesos distintos a diferentes posições. Trechos com alta pontuação iluminam o próximo passo da geração; o restante permanece na penumbra, quase ignorado.
Tecnicamente, para cada novo elemento, o modelo executa três etapas:

  1. Mapeia a correlação: Cruza a posição atual com cada termo do histórico.

  2. Distribui importância: Atribui pesos maiores aos pontos de maior relevância, criando uma distribuição de probabilidade.

  3. Agrega o valor: Consolida as informações ponderadas para fundamentar a próxima predição.

As Propriedades Fundamentais
Este mecanismo possui características que definem as fronteiras da IA atual:

  • Atenção é esparsa: O modelo não olha para tudo com a mesma intensidade. Na prática, o foco converge para poucos pontos cruciais, enquanto a vasta maioria do contexto recebe peso próximo de zero.

  • O "foco" é lapidado pelo treino: O modelo aprende, por meio da experiência, a priorizar certas estruturas. Isso pode criar vícios, como a tendência de dar mais importância ao início e ao fim de um parágrafo (o chamado viés de recência/primazia).

  • A escalabilidade é quadrática ($O(n^2)$): O calcanhar de Aquiles da arquitetura Transformer. Como o modelo precisa calcular a relação de cada palavra com todas as outras, o esforço computacional cresce ao quadrado do comprimento do texto. Se você dobra o contexto, o custo não dobra — ele quadruplica. Esta é a barreira física que impede, por ora, contextos infinitos.

Janela de Contexto: O Gargalo Inflexível

A limitação do contexto é a restrição mais crítica no design de um Coding Agent. Ao aplicarmos o que sabemos sobre o mecanismo de Atenção, percebemos que esse teto não é apenas um número, mas um desafio dividido em três camadas:
O Teto Físico
A maioria dos modelos atuais opera com limites entre 128K e 200K tokens. Essa barreira é imposta por dois fatores matemáticos implacáveis:

  • Complexidade Quadrática ($O(n^2)$): Se você dobrar o volume de dados, o processamento necessário quadruplica.

  • Custo de Memória: O armazenamento da matriz de atenção completa também cresce de forma quadrática, tornando inviável o processamento além de certo ponto.

  • O que ultrapassa esse limite simplesmente deixa de existir para a IA.

Contexto Nominal vs. Contexto Efetivo

Existe uma diferença abismal entre o que o modelo "suporta" e o que ele "compreende". Embora um modelo prometa 200K tokens, sua performance raramente é linear.
O problema reside na dispersão da atenção: em contextos vastos, o "holofote" precisa iluminar uma área grande demais. Se a informação crucial for apenas um pequeno trecho em um oceano de logs ou arquivos secundários, sua relevância é diluída. Na prática, muitos modelos começam a apresentar falhas graves de "esquecimento" ou alucinação muito antes de atingirem 50% de sua capacidade nominal.
A Curva de Degradação
À medida que o contexto se alonga, não é apenas a memória que falha — é a inteligência do sistema como um todo. A precisão do raciocínio, a aderência às instruções e a qualidade do código gerado entram em declínio.
Trata-se de um efeito cumulativo da arquitetura autorregressiva:

  1. Cada passo da geração depende de uma leitura perfeita do contexto anterior.

  2. Contextos maiores geram atenções mais difusas e interpretações ruidosas.

  3. Um pequeno erro de compreensão na linha 10 propaga-se e se amplifica até a linha 100, criando um efeito dominó de falhas lógicas.

Conclusão para o Desenvolvedor: Construir um Coding Agent eficiente não é sobre "enfiar" todo o repositório na janela de contexto. É sobre curadoria. É sobre estratégia. É sobre saber exatamente o que o modelo precisa ver para não se perder no próprio ruído.

Reinforcement Learning: Da Oratória à Ação

Até aqui, exploramos a base dos LLMs: a capacidade de prever o próximo token. No entanto, para que o modelo evolua da "eloquência" para a "execução", entra em cena o Aprendizado por Reforço (Reinforcement Learning - RL).

O Abismo do Pré-treino
O pré-treino é, essencialmente, um exercício de imitação. Ao consumir montanhas de texto, o modelo aprende a prever como um humano terminaria uma frase. Isso gera fluidez, mas traz limitações severas:

  • O modelo aprende a estética da resposta, não a eficácia da solução.

  • Dados de treino raramente contêm o ciclo dinâmico de "agir → observar erro → corrigir rota".

  • O resultado é uma IA que propõe passos que parecem plausíveis, mas que falham na prática.

Em suma: o pré-treino ensina a falar; o RL ensina a fazer.

O Ciclo do RL: Tentativa, Feedback e Ajuste
O Aprendizado por Reforço substitui a imitação pela experiência. Imagine ensinar xadrez a uma criança: em vez de obrigá-la a decorar milhões de partidas (pré-treino), você a coloca diante do tabuleiro. Se ela vence, recebe um elogio; se perde, analisa o erro.
No universo dos LLMs, o processo segue a mesma lógica:

  1. Tentativa: O modelo executa uma ação em um ambiente real ou simulado (ex: rodar um comando no terminal).

  2. Feedback: O sistema envia um sinal de recompensa (O código compilou? O build passou? O erro desapareceu?).

  3. Ajuste: O modelo calibra seus parâmetros internos para favorecer as ações que geraram recompensas positivas.

Por que o RL é a Alma do "Agent"
Diferente do ajuste fino tradicional, que exige que um humano dite o "caminho certo", o RL é orientado a resultados. Na programação, isso é vital porque:

  • Os caminhos são infinitos: Não existe apenas uma forma correta de refatorar um código.

  • O sucesso é binário: O que importa é se o sistema funciona, não se o Agent seguiu um roteiro "padrão".

  • A exploração é necessária: Muitas vezes, o Agent precisa errar uma abordagem para descobrir a dependência oculta que resolve o bug.

Implicações para o Usuário
Entender o papel do RL muda a forma como interagimos com as IAs:

  • Defina critérios de vitória claros: Quando você diz "Conserte o bug e garanta que npm test passe", você está fornecendo o sinal de recompensa exato que o modelo foi treinado para buscar.

  • Permita o erro: Agents foram moldados pela tentativa. Dar ao modelo várias chances de execução é mais produtivo do que esperar uma solução perfeita na primeira linha.

  • Observe a estratégia: Se o Agent decide ler a documentação antes de editar um arquivo, ele não está "gastando tokens" à toa; ele está aplicando uma estratégia de minimização de erro aprendida via RL.

A Engenharia por trás do Coding Agent

Compreendidos os fundamentos e as amarras dos LLMs, podemos agora desvendar como os Coding Agents são projetados para operar dentro dessas limitações. Tudo começa na ponte que conecta o desenvolvedor ao modelo: a API.

A Estrutura Central: Conversas Baseadas em Mensagens

As APIs de modelos de linguagem modernos não funcionam como um formulário simples de pergunta e resposta. Elas operam sob uma estrutura de diálogo persistente, essencial para a construção de qualquer sistema agentic.
O Array de Mensagens
O coração da API é uma lista ordenada de objetos conhecida como Messages Array. Cada item nesse array é uma peça do quebra-cabeça que define o estado atual da tarefa. Uma mensagem padrão é composta por dois pilares:

  • Role (Papel): Define a identidade da mensagem (quem está falando).

  • Content (Conteúdo): O dado textual ou técnico propriamente dito.

{
  "messages": [
    {
      "role": "system",
      "content": "你是一个专业的编程助手..."
    },
    {
      "role": "user",
      "content": "帮我写一个快速排序函数"
    },
    {
      "role": "assistant",
      "content": "好的,这是一个 Python 实现的快速排序..."
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

A Trindade dos Papéis

Para que a colaboração funcione, a API organiza a conversa em três frentes distintas, cada uma com uma missão clara:

  • System (O Arquiteto): É aqui que definimos o "DNA" do Agent. Estabelecemos suas diretrizes de comportamento, limites éticos, capacidades técnicas e o inventário de ferramentas disponíveis. O modelo consulta essa mensagem constantemente para saber quem deve ser e o que pode fazer.

  • User (O Cliente): Representa a voz humana. Contém os pedidos, as dúvidas e os problemas relatados pelo usuário.

  • Assistant (O Executor): São as respostas geradas pelo modelo. É o registro histórico do raciocínio e das ações que a IA propôs até aquele momento.


O Mecanismo de Tool Calling

Se as mensagens são a voz do Agent, o Tool Calling (Chamada de Ferramentas) é o seu braço mecânico. A verdadeira autonomia de um Coding Agent reside na capacidade de interagir com o mundo real — ler arquivos, rodar testes ou realizar buscas no Git.
Em vez de apenas escrever um parágrafo sugerindo uma mudança, a API permite que você forneça um Schema (uma definição técnica rigorosa) de cada ferramenta. Quando o modelo percebe que não consegue resolver o problema apenas com palavras, ele gera uma solicitação estruturada (geralmente em JSON).
É como se a IA dissesse: "Eu não posso rodar esse comando, mas aqui estão os parâmetros exatos para você, sistema, executá-lo por mim" .

{
  "tools": [
    {
      "name": "read_file",
      "description": "读取指定路径的文件内容",
      "parameters": {
        "type": "object",
        "properties": {
          "path": {
            "type": "string",
            "description": "文件路径"
          }
        },
        "required": ["path"]
      }
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Abaixo, a versão final refinada:

{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    {
      "id": "call_abc123",
      "name": "read_file",
      "arguments": "{"path": "src/main.py"}"
    }
  ]
}
Enter fullscreen mode Exit fullscreen mode

Abaixo, a versão final recriada:

{
"role": "tool",
"tool_call_id": "call_abc123",
"content": "def main():n    print('Hello, World!')n..."
}
Enter fullscreen mode Exit fullscreen mode

O Monólogo Interno: Preservando o Raciocínio
Nos modelos de fronteira, a resposta da API evoluiu para incluir o que chamamos de Reasoning Content (Conteúdo de Raciocínio). Em vez de saltar direto para a resposta ou para a chamada de uma ferramenta, o modelo utiliza campos como reasoning ou thinking para registrar sua "cadeia de pensamento" deliberativa.

{
  "role": "assistant",
  "reasoning_content": "O usuário precisa ler os arquivos para entender a estrutura do projeto. Eu deveria começar analisando o arquivo principal dentro do diretório src...",
  "content": "Deixe-me dar uma olhada no arquivo principal do projeto primeiro.",
  "tool_calls": [...]
}
Enter fullscreen mode Exit fullscreen mode

Preservar o conteúdo de raciocínio em diálogos de múltiplas rodadas é o que garante a continuidade intelectual da IA. Ao "revisitar" suas próprias reflexões passadas, o modelo evita contradições e mantém decisões consistentes ao longo de uma refatoração complexa.

Prompt Caching: A Chave para a Viabilidade Técnica

Dada a natureza autorregressiva dos LLMs, cada nova interação exige, por padrão, o reprocessamento integral de todo o contexto. Em Coding Agents, onde as conversas escalam rapidamente para dezenas de milhares de tokens, essa redundância traduz-se em latência proibitiva e custos elevados.
O Prompt Caching surge como a solução de engenharia para esse impasse, permitindo o reaproveitamento dos cálculos de prefixos do contexto. O princípio de funcionamento é rígido: o cache baseia-se na correspondência de prefixo. O sistema só recupera os dados pré-calculados se o início da nova requisição for idêntico ao da anterior.
Esta característica impõe uma mudança de paradigma na organização dos seus prompts: a ordem das informações deixa de ser estética e passa a ser uma questão de eficiência sistêmica.

┌─────────────────────────────┐
│  System Prompt              │  ← Stable and unchanging, cacheable
├─────────────────────────────┤
│  Tool Definitions           │  ← Stable and unchanging, cacheable
├─────────────────────────────┤
│  Project Context            │  ← Relatively stable, try to change as little as possible
├─────────────────────────────┤
│  Conversation History       │  ← dynamically growing
├─────────────────────────────┤
│  Current User Message       │  ← changes every time
└─────────────────────────────┘
Enter fullscreen mode Exit fullscreen mode

Organização Estática e Dinâmica

Para maximizar o Prompt Caching, a estrutura do seu prompt deve seguir uma hierarquia de estabilidade:

  1. O Estático Primeiro: System prompts e definições de ferramentas devem vir no topo. Evite inserir variáveis voláteis (como timestamps) aqui.

  2. O Dinâmico por Último: Histórico de chat e inputs recentes ficam no final da pilha.

Agent Loop: O Motor da Autonomia

Enquanto um modelo de linguagem apenas responde, um Agent executa. O Agent Loop é a camada de orquestração que gerencia o ciclo "Raciocínio-Ação". É ele que permite à IA ler arquivos, consultar bancos de dados e rodar códigos para resolver tarefas que sua base de treino sozinha não alcançaria.

A Anatomia do Ciclo

O princípio é circular: Chamada ao Modelo → Verificação de Ferramenta → Execução → Retorno de Dados → Reavaliação. Cada iteração acumula contexto. O modelo não vê apenas o pedido inicial; ele observa o rastro de suas próprias ações e os resultados colhidos, permitindo um raciocínio multinível.

Exemplo Prático: Ao investigar um bug de sessão, o Agent não chuta a solução. Ele lista diretórios, lê arquivos de autenticação, rastreia chamadas assíncronas e só então aplica um patch e executa testes. Cada "rodada" é uma decisão baseada em evidências reais.


Desafios de Engenharia e Soluções

A Amnésia entre Sessões

Agents sofrem do "Efeito Memento": cada nova sessão é um recomeço do zero. O progresso de ontem é esquecido.

  • Solução: Utilize rastreadores de tarefas externos (como Issues) e exija que o Agent gere um Resumo de Estado ao final de cada sessão para servir de bússola na próxima.

O Esgotamento do Oxigênio (Contexto)

A janela de contexto é como um tanque de oxigênio: ela vai acabar. O acúmulo de logs e códigos lidos pode travar o Agent.

  • Observation Masking: Substituímos saídas de ferramentas antigas por placeholders ("Conteúdo omitido"), preservando apenas o raciocínio. É barato e mantém a lógica intacta.

  • LLM Summarization: Um segundo modelo condensa o histórico. É potente, mas pode omitir detalhes cruciais e aumentar o custo.

A "Dumb Zone" e a Degradação Cognitiva

Mesmo com janelas de 1M de tokens, a performance real degrada drasticamente após os primeiros 15-20%. Na chamada Dumb Zone (o meio do contexto), o modelo torna-se "esquecido", ignora novos bugs encontrados e pode declarar vitória precocemente sem ter terminado o serviço.

  • Regra de Ouro: Não confie na capacidade nominal. Reinicie a sessão ou limpe a memória assim que atingir 15% do limite para evitar alucinações.

Conclusão: Da Teoria à Maestria

Concluímos aqui nossa fundação sobre os Primeiros Princípios do Agentic Coding. Saímos da predição básica de tokens e passamos pela mecânica da Atenção, pelo rigor do RL e pela arquitetura dos Agent Loops.
Entender essas engrenagens é o que permite a você deixar de ser um mero usuário de "caixas-pretas" para se tornar um arquiteto de soluções de IA. Você agora sabe por que um Agent falha, por que o contexto importa e como o Caching dita a performance.
No próximo capítulo, levaremos essa teoria para a prática: vamos projetar fluxos de trabalho reais, escolher conjuntos de ferramentas otimizados e refinar a gestão de contexto para transformar esses princípios em produtividade bruta.

Top comments (0)