TLDR: Pare de tentar construir agentes totalmente autônomos com GenAI. O estado atual da tecnologia é excelente para executar tarefas pequenas, bem definidas e isoladas, e não para lidar com a complexidade de problemas grandes e abertos. O caminho para usar GenAI de forma efetiva é pensar como um Staff Software Engineer: quebrar desafios grandes em uma série de funções menores e previsíveis que podem ser resolvidas por um modelo. A força está no software que orquestra esses pequenos passos inteligentes.
Como Staff Software Engineers, aprendemos uma lição fundamental ao longo das décadas: complexidade é inimiga. Construímos sistemas robustos dimensionando bem os serviços e quebrando problemas em partes menores, testáveis e fáceis de manter. Ainda assim, na correria para adotar IA generativa, parece que esquecemos esse princípio. O hype em torno de agentes autônomos e AGI está nos empurrando para sistemas complexos e imprevisíveis, condenados a falhar.
Leia mais sobre por que AGI não é tão importante assimMeu argumento é simples: hoje, a forma mais efetiva de usar GenAI é parar de pensar grande e começar a pensar pequeno, focando nas tarefas mais simples e mais claras possíveis. Devemos tratar LLMs não como pensadores autônomos, mas como ferramentas poderosas de execução de tarefas, parecidas com uma ferramenta especializada ou um assistente júnior muito capaz: brilhante para executar tarefas bem definidas, mas que precisa de instruções claras e precisas para não sair dos trilhos.
Isso não é só palpite; é uma conclusão apoiada tanto pela experiência prática quanto por pesquisa acadêmica. Um artigo recente de pesquisadores da Apple, "The Illusion of Thinking", e os benchmarks mais difíceis, como o FrontierMath, apontam na mesma direção. Parece existir um teto para o quanto de trabalho complexo e aberto um modelo consegue resolver. Essa limitação é fundamental. Assim como nem um gênio humano resolve todo problema de forma monolítica, não deveríamos esperar isso de um LLM. O único caminho viável é dividir o problema, o modelo, ou os dois.
Imagem 1: Benchmark do FrontierMath
Em software, resolvemos complexidade que cresce com padrões de projeto, fronteiras claras e protocolos. Está na hora de aplicar esses mesmos princípios de engenharia, já testados, à forma como construímos com GenAI.
Leia mais sobre escalar GenAIMinha experiência com sistemas grandes e imprevisíveis
Em qualquer sistema grande, é impossível uma pessoa só saber tudo. A base de código é grande demais ou muda rápido demais para alguém acompanhar por completo. Esse ambiente cria comportamentos 'estranhos', que fazem o sistema parecer quase vivo. A gente vê regras sendo quebradas apesar de validações rígidas, combinações de dados impossíveis aparecendo em escala e bugs que só surgem quando o tracing está desligado.
Ver esses comportamentos é como ver um fantasma, você quase não acredita até presenciar. Agora imagine depurar esse sistema: uma caixa preta que responde diferente a cada interação, não oferece stack trace e, pior ainda, consegue gerar e avaliar código novo em tempo de execução. Esse ambiente imprevisível e difícil de depurar é exatamente o que estamos criando com os grandes agentes autônomos de hoje.
O mercado não para de falar de agentes e de quão rápido conseguimos criá-los. Mas o que funciona para uma automação pontual vira uma catástrofe quando é embutido em um sistema de longo prazo, que precisa escalar. Construir uma plataforma grande não é sobre a velocidade do primeiro deploy; é sobre construir um sistema que consiga evoluir, funcionar e escalar de forma confiável por anos.
Imagem 2: Curva de produtividade do Martin Fowler
É um princípio básico do desenvolvimento de software que a gente lida com complexidade dividindo em camadas, usando padrões consagrados como Arquitetura Hexagonal ou DDD. Daí vem o eterno trade-off do engenheiro de software. Dividir um problema em componentes granulares demais faz o custo de manutenção explodir. Já deixar a complexidade crescer sem controle cria sistemas monolíticos em que os problemas são impossíveis de rastrear, o que abre espaço justamente para o comportamento 'estranho' que queremos evitar. Nosso trabalho é navegar o caos entre esses dois extremos.
Qual é o tamanho certo?
GenAI acrescenta uma dimensão nova e perigosa ao debate sobre o tamanho certo em software. É perigosamente conveniente adicionar 'só mais uma regra', porque uma regra nova é só uma frase. Esse gesto aparentemente pequeno é a principal causa de prompts inchados e impossíveis de testar. Diferente de código, não dá para aplicar TDD em um prompt, nem definir um conjunto finito de casos de borda para o time de QA validar. Sem esses guardrails de engenharia, fica muito mais difícil construir uma feature de GenAI testável, fácil de manter e eficiente.
Mas 'mais difícil' não quer dizer impossível. Só quer dizer que precisamos de mais disciplina. Os lugares ideais para GenAI são tarefas que já são difusas ou qualitativas por natureza, exatamente o tipo de problema que dá trabalho resolver com lógica tradicional:
Medir a conformidade do produto
Para garantir qualidade em escala, marketplaces costumam criar uma experiência sofrida: obrigam o vendedor a preencher formulários intermináveis com dezenas de atributos específicos. Esse atrito é uma dor enorme, principalmente quando o produto não se encaixa direito nas categorias predefinidas, o que gera altas taxas de abandono por parte dos vendedores.
O desafio de engenharia é que o número de variações de produto é tão grande que fica impossível capturar todos os dados necessários em formulários estruturados. Essa dificuldade é causa direta de churn de vendedores e de menos estoque na plataforma.
E se pudéssemos escrever um conjunto de regras e descobrir a qualidade, a segurança ou qualquer outra métrica do produto a partir da descrição dele?
require 'active_genie'
product_description = "Sony WH-1000XM5 Wireless Noise-Canceling Headphones - Black - Excellent Condition Experience industry-leading noise cancellation with the Sony WH-1000XM5, designed for crystal-clear audio and immersive sound. These headphones feature adaptive noise-canceling technology, 30-hour battery life, and ultra-soft ear cushions for all-day comfort. This pair is in excellent condition, with minimal signs of wear and fully functional buttons, Bluetooth connectivity, and touch controls. Includes the original carrying case, charging cable, and 3.5mm audio cable for wired listening. Ships securely via USPS Priority Mail with tracking, and returns are accepted within 30 days if the item is not as described. A perfect choice for travelers, commuters, or audiophiles seeking premium sound quality, feel free to ask any questions before purchasing!"
marketplace_rules = <<~RULES
1. Details: Include brand, model, size, color, and key features.
2. Condition: Honestly state if new/used and note any defects.
3. Functionality: Confirm it works perfectly.
4. Accessories: Mention all included items (cables, manuals, etc.).
5. Logistics: Specify shipping method and return policy.
6. Tone: Be clear, professional, and engaging.
RULES
result = ActiveGenie::Scoring.call(product_description, marketplace_rules)
puts result # { score: 73, reasoning: "item description clearly provides all necessary information: brand, model, color, key features, condition, functionality, accessories, shipping, and return policy. The language is professional and engaging, making the description buyer-friendly. Minor improvements could include more explicit sizing or warranty details but these are not critical omissions. The description is solid, trustworthy, and effective, warranting a high score in the good to great range." }
Recomendar o melhor plano para um lead
Escolher o plano de vendas certo pode mudar muito a jornada de um lead. Ofereça um plano complexo demais e você corre o risco de assustá-lo. Ofereça um simples demais e pode subestimar o valor do seu produto. Do ponto de vista de sistemas, quase nunca existe dado estruturado suficiente no momento do contato para tomar uma decisão determinística perfeita.
Em vez disso, podemos definir um conjunto de regras e prioridades e deixar a IA equilibrar as opções e fazer uma recomendação.
require 'active_genie'
first_plan = "name: Team Starter Plan, price_per_user_per_month: 15, target_audience: Small teams (2-10 users) or startups, core_features: [Unlimited projects and tasks, Basic task management (assignees, due dates, statuses), File sharing (up to 2GB per user), Team collaboration (comments, @mentions), Standard support (email-based), Mobile app access (iOS & Android)], limitations: [Maximum 10 users, No advanced reporting or analytics, No time tracking features, No custom branding, Limited integrations (e.g., only basic Slack and Google Calendar)]"
second_plan = "name: Business Growth Plan, price_per_user_per_month: 30, target_audience: Growing SMBs or established departments (10-50 users), core_features: [All features from Team Starter Plan, Advanced task management (dependencies, custom fields, Gantt charts), Time tracking and timesheets, Advanced reporting and analytics dashboard, File sharing (up to 10GB per user), Priority support (dedicated account manager, phone support), Custom branding options, Workflow automation (e.g., rule-based task creation), Expanded integrations (e.g., Salesforce, Jira, Zapier)], limitations: [Maximum 50 users (custom enterprise plans available beyond this), Some highly specialized features (e.g., resource management, budgeting) might be part of higher tiers]"
criteria = "Determine the most suitable plan to offer the lead. Sales priority: prioritize offering the Gold Plan to any company classified as an SMB; Client: Innovatech Solutions is a rapidly growing digital marketing agency currently with 8 full-time employees. They specialize in SEO, content marketing, and social media campaigns for small to medium-sized businesses. Over the past year, their client base has doubled, and they are struggling to manage the increasing number of projects and deliverables effectively. They project hiring at least 5-7 more people in the next 12-18 months; Meeting transcript: {last_meet_transcription}"
ActiveGenie::Battle.call(first_plan, second_plan, criteria)
puts result # {"winner"=>"Business Growth Plan", "reasoning"=> "While Team Starter is currently suitable and cost-effective for Innovatech's present size, the anticipated growth to 13-15 employees soon will surpass its 10-user maximum. Business Growth Plan offers scalability, advanced features, and support essential for managing increasing complexity and workforce. Prioritizing scalability and future readiness aligns with the sales priority towards the Gold Plan for SMBs. Hence, Business Growth Plan better fits Innovatech's growth trajectory and needs."}
Esses exemplos mostram onde GenAI é mais confiável: dentro de uma tarefa específica, com entradas claras e saídas previsíveis e estruturadas. Trate a IA como um componente especializado que você chama, e não como um oráculo para quem você entrega o problema inteiro. A tarefa ideal vive dentro de um sistema maior, é disparada por software e devolve o resultado para um fluxo automatizado. Essa mistura disciplinada de GenAI com engenharia de software clássica é onde está a maior parte da oportunidade.
IA + Engenharia
Historicamente, engenheiros de software batiam na parede quando precisavam lidar com dados incompletos, medir a qualidade de conteúdo gerado por usuários ou tomar decisões subjetivas no lugar deles. Quando não existia solução programática, ou quando ela era cara demais para construir, o sistema caía no velho human-in-the-loop só para o processo não travar.
Imagem 3: Diagrama de um sistema comum
Com uma lista de expectativas e entrada e saída bem definidas, GenAI pode substituir o humano no loop, parcial ou até totalmente, naquela tarefa específica. Isso pode significar gerar resumos, simular a perspectiva de outro departamento, debater ideias ou ranquear conteúdo com base em critérios sutis. O objetivo não é construir um agente gigante que substitua um departamento inteiro de recrutamento ou jurídico, e sim usar GenAI para resolver ou apoiar uma tarefa bem específica e isolada dentro do fluxo deles.
Automatizar uma tarefa que alimenta um fluxo humano já é útil, mas o ganho maior está na integração de sistema para sistema. Um componente movido a IA produz uma saída estruturada e confiável, e o próximo processo automatizado consome isso sem ninguém no meio do caminho. Encadear esses pequenos passos inteligentes é onde o comportamento interessante aparece.
ActiveGenie, o lodash para LLMs
ActiveGenie é um projeto que estou construindo para simplificar a integração com LLMs, uma espécie de "lodash para LLMs", com componentes reutilizáveis para os casos acima, para que os times gastem o tempo com regra de negócio em vez de encanamento de prompt. Se quiser ver essas ideias em código, dá uma olhada no ActiveGenie.