Simple Science

Ciência de ponta explicada de forma simples

# Informática# Aprendizagem de máquinas# Inteligência Artificial# Linguagens de programação# Engenharia de software

Avaliando as habilidades de programação em Java dos LLMs

Um novo teste pra avaliar LLMs em tarefas de programação em Java.

― 8 min ler


Avaliando as HabilidadesAvaliando as Habilidadesem Java dos LLMsLLMs.habilidades de codificação em Java dosNovo benchmark revela lacunas nas
Índice

Modelos de linguagem grandes (LLMs) como o ChatGPT mostraram que podem fazer várias tarefas bem, incluindo escrever código. No entanto, a maioria dos testes que avaliam quão bem esses modelos podem gerar código foca muito em Python. Isso cria um problema porque outras linguagens, como Java, não estão sendo testadas adequadamente. Neste artigo, discutimos a necessidade de melhores métodos de avaliação para LLMs na Programação em Java.

Problemas Atuais com a Avaliação de Código

Desequilíbrio nas Linguagens de Programação

A maioria dos benchmarks usados para avaliar LLMs está bem inclinada para Python. Cerca de 95,8% dos benchmarks envolvem Python, enquanto apenas cinco benchmarks analisam Java. Isso dificulta o julgamento de quão bem os LLMs podem escrever código Java, já que eles foram principalmente treinados e avaliados em Python.

Desequilíbrio na Granularidade do Código

Muitos benchmarks existentes focam em funções ou declarações únicas. Mais de 83,3% dos benchmarks avaliam LLMs nessa escala pequena. Embora isso possa mostrar quão bem eles conseguem escrever pequenos pedaços de código, Projetos reais em Java frequentemente exigem entender contextos maiores, como múltiplas classes ou projetos inteiros. Quase não há avaliações que analisem quão bem os LLMs conseguem lidar com esses escopos maiores, especialmente em Java.

Falta de Recursos Avançados

A maioria dos benchmarks só testa habilidades básicas de codificação, como variáveis e loops. Eles não examinam efetivamente conceitos avançados de Programação Orientada a Objetos (OOP), que são essenciais em Java. Recursos como encapsulamento, herança e polimorfismo são frequentemente negligenciados, dificultando a avaliação de quão bem os LLMs conseguem gerar código Java que utilize esses recursos.

Apresentando um Novo Benchmark

Para abordar essas lacunas, propomos um novo benchmark especificamente para Java, que inclui avaliações em nível de projeto real que incorporam recursos avançados de OOP. Este benchmark consiste em quatro projetos Java com um total de 389 métodos em 106 classes. O benchmark foi cuidadosamente projetado para garantir uma cobertura de teste abrangente e usabilidade.

Descrição dos Projetos

Os quatro projetos Java são destinados a estudantes em um curso introdutório de Java. Esses projetos incluem uma ampla gama de recursos Java, desde conceitos básicos até avançados de OOP. Cada projeto é criado para ser envolvente e cobre habilidades importantes em Java, como leitura de arquivos e tratamento de exceções.

Cada projeto tem números variáveis de funções e classes, mas todos estão dentro de uma faixa semelhante. Esses projetos contêm entre 2.560 e 6.926 linhas de código, oferecendo um contexto significativo para testar os LLMs em tarefas de programação maiores em comparação com os benchmarks existentes.

Construção de Testes

Os casos de teste para esses projetos foram cuidadosamente elaborados por programadores experientes em Java. Há um total de 396 testes distribuídos pelos quatro projetos. Em média, as suítes de teste garantem que pelo menos 92% das classes, 87% das funções e 86,75% das linhas sejam cobertas pelos testes. Isso representa uma base sólida para avaliar quão bem os LLMs conseguem gerar código Java.

Desempenho Humano na Programação em Java

Os projetos foram testados com 282 alunos de graduação para avaliar seus níveis de dificuldade. O desempenho dos alunos serve como um benchmark contra o qual podemos comparar as habilidades dos LLMs. A pontuação média alcançada pelos graduandos foi de 90,93 de 100, o que indica que a suíte de testes é bem estruturada e mantém um nível apropriado de dificuldade.

Avaliando LLMs

Para avaliar LLMs em nosso novo benchmark Java, projetamos um plano sistemático envolvendo três configurações de contexto e várias estratégias de síntese. A avaliação inclui dois níveis de avaliação: examinando classes individuais e testando os projetos como um todo.

Configurações de Contexto

Diferentes contextos podem impactar significativamente como os LLMs se saem. Exploramos três configurações:

  1. Contexto Máximo: Essa configuração fornece ao LLM o esqueleto completo do projeto, dando todas as informações disponíveis.
  2. Contexto Mínimo: Essa abordagem usa apenas a classe que precisa ser completada, restringindo informações que poderiam ajudar o LLM.
  3. Contexto Selecionado: Nessa configuração, apenas as assinaturas de método relevantes são fornecidas, equilibrando a quantidade de informação com as necessidades da tarefa.

Estratégias de Síntese

Consideramos três estratégias para como os métodos dentro de uma classe são gerados:

  1. Síntese Independente: Cada método é criado separadamente, sem influenciar uns aos outros.
  2. Síntese Holística: Todos os métodos em uma classe são gerados ao mesmo tempo.
  3. Síntese Incremental: Os métodos são criados um por um em uma ordem específica.

Através de nossos experimentos, essas estratégias mostraram diferentes níveis de eficácia, com a síntese holística geralmente levando a um desempenho melhor.

Descobertas dos Experimentos

Desempenho Geral dos LLMs

Em nossos testes, os LLMs mostraram uma lacuna notável entre suas habilidades de programação e as dos graduandos. Mesmo os modelos com melhor desempenho só conseguiram uma taxa de aprovação de cerca de 41,17% para programação em nível de projeto Java, enquanto os graduandos pontuaram uma média de 90,93%.

O Contexto Importa

Nossos experimentos indicaram que usar a configuração de contexto selecionado gerou os melhores resultados em várias métricas. Fornecer informação demais no contexto máximo ou muito pouco no contexto mínimo tende a prejudicar o desempenho.

Importância da Ordem de Síntese

A ordem em que os métodos são gerados dentro de uma classe pode fazer diferença. Descobrimos que sintetizar em uma ordem aleatória frequentemente resultou em melhores resultados em comparação com ordens sequenciais ou reversas rígidas.

Erros Comuns

Também analisamos problemas comuns que surgiram durante as avaliações de LLM. Os erros podiam ser geralmente classificados em duas categorias: erros de conclusão, onde os métodos foram deixados em branco, e erros de compilação, onde o código não pôde ser compilado com sucesso. Além disso, identificamos que muitas falhas de teste eram devido a mal-entendidos da documentação ou à produção de implementações triviais.

Conclusão

Em conclusão, nosso benchmark proposto preenche uma lacuna significativa na avaliação das capacidades de programação em Java para LLMs. Ele visa fornecer uma compreensão mais abrangente de quão bem esses modelos podem lidar com tarefas de programação do mundo real, incorporando recursos avançados e contextos maiores. Trabalhos futuros devem continuar a refinar esses benchmarks e explorar o desempenho de vários LLMs em diferentes linguagens de programação.

Com este novo benchmark, esperamos incentivar avaliações mais robustas dos LLMs e, em última análise, impulsionar melhorias em sua capacidade de gerar código.

Trabalho Futuro

Olhando para o futuro, a necessidade de mais avaliações se torna clara. O conhecimento obtido a partir dessas avaliações não só será vital para o desenvolvimento de LLMs, mas também ajudará a informar os educadores sobre as habilidades de programação dos alunos na prática. Ao continuar a refinar benchmarks e avaliar LLMs contra eles, podemos entender melhor os pontos fortes e fracos desses modelos em contextos de programação diversos.

Além disso, expandir os tipos de testes e projetos incluídos no benchmark poderia aprimorar ainda mais nossa capacidade de avaliar com precisão o desempenho dos LLMs. Desenvolver cenários mais avançados nos quais os LLMs são testados proporcionaria uma imagem mais completa de suas habilidades de codificação e como eles poderiam lidar com tarefas complexas enfrentadas no desenvolvimento de software real.

Chamada à Ação

O lançamento deste benchmark convida a participação de desenvolvedores de modelos e pesquisadores. Incentivamos a exploração desses novos métodos de teste para impulsionar avanços e melhorias nas capacidades de codificação impulsionadas por LLMs. Ao se envolver com este novo benchmark, os desenvolvedores podem obter insights sobre o desempenho de seus modelos enquanto contribuem para um campo de pesquisa em crescimento que visa tornar a geração de código mais eficaz e confiável.

Através desse esforço colaborativo, podemos expandir os limites do que os LLMs podem alcançar em linguagens de programação além de Python e abrir novas possibilidades para seu uso no desenvolvimento de software e na educação.

Fonte original

Título: JavaBench: A Benchmark of Object-Oriented Code Generation for Evaluating Large Language Models

Resumo: Code generation benchmarks such as HumanEval are widely adopted to evaluate LLMs' capabilities. However, after consolidating the latest 24 benchmarks, we noticed three significant imbalances. First, imbalanced programming language. 95.8% of benchmarks involve Python, while only 5 benchmarks involve Java. Second, imbalanced code granularity. Function-/statement-level benchmarks account for over 83.3% of benchmarks. Only a mere handful extends to class-/project-levels, and all are limited to Python. Third, lacking advanced features. Existing benchmarks primarily assess basic coding skills, while overlooking advanced Object-Oriented Programming (OOP) features (i.e., encapsulation, inheritance, and polymorphism). To fill these gaps, we propose JavaBench, a project-level Java benchmark that exercises OOP features. It comprises four Java projects with 389 methods in 106 Java classes. The test coverage is up to 92%, and JavaBench is attested by 282 undergraduate students, reaching a 90.93/100 average score (i.e., pass rate against the test suite), ensuring the quality of documentation, code skeleton, and tests. To better evaluate LLM's capability against JavaBench, we introduce a systematic evaluation design covering three context settings and five synthesis strategies at two granularities using three hierarchical metrics. Our extensive experiment yields several interesting findings. First, we noticed that regarding project-level Java programming, LLMs are far behind undergraduate students (no project can be correctly completed by any studied LLMs, and at most 41.17% Pass@5 in a more relaxed evaluation). Second, using method signature as prompt context may strike an ideal balance for project-level code generation. JavaBench is publicly available at https://github.com/java-bench/JavaBench.

Autores: Jialun Cao, Zhiyong Chen, Jiarong Wu, Shing-chi Cheung, Chang Xu

Última atualização: 2024-10-11 00:00:00

Idioma: English

Fonte URL: https://arxiv.org/abs/2406.12902

Fonte PDF: https://arxiv.org/pdf/2406.12902

Licença: https://creativecommons.org/licenses/by/4.0/

Alterações: Este resumo foi elaborado com a assistência da AI e pode conter imprecisões. Para obter informações exactas, consulte os documentos originais ligados aqui.

Obrigado ao arxiv pela utilização da sua interoperabilidade de acesso aberto.

Mais de autores

Artigos semelhantes