A engenharia de sistemas baseados em Grandes Modelos de Linguagem passou por uma transformação radical em ambientes de produção, de meros textos e instruções aleatórias associadas a códigos de ligação simples para estruturas executivas estruturadas conhecidas como estruturas agênticas (Agentic Harnesses). Esta evolução visa envolver os modelos probabilísticos com o suporte de software necessário para garantir a confiabilidade, a robustez e a observabilidade em ambientes de trabalho reais.
Fase 1: Cadeias e Operações Lineares Simples
Os sistemas iniciais baseavam-se em fluxos de trabalho lineares e simplificados conhecidos como cadeias (Chains). Esta abordagem caracteriza-se pela rapidez de execução e pelo baixo custo computacional em tarefas específicas, como o resumo simples. A ideia baseia-se em passar a saída da primeira etapa para servir como entrada para a segunda etapa, e assim por diante, utilizando os modelos como caixas pretas que recebem e produzem textos.
Por exemplo, o LinkedIn utilizou, em suas fases iniciais, cadeias fixas que incluíam classificação e roteamento, seguidas pela recuperação de dados através de ferramentas de pesquisa para contextualizar a resposta e, finalmente, geração e filtragem. Apesar da rapidez no desenvolvimento, estes sistemas sofriam de fragilidade estrutural; qualquer erro numa etapa inicial causava a interrupção de todo o fluxo de trabalho devido à ausência de mecanismos de resposta e correção automática.
Fase 2: Grafos para Reforço de Estrutura e Controle
Com o aumento da complexidade dos casos de uso, os desenvolvedores migraram para o uso de estruturas de grafos (Graphs) para introduzir ramificações condicionais, paralelismo, tentativas de reexecução e gestão de estado (State Management). Os nós nestas estruturas representam as diferentes tarefas, enquanto as arestas controlam o fluxo de controle.
Estas estruturas permitiram o design de sistemas multiagentes (Multi-Agent Systems) com um coordenador principal que gere o fluxo de tarefas e a comunicação assíncrona para garantir a ordem e a continuidade. Estas arquiteturas foram utilizadas no lançamento do Assistente de Contratação (Hiring Assistant) para permitir que os recrutadores automatizassem tarefas rotineiras. No entanto, estes frameworks permaneceram limitados a fluxos de trabalho definidos por humanos, o que pode tornar a manutenção complexa quando o âmbito dos casos excecionais se expande.
Fase 3: Programação como Ferramenta Fundamental de Raciocínio
A evolução mais recente reside na dependência de código em vez de instruções linguísticas visuais como o meio principal de raciocínio. Em vez de se limitarem à interpretação textual de problemas, estas estruturas geram código e executam-no em ambientes isolados e testados.
O código caracteriza-se pela sua natureza determinística e verificável, em comparação com os resultados probabilísticos não garantidos dos modelos de linguagem. Esta arquitetura baseia-se num ambiente de execução isolado, ferramentas de registo e monitorização, estruturas de verificação automática e ciclos de depuração iterativos que corrigem erros e reiniciam o código até que os critérios exigidos sejam atingidos. O LinkedIn aplicou esta abordagem internamente para permitir que os funcionários consultem dados através de linguagens de consulta estruturadas e Python, de acordo com os quadros de privacidade e governação.
Melhores Práticas para Engenharia de Sistemas Agênticos
- Tratar as saídas como dados não confiáveis: É necessário validar as saídas dos modelos antes de as passar para qualquer lógica de programação subsequente.
- Separar o planeamento da execução: Permitir que o modelo sugira planos enquanto um framework de programação rigoroso assume o processo de execução.
- Investir na monitorização: Rastrear os estados de execução com precisão para rever erros e registos de estado sem comprometer dados sensíveis.
- Desenvolvimento contínuo: Construir ciclos de feedback analítico para melhorar o desempenho dos sistemas ao longo do tempo.
Escolhendo a Abstração de Engenharia Adequada
Nem todos os problemas técnicos exigem a complexidade operacional de grafos ou de código avançado. As cadeias simples continuam a ser a opção mais adequada e de menor custo em termos de tempo e capacidade computacional para tarefas diretas, como resumo e processamento de conteúdo. Enquanto os grafos tornam-se necessários quando há necessidade de ramificação e controlo de estado, os frameworks de programação são utilizados em áreas críticas que exigem precisão e verificação rigorosas, como engenharia de software e análise de dados complexos.