Este repositório contém o código oficial e os dados do artigo "Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository", a ser apresentado na Conferência Internacional de 2024 sobre Workshop de Aprendizado de Máquina em Pesquisa de Aprendizado de Máquina Centrado em Dados ( Workshop DMLR no ICML'24).
Nosso trabalho apresenta:
Título alternativo usado para fins de anonimato: Geração de código em nível de classe a partir de linguagem natural usando raciocínio iterativo e aprimorado por ferramentas sobre repositório
Os LLMs demonstraram um potencial significativo em tarefas de geração de código, alcançando resultados promissores no nível de função ou instrução em vários benchmarks. No entanto, as complexidades associadas à criação de artefatos de código como classes, particularmente no contexto de repositórios de software do mundo real, permanecem pouco exploradas. Pesquisas anteriores tratam a geração em nível de classe como uma tarefa isolada, negligenciando as intrincadas dependências e interações que caracterizam os ambientes de software do mundo real.
Para resolver essa lacuna, apresentamos o RepoClassBench, um benchmark abrangente projetado para avaliar rigorosamente LLMs na geração de código complexo em nível de classe em repositórios do mundo real. RepoClassBench inclui tarefas de "geração de linguagem natural para classe" em Java, Python e C# a partir de uma seleção de repositórios. Garantimos que cada classe em nosso conjunto de dados não apenas tenha dependências entre arquivos no repositório, mas também inclua casos de teste correspondentes para verificar sua funcionalidade. Descobrimos que os modelos atuais lutam com os desafios realistas colocados pelo nosso benchmark, principalmente devido à sua exposição limitada a contextos de repositórios relevantes.
Para resolver essa deficiência, apresentamos Retrieve-Repotools-Reflect (RRR), uma nova abordagem que equipa LLMs com ferramentas de análise estática para navegar e raciocinar iterativamente sobre o contexto em nível de repositório em uma estrutura baseada em agente. Nossos experimentos demonstram que o RRR supera significativamente as linhas de base existentes no RepoClassBench, mostrando sua eficácia em linguagens de programação e em várias configurações. Nossas descobertas enfatizam a necessidade crítica de benchmarks de geração de código incorporarem dependências em nível de repositório para refletir com mais precisão as complexidades do desenvolvimento de software.
Nosso trabalho mostra os benefícios de aproveitar ferramentas especializadas para aprimorar a compreensão dos LLMs sobre o contexto do repositório.
data
: contém o conteúdo do conjunto de dados RepoClassBench e os metadados para inicializar o pipeline do chicote de avaliação. Mais detalhes aqui.repoclassbench
: Contém o código para inicializar os ambientes de repositório para Java, C# e Python; pegar um pedaço de código de classe e medir sua correção em relação aos casos de teste no repositório. Mais detalhes aqui.repotools
: Contém a implementação de ferramentas de análise estática usadas pelo agentic-framework em nosso trabalho para raciocinar sobre o repositório.rrr
: Código para o agente RRR interagindo com o equipamento de avaliação para resolver tarefas de benchmarkproject_utils
: funções utilitárias comuns usadas em todo o projeto Linguagem | Número de tarefas |
---|---|
Java | 130 |
Pitão | 97 |
C# | 60 |
Os dados de benchmark estão localizados em data/input
, com arquivos separados para Python, Java e C#. Cada arquivo contém os seguintes atributos para cada tarefa:
task_id
: identificador exclusivo para cada tarefa no benchmark.class_name
: Nome da classe que está sendo testada.file_name
: caminho para o arquivo que contém a implementação verdadeira da classe no repositório.detailed_description
: descrição detalhada da classe, usada pelo agente/LLM para gerar código.sketchy_description
: Descrição menos detalhada da classe, fornecendo um prompt alternativo para geração de código.repo_metadata
: informações sobre o repositório que contém a classe, incluindo:repo_name
commit_id
evaluation_metadata
: Dados para avaliar a exatidão do código gerado:ground_truth_class_body
: A implementação correta da classe que está sendo testada. Para começar o projeto, siga estas etapas:
git clone https://github.com/microsoft/repoclassbench
cd repoclassbench
conda create --name repoclassbench_env python=3.11
conda activate repoclassbench_env
pip install -r requirements.txt
Antes de avaliar seu pipeline/configuração, verifique se os ambientes e repositórios necessários no equipamento de avaliação estão configurados corretamente. Caso contrário, a implementação verdadeira de uma ou mais tarefas nas três línguas pode falhar. Execute os seguintes testes para garantir a configuração adequada:
# To ensure harness is setup for C#
pytest -x repoclassbench/tests/test_csharp.py
# To ensure harness is setup for Java
pytest -x repoclassbench/tests/test_java.py
# To ensure harness is setup for Python
pytest -x repoclassbench/tests/test_python.py
Se você estiver pronto para ver como sua abordagem de geração de código se compara ao nosso benchmark, você encontrará código de exemplo para ajudá-lo a começar no diretório repoclassbench/tests
. Siga este guia passo a passo para testar seu código em uma tarefa específica:
Comece criando um objeto Dataset
para a linguagem de programação com a qual você está trabalhando. Por exemplo, se estiver testando código Python, você escreveria:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
Em seguida, escolha uma tarefa do conjunto de dados para testar seu código. Você pode fazer isso buscando o objeto task
usando seu identificador exclusivo ( task_id
):
# Replace 'task_id' with the actual ID of the task you want to test
task = dataset . get_instance_and_setup_env ( task_id )
Recupere as ferramentas de avaliação para a tarefa. Isso lhe dará um objeto TaskData
, que inclui o avaliador, uma descrição da classe que você precisa gerar e a localização do repositório de código relevante.
# Get the evaluator from the task object
evaluator = task . evaluator
# The path to the repository files and the class description are also available
repository_path = task . repo_dir
description_to_use = task . description
Finalmente, é hora de ver o desempenho do código gerado. Use o avaliador para testar seu código e imprimir os resultados.
# 'code_test' should be replaced with the class code generated by your approach
evaluation_results = evaluator . evaluate ( code_test )
# Display the outcome of the evaluation
print ( "Number of passed testcases: " , evaluation_results . passed_tests )
print ( "Number of failed testcases: " , evaluation_results . failed_tests )
print ( "Did the code compile/pass linter checks: " , evaluation_results . compile_status )
print ( "Error feedback from the harness: " , evaluation_results . error_feedback )
Lembre-se de substituir code_test
pelo código real gerado pela sua abordagem. O avaliador executará seu código nos casos de teste e fornecerá feedback sobre quantos testes foram aprovados, quantos falharam, se o código foi compilado com êxito e quaisquer erros encontrados.
Considere citar o artigo a seguir ao usar nosso código e benchmark.
@inproceedings{deshpande2024classlevelcodegenerationnatural,
title={Natural Language to Class-level Code Generation by Iterative Tool-augmented Reasoning over Repository},
author={Ajinkya Deshpande and Anmol Agarwal and Shashank Shet and Arun Iyer and Aditya Kanade and Ramakrishna Bairi and Suresh Parthasarathy},
booktitle={ICML 2024 Workshop on Data-Centric Machine Learning Research},
year={2024},
url={https://openreview.net/forum?id=yqjr7ojVYa}
}
Este projeto aceita contribuições e sugestões. A maioria das contribuições exige que você concorde com um Contrato de Licença de Colaborador (CLA), declarando que você tem o direito de nos conceder, e realmente nos concede, os direitos de uso de sua contribuição. Para obter detalhes, visite https://cla.opensource.microsoft.com.
Quando você envia uma solicitação pull, um bot CLA determinará automaticamente se você precisa fornecer um CLA e decorará o PR adequadamente (por exemplo, verificação de status, comentário). Basta seguir as instruções fornecidas pelo bot. Você só precisará fazer isso uma vez em todos os repositórios usando nosso CLA.
Este projeto adotou o Código de Conduta de Código Aberto da Microsoft. Para obter mais informações, consulte as Perguntas frequentes sobre o Código de Conduta ou entre em contato com [email protected] com perguntas ou comentários adicionais.
Este projeto pode conter marcas registradas ou logotipos de projetos, produtos ou serviços. O uso autorizado de marcas registradas ou logotipos da Microsoft está sujeito e deve seguir as Diretrizes de Marcas Registradas e Marcas da Microsoft. O uso de marcas registradas ou logotipos da Microsoft em versões modificadas deste projeto não deve causar confusão nem implicar patrocínio da Microsoft. Qualquer uso de marcas registradas ou logotipos de terceiros está sujeito às políticas desses terceiros.