- A Qodo é uma equipe que desenvolve ferramentas de assistência à programação com IA desde a era do GPT-3 e, mais recentemente, escolheu o framework LangGraph para criar agentes de programação mais flexíveis e dinâmicos
- Este documento explica como o LangGraph conseguiu atender ao mesmo tempo à flexibilidade do fluxo de desenvolvimento e aos padrões de qualidade de código
Da abordagem estrutural inicial à transição para o LangGraph
- No início, com base no GPT-3, o foco estava em tarefas estruturadas com fluxos claros, como geração de testes, revisão de código e melhorias
- Após o Claude Sonnet 3.5, o desempenho dos LLMs melhorou bastante, tornando possível projetar agentes mais dinâmicos
- Antes, só eram possíveis workflows padronizados, mas a ideia passou a ser desenvolver um sistema capaz de responder com flexibilidade às solicitações dos usuários usando os novos modelos
- No processo de buscar um framework que permitisse experimentação e validação rápidas, a escolha acabou sendo o LangGraph, que conseguiu ir além da prova de conceito inicial e escalar até um produto real
Convivência entre flexibilidade e regras claras
- O LangGraph oferece uma estrutura em grafo baseada em uma máquina de estados (
state machine)
- Cada nó é responsável por uma etapa individual do workflow (coleta de contexto, planejamento, execução, validação etc.), e as arestas (
edges) definem as regras de transição entre as etapas
- Dependendo da densidade das arestas, o workflow pode ficar mais flexível ou mais estruturado
- Grafo esparso → fluxo fixo e previsível
- Grafo denso → fluxo dinâmico e possibilidade de escolher vários caminhos
- A vantagem do LangGraph é que, à medida que os modelos evoluem, o grau de estruturação do workflow pode ser reajustado com facilidade
- O fluxo principal tem a seguinte estrutura:
- Coleta de contexto → planejamento da tarefa → execução de código → validação do resultado → repetição em caso de falha
Interface simples e intuitiva
- O LangGraph permite definir workflows de forma declarativa, fazendo com que o código seja lido quase como um documento
- Ele funciona declarando um grafo de estados e adicionando nós e arestas
- Fluxos condicionais também podem ser implementados facilmente (ex.: em caso de falha na validação, voltar em loop para o nó de execução)
- Diferentemente das abstrações complexas do LangChain, o LangGraph expõe a lógica da estrutura, oferecendo uma boa experiência para desenvolvedores
Reutilização entre diferentes workflows
- Graças à estrutura baseada em nós, é fácil reutilizar componentes
- Ex.: os nós de coleta de contexto e validação são reutilizados na maioria dos fluxos
- Mesmo ao criar novos fluxos especializados (como TDD), é possível expandir rapidamente reconectando nós já existentes
Recursos nativos de gerenciamento de estado
- O LangGraph oferece armazenamento de estado por padrão, o que torna muito simples implementar persistência
- Ex.: o recurso de checkpoint com Postgres pode ser configurado com apenas algumas linhas de código
- É possível salvar o estado completo, incluindo contexto coletado, planejamento e resultados de execução, além de haver suporte a branches e rollback
- Outros métodos, como SQLite e memória em processo, também podem ser trocados com facilidade
Pontos que ainda precisam melhorar
- Como é um framework em rápida evolução, às vezes a documentação é incompleta ou demora para ser atualizada
- Felizmente, a comunicação com os mantenedores via Slack foi rápida e bastante ativa
- Testar sistemas LLM não determinísticos continua sendo um desafio
- No caso de agentes que interagem com a IDE, é difícil montar um ambiente de testes automatizados
- Alguns recursos da IDE são muito difíceis de mockar, então foi necessário depender de testes manuais, o que acabou deixando a iteração mais lenta
- Frameworks mais maduros costumam oferecer infraestrutura de testes e mocking, e a expectativa é que o LangGraph evolua nessa direção
Ainda não há comentários.