Hoje, estamos anunciando uma inovação de última geração que está ultrapassando os limites da geração de código de IA. Nossa equipe científica da NinjaTech AI desenvolveu uma nova abordagem para geração de código chamada “Multi-Programming Language Ensemble” (MPLE).
Usando essa abordagem com o Llama 3.1 405B Instruct, conseguimos mostrar estatisticamente um melhor desempenho do que o GPT-4o da OpenAI e o Sonnet 3.5 da Anthropic, conforme medido pelo benchmark HumanEval. Você pode encontrar esses resultados, junto com detalhes de nossa abordagem, em nosso artigo técnico publicado em arxiv.org.
Nesta postagem do blog, vamos nos aprofundar em três descobertas fundamentais relacionadas ao Multi-Programming Language Ensemble (MPLE), que tem o potencial de aprimorar significativamente os recursos de geração de código em todos os assistentes de IA:
- Uma abordagem de fluxo de trabalho agente (MPLE), para geração de código, produz uma precisão de 2 a 9% melhor de maneira econômica.
- A integração do MPLE com técnicas avançadas de inferência, como Reflection e Monte Carlo Tree Search (MCTS), aplicadas aos modelos LLM existentes, gera ganhos adicionais de desempenho.
- Para nossa agradável surpresa, observamos que as técnicas MPLE+MCTS baseadas em llama3.1-405b-instruct alcançaram uma precisão de 96,25% no HumanEval Benchmark.
O desafio da geração de código
Escrever código pode ser um desafio porque exige um profundo conhecimento das linguagens de programação e a capacidade de traduzir ideias complexas em código executável. Além disso, os desenvolvedores também precisam lidar com problemas como depuração, otimização e compatibilidade, o que pode tornar o processo de codificação ainda mais complexo e demorado.
É aqui que a IA ajuda; os modelos de linguagem grande (LLMs) podem gerar grandes quantidades de código rapidamente quando solicitados por um usuário. Desde que lançamos MyNinja.ai no final de maio de 2024, ele processou mais de 734 mil tarefas do Coder de aproximadamente 173 mil desenvolvedores.
Mas a geração de código de IA não elimina todos os desafios de escrever código. Os LLMs não são 100% confiáveis - eles podem cometer erros ao gerar código.
A razão pela qual os LLMs cometem erros é que as abordagens tradicionais de geração de código de IA dependem de uma única linguagem de programação, o que pode levar a erros e preconceitos específicos da linguagem. Por exemplo, um LLM pode ter um bom desempenho na geração de código Python porque foi treinado em Python. Porém, quando solicitado a criar um código C++ ou Java, ele pode não criar um resultado preciso devido às diferenças no tratamento de erros ou no uso da biblioteca. Outro motivo pelo qual um LLMs pode ter dificuldade em gerar código preciso é a dificuldade em traduzir texto legível por humanos (ou seja, o prompt do usuário) em código.
Uma solução para esse problema é investir em mais treinamento de modelos. As empresas podem gastar mais tempo — e cada vez mais dinheiro — treinando LLMs para responder a perguntas de codificação na primeira tentativa. Isso é chamado de aprendizado zero, o que significa que o modelo produz uma resposta correta sem exemplos, apenas um prompt, e gera uma resposta apropriada com base apenas em seu conhecimento prévio. No entanto, uma abordagem de zero tiro requer um enorme investimento de tempo e dinheiro (mais de $10 milhões a $100 milhões) para melhorar a precisão do modelo.
Mas os custos de inferência caíram mais de 100 vezes nos últimos 2 anos e continuam fazendo isso, dando origem a uma nova forma: fluxos de trabalho agentes para CodeGen.
Nossa solução: Multi-Programming Language Ensemble (MPLE)
Nossa equipe propôs uma nova abordagem para a geração de código de IA chamada Multi-Programming Language Ensemble (MPLE). Essa abordagem aproveita a força de várias linguagens de programação para gerar um código mais preciso e robusto usando uma abordagem multifacetada.
Em vez de confiar no modelo para criar uma resposta correta na primeira tentativa (tentativa única), interagimos com o LLM várias vezes para gerar a resposta correta. Cada vez que interagimos com o modelo, pedimos que ele resolva o problema do usuário usando uma linguagem de programação diferente. Isso nos permite aproveitar a força natural de um LLM - a capacidade de traduzir código de uma linguagem de programação para outra.
Pense no MPLE como uma equipe de especialistas, cada um bem versado em uma linguagem de programação diferente, trabalhando juntos para criar o código mais preciso na primeira tentativa. Cada especialista (ou linguagem de programação) apresenta seus pontos fortes exclusivos e, combinando seus pontos fortes, pode produzir uma solução mais precisa e confiável. A MPLE pede a todos esses especialistas que contribuam com sua “experiência” enquanto nosso sistema gera o código correto solicitado pelo usuário.
Veja como o MPLE funciona:
- Geração inicial de código: Quando um usuário solicita ao nosso sistema uma pergunta relacionada ao código, nosso modelo de IA gera uma resposta inicial na linguagem de programação solicitada pelo usuário.
- Amostragem e tradução em vários idiomas: Antes que a resposta seja devolvida ao usuário, o código é testado para garantir sua qualidade e precisão. Se o código não passar em todos os testes, nosso modelo gerará um novo código em uma linguagem de programação diferente. O novo código é então traduzido de volta para a linguagem de programação de solicitação do usuário. Essa versão alternativa difere da versão original porque aproveita os pontos fortes da linguagem alternativa, potencialmente eliminando os erros que causaram as falhas no teste.
- Refinamento iterativo: A versão do código refinado é testada novamente em relação aos casos de teste. Se não passar em todos os testes, o processo continuará iterando em diferentes linguagens de codificação até que uma versão passe com êxito em todos os testes. Quando o processo é concluído, uma resposta (ou seja, a versão final do código) é retornada ao usuário.
- Integração de conjunto: Ao longo das iterações, a estrutura do conjunto integra os pontos fortes de várias linguagens para refinar progressivamente o programa. Ao tratar cada geração de código específica de um idioma como um “especialista fraco” individual, a estrutura combina seus resultados para mitigar erros e preconceitos específicos do idioma.

É importante observar que essa abordagem não é um modelo novo, nem exige o retreinamento de um modelo. É um sistema que orquestra várias interações com seu LLM existente para criar a melhor resposta possível usando uma abordagem multifacetada. Acreditamos que, à medida que os custos de inferência continuarem caindo, o futuro dos resultados baseados em IA — que são economicamente viáveis — será liderado por fluxos de trabalho agentes que utilizam técnicas pesadas de inferência, em que muitos tokens são gerados para responder perguntas complicadas.
Validando o MPLE por meio de testes
Testamos a estrutura MPLE em dois benchmarks de geração de código amplamente reconhecidos: Avaliação humana e Humaneval-plus. Esses benchmarks medem a capacidade dos LLMs de gerar código funcional com base em um prompt do usuário.
O HumanEval foi projetado para tarefas de geração de texto em código, nas quais a entrada é um prompt do usuário descrevendo a funcionalidade pretendida do programa. A saída do LLM é então avaliada com base em sua capacidade de passar por testes unitários com requisitos especificados. O HumanEval-plus estende o HumanEval incorporando um grande número de casos de teste adicionais para avaliar rigorosamente a robustez e a correção do código.
Medimos a eficácia do MPLE usando o Pass @1. Esse método de avaliação de código mede a porcentagem de tarefas que são concluídas com êxito pelo código gerado na primeira tentativa.
Conduzimos experimentos usando nossos LLMs proprietários e outros modelos conhecidos, como GPT-4o, Claude-Sonnet-3.5 e LLama3.1-405b.
Nossos testes mostraram que a estrutura MPLE proposta melhora consistentemente a precisão do Pass @1 em todos os LLMs testados quando comparada a uma linha de base. Por exemplo, A precisão do GPT3.5-Turbo aumentou de 65,83% na linha de base para 74,17% com o MPLE, destacando a eficácia de aproveitar várias linguagens de programação para reduzir preconceitos e erros específicos da linguagem (consulte a Tabela 1).

Integrar o MPLE com Reflection & Monte Carlo produz melhores resultados
Nós impulsionamos o MPLE ainda mais e projetamos um sistema que integra o MPLE com técnicas avançadas de inferência, como Reflection e MCTS. Essas técnicas são usadas para aprimorar as habilidades de resolução de problemas e raciocínio dos LLMs, especialmente quando se trata de tarefas que exigem uma tomada de decisão estratégica ou em várias etapas. Nossa hipótese era que a combinação desses sistemas produziria resultados ainda maiores do que usar o MPLE sozinho. Por meio de uma série de testes, conseguimos provar que essa hipótese é verdadeira.
Também testamos o MPLE usando o benchmark HumanEval-plus e os resultados validam ainda mais os benefícios de nossa abordagem de conjunto em vários idiomas. Notavelmente, O desempenho do llama3.1-8binstruct melhorou de 60,00% na linha de base para 71,88% com o MPLE+ Reflection (veja a tabela 2).

Além disso, o MPLE+Reflection e o MPLE+MCTS oferecem resultados competitivos, com vários modelos (GPT-4Omini, GPT-4o, Claude-Sonnet-3.5 e llama3.1-405b-instruct) atingindo 87,50% (consulte a tabela 3).

Nossos resultados demonstram claramente que a estrutura MPLE, especialmente quando usada em conjunto com algoritmos de inferência adicionais, oferece uma abordagem poderosa e flexível para aprimorar a geração de código em vários LLMs. As melhorias consistentes de desempenho da MPLE ressaltam seu potencial para aplicações práticas no desenvolvimento de software orientado por IA.
O Llama 3.1-405b alcança resultados de última geração com MPLE e MCTS: precisão de 96,25%!
Durante nossa análise, ficamos especialmente impressionados com o desempenho do MPLE quando aplicado a A combinação de MPLE+MCTS alcançou a maior precisão em vários modelos, como llama3.1-405b-instruct, que atingiu uma precisão SOTA Pass @1 de 96,25% (consulte a tabela 4).

O caminho à frente
À medida que continuamos a expandir os limites do que é possível com o MPLE, estamos entusiasmados em explorar novas áreas de pesquisa e desenvolvimento. As possíveis áreas de foco incluem:
- Desenvolvendo métricas de avaliação mais robustas: Criar métricas de avaliação eficazes é crucial para medir com precisão o desempenho do MPLE. Ao nos concentrarmos em métricas mais abrangentes, podemos garantir a precisão, a confiabilidade e a aplicabilidade prática da estrutura em vários domínios.
- Aplicando o MPLE a problemas do mundo real: O MPLE tem o potencial de enfrentar desafios complexos do mundo real, como automatizar processos de negócios, otimizar pipelines de desenvolvimento de software e melhorar as medidas de segurança cibernética. Avaliar o MPLE em uma gama mais ampla de conjuntos de dados e aplicativos do mundo real será fundamental para avaliar sua generalização e impacto.
- Aprimorando o NinjalLM para tarefas de codificação: nosso NinjalLM 3.0 (uma versão ajustada e quantizada do llama3.1-405b), disponível em MyNinja.ai alcançou pontuações promissoras no HumanEval (93,85%) e no HumanEval-plus (86,67%), e estamos no caminho de melhorar ainda mais seu desempenho. Lançaremos um Ninja Coder baseado em MPLE em um mês.
Estamos entusiasmados em compartilhar nossa pesquisa sobre o MPLE com o mundo. Acreditamos que essa abordagem tem o potencial de causar um impacto significativo na geração de código LLM. O MPLE reduz erros e preconceitos específicos da linguagem, resultando em uma geração de código mais precisa e robusta, o que significa mais tempo para os desenvolvedores resolverem problemas maiores. Estamos comprometidos em continuar nossa pesquisa e desenvolvimento nessa área e esperamos ver as aplicações inovadoras do MPLE no futuro.
P.S. O futuro tem muito menos erros :-)
P.P.S. Usamos o MyNinja.ai para ajudar na criação desta postagem no blog.



