Este repositorio contiene el código oficial y los datos del artículo "Generación de código de lenguaje natural a nivel de clase mediante razonamiento iterativo aumentado con herramientas a través del repositorio", que se presentará en el Taller de la Conferencia internacional sobre aprendizaje automático de 2024 sobre investigación de aprendizaje automático centrado en datos ( Taller DMLR en ICML'24).
Nuestro trabajo presenta:
Título alternativo utilizado con fines de anonimato: Generación de código a nivel de clase a partir de lenguaje natural utilizando razonamiento iterativo mejorado por herramientas sobre el repositorio
Los LLM han demostrado un potencial significativo en tareas de generación de código, logrando resultados prometedores a nivel de función o declaración en varios puntos de referencia. Sin embargo, las complejidades asociadas con la creación de artefactos de código como clases, particularmente dentro del contexto de repositorios de software del mundo real, siguen sin explorarse. Investigaciones anteriores tratan la generación a nivel de clase como una tarea aislada, descuidando las intrincadas dependencias e interacciones que caracterizan los entornos de software del mundo real.
Para abordar esta brecha, presentamos RepoClassBench, un punto de referencia integral diseñado para evaluar rigurosamente los LLM en la generación de código complejo a nivel de clase dentro de repositorios del mundo real. RepoClassBench incluye tareas de "generación de lenguaje natural a clases" en Java, Python y C# desde una selección de repositorios. Nos aseguramos de que cada clase de nuestro conjunto de datos no solo tenga dependencias entre archivos dentro del repositorio, sino que también incluya los casos de prueba correspondientes para verificar su funcionalidad. Encontramos que los modelos actuales luchan con los desafíos realistas que plantea nuestro punto de referencia, principalmente debido a su exposición limitada a contextos de repositorio relevantes.
Para abordar esta deficiencia, presentamos Retrieve-Repotools-Reflect (RRR), un enfoque novedoso que equipa a los LLM con herramientas de análisis estático para navegar y razonar de forma iterativa sobre el contexto a nivel de repositorio en un marco basado en agentes. Nuestros experimentos demuestran que RRR supera significativamente las líneas de base existentes en RepoClassBench, mostrando su efectividad en todos los lenguajes de programación y en diversas configuraciones. Nuestros hallazgos enfatizan la necesidad crítica de que los puntos de referencia de generación de código incorporen dependencias a nivel de repositorio para reflejar con mayor precisión las complejidades del desarrollo de software.
Nuestro trabajo muestra los beneficios de aprovechar herramientas especializadas para mejorar la comprensión de los LLM sobre el contexto del repositorio.
data
: contiene el contenido del conjunto de datos de RepoClassBench y los metadatos para inicializar la canalización del arnés de evaluación. Más detalles aquí.repoclassbench
: Contiene el código para inicializar los entornos de repositorio para Java, C# y Python; tomar un fragmento de código de clase y medir su exactitud con respecto a los casos de prueba en el repositorio. Más detalles aquí.repotools
: Contiene la implementación de herramientas de análisis estático utilizadas por el marco agente en nuestro trabajo para razonar sobre el repositorio.rrr
: Código para que el agente RRR interactúe con el arnés de evaluación para resolver tareas de referenciaproject_utils
: funciones de utilidad comunes utilizadas en todo el proyecto Idioma | Número de tareas |
---|---|
Java | 130 |
Pitón | 97 |
DO# | 60 |
Los datos de referencia se encuentran en data/input
, con archivos separados para Python, Java y C#. Cada archivo contiene los siguientes atributos para cada tarea:
task_id
: identificador único para cada tarea en el punto de referencia.class_name
: nombre de la clase que se está probando.file_name
: ruta al archivo que contiene la implementación real de la clase dentro del repositorio.detailed_description
: descripción detallada de la clase, utilizada por el agente/LLM para generar código.sketchy_description
: descripción menos detallada de la clase, que proporciona un mensaje alternativo para la generación de código.repo_metadata
: información sobre el repositorio que contiene la clase, que incluye:repo_name
commit_id
evaluation_metadata
: Datos para evaluar la exactitud del código generado:ground_truth_class_body
: La implementación correcta de la clase que se está probando. Para comenzar con el proyecto, siga estos pasos:
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 evaluar su canalización/configuración, verifique que los entornos y repositorios requeridos en el arnés de evaluación estén configurados correctamente. De lo contrario, la implementación real de una o más tareas en los tres idiomas puede fallar. Ejecute las siguientes pruebas para garantizar una configuración adecuada:
# 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
Si está listo para ver cómo su enfoque de generación de código se compara con nuestro punto de referencia, encontrará código de muestra para ayudarlo a comenzar en el directorio repoclassbench/tests
. Siga esta guía paso a paso para probar su código en una tarea específica:
Comience creando un objeto Dataset
para el lenguaje de programación con el que está trabajando. Por ejemplo, si estás probando código Python, escribirías:
from repoclassbench . dataset import Dataset
# Initialize the dataset for Python with detailed specifications
dataset = Dataset ( language = "python" , specification = "detailed" , delete_relatives = False )
A continuación, elija una tarea del conjunto de datos para probar su código. Puedes hacer esto recuperando el objeto task
usando su identificador único ( 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 )
Recuperar las herramientas de evaluación para la tarea. Esto le dará un objeto TaskData
, que incluye el evaluador, una descripción de la clase que necesita generar y la ubicación del repositorio 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, es hora de ver cómo funciona el código generado. Utilice el evaluador para probar su código e imprimir los 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 )
Recuerde reemplazar code_test
con el código real generado por su enfoque. El evaluador ejecutará su código en los casos de prueba y proporcionará comentarios sobre cuántas pruebas pasaron, cuántas fallaron, si el código se compiló exitosamente y cualquier error que se haya encontrado.
Considere citar el siguiente documento cuando utilice nuestro código y punto de referencia.
@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 proyecto agradece contribuciones y sugerencias. La mayoría de las contribuciones requieren que usted acepte un Acuerdo de licencia de colaborador (CLA) que declara que tiene derecho a otorgarnos, y de hecho lo hace, los derechos para usar su contribución. Para obtener más detalles, visite https://cla.opensource.microsoft.com.
Cuando envía una solicitud de extracción, un bot CLA determinará automáticamente si necesita proporcionar un CLA y decorar el PR de manera adecuada (por ejemplo, verificación de estado, comentario). Simplemente siga las instrucciones proporcionadas por el bot. Solo necesitarás hacer esto una vez en todos los repositorios que utilicen nuestro CLA.
Este proyecto ha adoptado el Código de conducta de código abierto de Microsoft. Para obtener más información, consulte las preguntas frecuentes sobre el Código de conducta o comuníquese con [email protected] si tiene alguna pregunta o comentario adicional.
Este proyecto puede contener marcas comerciales o logotipos de proyectos, productos o servicios. El uso autorizado de las marcas comerciales o logotipos de Microsoft está sujeto y debe seguir las Pautas de marcas y marcas comerciales de Microsoft. El uso de marcas comerciales o logotipos de Microsoft en versiones modificadas de este proyecto no debe causar confusión ni implicar patrocinio de Microsoft. Cualquier uso de marcas comerciales o logotipos de terceros está sujeto a las políticas de dichos terceros.