Cuatro comparaciones de generación de código caseras: ¿qué método es mejor para el ajuste fino?

En las últimas semanas, hemos intentado afinar el modelo combinando los grandes modelos de código abierto LLaMA y ChatGLM Además de la exploración de la parte comercial, también hay una gran parte de la exploración en los aspectos técnicos, como la generación asistida por código .

Después de probar la generación de código en diferentes escenarios y modelos comerciales, hemos explorado cuatro formas diferentes, y puede haber algunas más en el futuro, pero la diferencia puede no ser significativa.

Demasiado largo para leer los cuatro métodos:

  • Método de generación de ejemplo de código . Al ingresar el texto de muestra y el código de destino, deje que el modelo de IA genere un nuevo código de acuerdo con las reglas del código.

  • Método de generación dirigido por pruebas . Al ingresar el código de prueba, deje que el modelo de IA genere el código comercial correspondiente de acuerdo con el código de prueba.

  • Método de generación asistida por metadatos . Al proporcionar más información de metadatos, como tipos de variables, parámetros de funciones, etc., el modelo de IA puede generar código común con mayor precisión.

  • Método de generación de coincidencia de información . Por ejemplo, al combinar la información de la tabla en la fuente de datos, permita que el modelo de IA genere declaraciones SQL de acuerdo con los requisitos.

PD: Para conocer los pasos de entrenamiento y los conjuntos de datos, consulte: https://github.com/unit-mesh/unit-minions.

Exploración de la mejora de la eficiencia de I+D de IA: cuatro vías

Mientras aprendemos alquimia (modelos de entrenamiento), también estamos explorando formas más efectivas.

Método de generación de ejemplo de código: SQL de generación de texto

Este enfoque permite que el modelo de IA aprenda a generar código que coincida con el objetivo al proporcionarle un texto de ejemplo y un código objetivo. El modelo aprende a generar código similar basado en las características y reglas del código de muestra y el código de destino. Dado que es el texto de entrada, el código generado también tiene cierta aleatoriedad. Este método es adecuado para generar código de propósito general, como generar algunos códigos comunes de procesamiento de datos, interfaz gráfica y otros.

Encontramos un conjunto de datos en HuggingFace y entrenamos un LLaMA LoRA. Como versión fallida, el conjunto de datos generado es demasiado pequeño y no de alta calidad, por lo que también es extraño.

Ejemplo de entrada:

evaluate("text to sql", "谁是最美丽的人", 0.1, 0.75, 40, 4, 512)

Salida de ejemplo:

SELECT MOST BEAUTIFUL FROM table WHERE BEAUTIFUL = 最美丽的人

El problema más obvio es que debido a que no se conocen las tablas correspondientes y otra información, las generadas nunca serán satisfactorias. La forma ideal es agregar información de tabla durante el entrenamiento y realizar un preprocesamiento para incorporar información de tabla, etc.

Generación dirigida por pruebas: generación de casos de prueba

De esta forma, el código de prueba se utiliza como entrada para generar un código comercial adecuado para el código de prueba. Este método puede generar con mayor precisión código adecuado para un escenario empresarial específico, ya que el código de prueba suele contener las características y leyes del escenario empresarial. Al mismo tiempo, debido a que el código de prueba de entrada es relativamente fijo, el código generado también es relativamente estable. Este enfoque es adecuado para generar código comercial adecuado para código de prueba.

Escribimos el análisis del método de prueba y la información de clase correspondiente para generar mejor el código de prueba. El conjunto de datos es de aproximadamente 8000.

Ejemplo de entrada:

evaluate("write test", """
public Set<String> listFilesUsingJavaIO(String dir) {
    return Stream.of(new File(dir).listFiles())
      .filter(file -> !file.isDirectory())
      .map(File::getName)
      .collect(Collectors.toSet());
}
""", 0.1, 0.75, 40, 4, 512)

Salida de ejemplo:

@Test
public void shouldListFilesUsingJavaIO() {
    Set<String> files = ListFilesUsingJavaIO.listFilesUsingJavaIO(new File("dir"));
    assertThat(files, containsInAnyOrder("file1", "file2", "file3"));
}

A partir de los resultados, dado que no se proporciona la información de clase correspondiente, los casos de prueba generados aún son posibles. Sin embargo, todavía hay ciertos conjuntos de datos que son demasiado pequeños y el peso de LLaMA, lo que conduce a ciertos problemas en el código generado.

Método de generación asistida por metadatos: generación asistida por código

El método de generación de código combinado con metadatos proporcionará más información de metadatos, como tipos de variables, parámetros de funciones, etc., para ayudar al modelo a generar código con mayor precisión. Este enfoque puede generar con mayor precisión código que satisfaga necesidades específicas, porque la información de metadatos proporcionada puede ayudar al modelo a comprender mejor la semántica y la estructura del código. Este enfoque es adecuado para generar código genérico.

El método que adoptamos es dejar que LLM aprenda a llenar los espacios en blanco, que es un método relativamente clásico. Para evitar problemas causados ​​por el tamaño, exploramos la cantidad de líneas asignadas a la API y solo proporcionamos información de clase.

Ejemplo de entrada:

evaluate("Implement the method updatePostCommentsSize", "PostRepository()\n- methods: findById(Long): Optional<Post>, updatePostCommentsSize(int, Long): void, findAllByPostTopics(String): List<Post>, findDistinctByPostTopics(String): List<Post>", 0.1, 0.75, 40, 4, 512)

Salida de ejemplo:

public class PostRepository {
    public void updatePostCommentsSize(int size, Long postId) {
        Post post = findById(postId);
        if (post == null) {
            return;
        }
        post.setPostCommentsSize(size);
        save(post);
    }
}

A partir de los resultados, la calidad del código para escribir CRUD no es mala, pero teniendo en cuenta el conjunto de datos, todavía hay espacio para mejoras adicionales. La desventaja es que para lograr tal función, debe integrarse aún más con varias herramientas.

Método de generación de correspondencia de información: texto a repositorio

El método de generación de SQL + Repository que combina la información de la tabla combinará la información de la tabla en la fuente de datos en varios pasos para generar declaraciones de SQL + Repository que cumplan con los requisitos. Este método puede generar sentencias SQL con mayor precisión que satisfagan necesidades específicas, ya que combina la información de la tabla de datos para comprender mejor la estructura y la relación de las tablas de datos. Este método es adecuado para generar sentencias SQL que cumplan con los requisitos.

La forma que adoptamos es preprocesar los resultados de entrada para generar un texto con una tabla y otra información, y agregar la información de la tabla. De esta forma, los datos generados serán más precisos.

Ejemplo de formato de datos sin procesar:

instruction:
我想查找特定月份(monthly_id)下在某个日期(date)之前的所有费用(expense),以方便了解特定月份内的开销情况。
input:
data class ExpenseEntity(....)
output:
@Query("SELECT * FROM expense WHERE monthly_id = :recurringExpenseId AND date < :beforeDate")
suspend fun getAllExpensesForRecurringExpenseBeforeDate(recurringExpenseId: Long, beforeDate: LocalDate): List<ExpenseEntity>

Ejemplo de entrada:

evaluate("text to kotlin repository with class", "我想查询指定年龄的用户(User)的博客数量。\n ###data class User(var age: Int, val blogId: Int) data class Post(val title: String)###", 0.1, 0.75, 40, 4, 512)

La salida de ejemplo correspondiente:

@Query("SELECT COUNT(*) FROM User WHERE age = :age")
abstract fun getBlogCount(age: Int): Long

En este experimento, aunque el código del Repositorio generado es bastante satisfactorio. Sin embargo, dado que a los humanos generalmente les gusta usarlo  SELECT * , los códigos generados son varios  SELECT *, por lo que no están tan satisfechos.

Comparación de diferencias

Estos cuatro métodos tienen sus propias ventajas y desventajas, y son adecuados para diferentes escenarios y necesidades:

  • Método 1: método de generación de ejemplo de código. La ventaja de este enfoque es que es sencillo y no requiere información ni pasos adicionales. La desventaja es que el código generado puede no ser preciso o completo, lo que requiere una inspección y modificación manual. Adecuado para algunas tareas simples de generación de código o como borrador de código inicial.

  • Método 2: método de generación basado en pruebas. La ventaja de este método es que puede generar código comercial que satisfaga las condiciones según los requisitos del código de prueba. La desventaja es que se debe proporcionar un código de prueba de alta calidad; de lo contrario, puede generar un código comercial incorrecto o ineficiente. Es adecuado para algunas tareas de generación de código con estándares y especificaciones de prueba claros, o como una herramienta auxiliar para la optimización y refactorización de código.

  • Método 3: método de generación asistida por metadatos. La ventaja de este enfoque es que se puede utilizar más información contextual para mejorar la precisión y la legibilidad de la generación de código. La desventaja es que se necesita recopilar y proporcionar más información de metadatos, lo que aumenta la carga de trabajo de preparación y procesamiento de datos. Es adecuado para algunas tareas de generación de código con lógica y estructura complejas, o como un medio para garantizar la calidad y la normativa del código.

  • Modo 4: método de generación de correspondencia de información. La ventaja de este método es que puede generar declaraciones SQL que cumplan con los requisitos y especificaciones según la estructura de la tabla y las relaciones en la fuente de datos. La desventaja es que requiere una interacción y retroalimentación de varios pasos, lo que aumenta el costo de comunicación entre los usuarios y los modelos. Es adecuado para algunas tareas de generación de SQL con fuentes de datos y requisitos de consulta específicos, o como una herramienta auxiliar para el aprendizaje y la educación de SQL.

Los resultados se muestran en la tabla de abajo:

Forma ingresar aleatoriedad información adicional Escenario de aplicación
ejemplo de código Texto de ejemplo y código de objeto más alto ninguno generar código genérico
prueba de conducción código de prueba Bajo informacion de la clase Generar código comercial adecuado para código de prueba
asistencia de metadatos información de metadatos medio Información de metadatos como tipos de variables y parámetros de funciones, etc. generar código genérico
coincidencia de información Información de la tabla en la base de datos. Bajo Información de metadatos como tipos de variables y parámetros de funciones Genere sentencias SQL que cumplan con los requisitos

Solo al proporcionar información más rica, la IA puede generar un código más preciso.

resumen

Este artículo presenta cuatro métodos de ajuste fino para la generación de código de IA, incluido el método de generación de muestras de código, el método de generación basado en pruebas, el método de generación asistida por metadatos y el método de generación de correspondencia de información. Cada método tiene sus ventajas y desventajas y escenarios aplicables, pero se necesita proporcionar más información para generar un código más preciso.

Bienvenido a probarlo usted mismo: https://github.com/unit-mesh/unit-minions

Supongo que te gusta

Origin blog.csdn.net/gmszone/article/details/130120134
Recomendado
Clasificación