Logotipo de Zephyrnet

Personalización de compañeros de codificación para organizaciones | Servicios web de Amazon

Fecha:

Los modelos de IA generativa para compañeros de codificación se entrenan principalmente con código fuente disponible públicamente y texto en lenguaje natural. Si bien el gran tamaño del corpus de entrenamiento permite a los modelos generar código para funcionalidades de uso común, estos modelos desconocen el código en repositorios privados y los estilos de codificación asociados que se aplican al desarrollar con ellos. En consecuencia, es posible que sea necesario reescribir las sugerencias generadas antes de que sean apropiadas para su incorporación a un repositorio interno.

Podemos abordar esta brecha y minimizar la edición manual adicional incorporando conocimiento de código de repositorios privados en un modelo de lenguaje entrenado en código público. Es por eso que desarrollamos una capacidad de personalización para Código de Amazon Whisperer. En esta publicación, le mostramos dos formas posibles de personalizar los compañeros de codificación mediante recuperación, generación aumentada y ajuste.

Nuestro objetivo con la capacidad de personalización de CodeWhisperer es permitir a las organizaciones adaptar el modelo CodeWhisperer utilizando sus bibliotecas y repositorios privados para generar recomendaciones de código específicas de la organización que ahorren tiempo, sigan el estilo y las convenciones organizacionales y eviten errores o vulnerabilidades de seguridad. Esto beneficia el desarrollo de software empresarial y ayuda a superar los siguientes desafíos:

  1. Documentación o información escasa para bibliotecas internas y API que obliga a los desarrolladores a dedicar tiempo a examinar el código escrito previamente para replicar el uso.
  2. Falta de conciencia y coherencia en la implementación de prácticas, estilos y patrones de codificación específicos de la empresa.
  3. Uso inadvertido de código y API obsoletos por parte de los desarrolladores.

Al utilizar repositorios de código internos para capacitación adicional que ya han pasado por revisiones de código, el modelo de lenguaje puede revelar el uso de API internas y bloques de código que superan la lista de problemas anterior. Debido a que el código de referencia ya está revisado y cumple con el alto estándar del cliente, también se minimiza la probabilidad de introducir errores o vulnerabilidades de seguridad. Y, al seleccionar cuidadosamente los archivos fuente utilizados para la personalización, las organizaciones pueden reducir el uso de código obsoleto.

Retos de diseño

Personalizar sugerencias de código basadas en los repositorios privados de una organización presenta muchos desafíos de diseño interesantes. La implementación de modelos de lenguaje grandes (LLM) para mostrar sugerencias de código tiene costos fijos de disponibilidad y costos variables debido a la inferencia basada en la cantidad de tokens generados. Por lo tanto, tener personalizaciones separadas para cada cliente y alojarlas individualmente, incurriendo así en costos fijos adicionales, puede resultar prohibitivamente costoso. Por otro lado, tener múltiples personalizaciones simultáneamente en el mismo sistema requiere una infraestructura multiinquilino para aislar el código propietario de cada cliente. Además, la capacidad de personalización debería mostrar botones para permitir la selección del subconjunto de capacitación apropiado del repositorio interno utilizando diferentes métricas (por ejemplo, archivos con un historial de menos errores o código que se ha confirmado recientemente en el repositorio). Al seleccionar el código en función de estas métricas, la personalización se puede entrenar utilizando código de mayor calidad que puede mejorar la calidad de las sugerencias de código. Finalmente, incluso con repositorios de código en continua evolución, el costo asociado con la personalización debería ser mínimo para ayudar a las empresas a ahorrar costos gracias a una mayor productividad de los desarrolladores.

Un enfoque básico para crear personalización podría ser entrenar previamente el modelo en un único corpus de entrenamiento compuesto por el conjunto de datos de entrenamiento previo (público) existente junto con el código empresarial (privado). Si bien este enfoque funciona en la práctica, requiere una capacitación previa individual (redundante) utilizando el conjunto de datos públicos de cada empresa. También requiere costos de implementación redundantes asociados con el alojamiento de un modelo personalizado para cada cliente que solo atienda las solicitudes de los clientes que se originan en ese cliente. Al desacoplar la capacitación del código público y privado y al implementar la personalización en un sistema multiinquilino, se pueden evitar estos costos redundantes.

Cómo personalizar

En un nivel alto, existen dos tipos de técnicas de personalización posibles: generación aumentada de recuperación (RAG) y ajuste fino (FT).

  • Generación de recuperación aumentada: RAG encuentra fragmentos de código coincidentes dentro de un repositorio que es similar a un fragmento de código determinado (por ejemplo, código que precede inmediatamente al cursor en el IDE) y aumenta el mensaje utilizado para consultar el LLM con estos fragmentos de código coincidentes. Esto enriquece el mensaje para ayudar a impulsar el modelo a generar código más relevante. Hay algunas técnicas exploradas en la literatura en este sentido. Ver Generación aumentada de recuperación para tareas de PNL intensivas en conocimientos, REINO, kNN-LM y RETRO.

  • Sintonia FINA: FT toma un LLM previamente entrenado y lo entrena aún más en una base de código específica y más pequeña (en comparación con el conjunto de datos de entrenamiento previo) para adaptarlo al repositorio apropiado. El ajuste ajusta las ponderaciones del LLM en función de esta capacitación, haciéndolo más adaptado a las necesidades únicas de la organización.

Tanto RAG como el ajuste son herramientas poderosas para mejorar el rendimiento de la personalización basada en LLM. RAG puede adaptarse rápidamente a bibliotecas privadas o API con menor complejidad y costo de capacitación. Sin embargo, buscar y aumentar los fragmentos de código recuperados en el mensaje aumenta la latencia en tiempo de ejecución. En cambio, el ajuste no requiere ningún aumento del contexto porque el modelo ya está entrenado en bibliotecas privadas y API. Sin embargo, genera mayores costos de capacitación y complejidades en el servicio del modelo, cuando es necesario admitir múltiples modelos personalizados en múltiples clientes empresariales. Como veremos más adelante, estas preocupaciones pueden solucionarse optimizando aún más el enfoque.

Recuperación de generación aumentada

Hay algunos pasos involucrados en RAG:

Indexación

Dado un repositorio privado como entrada del administrador, se crea un índice dividiendo los archivos de código fuente en fragmentos. En pocas palabras, la fragmentación convierte los fragmentos de código en piezas digeribles que probablemente sean más informativas para el modelo y fáciles de recuperar dado el contexto. El tamaño de un fragmento y cómo se extrae de un archivo son opciones de diseño que afectan el resultado final. Por ejemplo, los fragmentos se pueden dividir en función de líneas de código o de bloques sintácticos, etc.

Flujo de trabajo del administrador


Búsqueda contextual

Busque un conjunto de fragmentos de código indexados basándose en unas pocas líneas de código encima del cursor y recupere fragmentos de código relevantes. Esta recuperación puede ocurrir usando diferentes algoritmos. Estas opciones podrían incluir:

  • Bolsa de palabras (BM25) Una función de recuperación de una bolsa de palabras que clasifica un conjunto de fragmentos de código según las frecuencias de los términos de consulta y las longitudes de los fragmentos de código.

Recuperación basada en BM25

La siguiente figura ilustra cómo funciona el BM25. Para utilizar BM25, primero se construye un índice invertido. Esta es una estructura de datos que asigna diferentes términos a los fragmentos de código en los que aparecen esos términos. En el momento de la búsqueda, buscamos fragmentos de código según los términos presentes en la consulta y los calificamos según la frecuencia.

Recuperación semántica

BM25 se centra en la coincidencia léxica. Por lo tanto, reemplazar "agregar" por "eliminar" puede no cambiar la puntuación BM25 según los términos de la consulta, pero la funcionalidad recuperada puede ser la opuesta a la requerida. Por el contrario, la recuperación semántica se centra en la funcionalidad del fragmento de código, aunque los nombres de las variables y de la API puedan ser diferentes. Normalmente, una combinación de BM25 y recuperaciones semánticas pueden funcionar bien juntas para ofrecer mejores resultados.

inferencia aumentada

Cuando los desarrolladores escriben código, su programa existente se utiliza para formular una consulta que se envía al índice de recuperación. Después de recuperar varios fragmentos de código utilizando una de las técnicas analizadas anteriormente, los anteponemos al mensaje original. Aquí hay muchas opciones de diseño, incluida la cantidad de fragmentos que se recuperarán, la ubicación relativa de los fragmentos en el mensaje y el tamaño del fragmento. La elección del diseño final está impulsada principalmente por la observación empírica mediante la exploración de varios enfoques con el modelo de lenguaje subyacente y juega un papel clave en la determinación de la precisión del enfoque. El contenido de los fragmentos devueltos y el código original se combinan y envían al modelo para obtener sugerencias de código personalizadas.

Flujo de trabajo del desarrollador

Sintonia FINA:

Sintonia FINA se hace un modelo de lenguaje para transferencia de aprendizaje en el que los pesos de un modelo previamente entrenado se entrenan con nuevos datos. El objetivo es retener el conocimiento apropiado de un modelo ya entrenado en un corpus grande y refinar, reemplazar o agregar nuevo conocimiento del nuevo corpus (en nuestro caso, una nueva base de código). Simplemente entrenar en una nueva base de código conduce a olvido catastrófico. Por ejemplo, el modelo de lenguaje puede “olvidar” sus conocimientos de seguridad o las API que se utilizan escasamente en el código base empresarial hasta la fecha. Hay una variedad de técnicas como repetición de la experiencia, GEMy PP-TF que se emplean para abordar este desafío.

Sintonia FINA

Hay dos formas de realizar ajustes. Un enfoque es utilizar datos adicionales sin aumentar el mensaje para ajustar el modelo. Otro enfoque es aumentar el mensaje durante el ajuste mediante la recuperación de sugerencias de código relevantes. Esto ayuda a mejorar la capacidad del modelo para proporcionar mejores sugerencias en presencia de fragmentos de código recuperados. Luego, el modelo se evalúa en un conjunto de ejemplos disponibles después de entrenarlo. Posteriormente, el modelo personalizado se implementa y utiliza para generar las sugerencias de código.

A pesar de las ventajas de utilizar LLM dedicados para generar código en repositorios privados, los costos pueden ser prohibitivos para las organizaciones pequeñas y medianas. Esto se debe a que se necesitan recursos informáticos dedicados, aunque puedan estar infrautilizados dado el tamaño de los equipos. Una forma de lograr rentabilidad es ofrecer varios modelos en el mismo proceso (por ejemplo, SageMaker multiinquilino). Sin embargo, los modelos de lenguaje requieren una o más GPU dedicadas en múltiples zonas para manejar las limitaciones de latencia y rendimiento. Por lo tanto, la tenencia múltiple de alojamiento de modelo completo en cada GPU no es factible.

Podemos superar este problema sirviendo a varios clientes en la misma computadora mediante el uso de pequeñas adaptadores al LLM. Técnicas de ajuste fino eficiente de parámetros (PEFT) como sintonía rápida, sintonización de prefijoy adaptación de bajo rango (lora) se utilizan para reducir los costos de capacitación sin pérdida de precisión. LoRA, especialmente, ha tenido un gran éxito al lograr una precisión similar (o mejor) que el ajuste fino del modelo completo. La idea básica es diseñar una matriz de bajo rango que luego se agrega a las matrices con el peso original de la matriz de las capas específicas del modelo. Por lo general, estos adaptadores luego se fusionan con los pesos del modelo original para servir. Esto conduce al mismo tamaño y arquitectura que la red neuronal original. Manteniendo los adaptadores separados, podemos servir el mismo modelo base con muchos adaptadores de modelo. Esto devuelve las economías de escala a nuestros pequeños y medianos clientes.

Adaptación de bajo rango (LoRA)

Medir la eficacia de la personalización

Necesitamos métricas de evaluación para valorar la eficacia de la solución personalizada. Las métricas de evaluación fuera de línea actúan como barreras contra personalizaciones de envío que son deficientes en comparación con el modelo predeterminado. Al crear conjuntos de datos a partir de un conjunto de datos retenido dentro del repositorio proporcionado, se puede aplicar el enfoque de personalización a este conjunto de datos para medir la efectividad. Comparar el código fuente existente con la sugerencia de código personalizado cuantifica la utilidad de la personalización. Las medidas comunes utilizadas para esta cuantificación incluyen métricas como editar similitud, coincidencia exacta y CódigoBLEU.

También es posible medir la utilidad cuantificando la frecuencia con la que la personalización invoca las API internas y comparándolas con las invocaciones en la fuente preexistente. Por supuesto, acertar en ambos aspectos es importante para completarlo con éxito. Para nuestro enfoque de personalización, hemos diseñado una métrica hecha a medida conocida como Índice de calidad de personalización (CQI), una medida única y fácil de usar que oscila entre 1 y 10. La métrica CQI muestra la utilidad de las sugerencias del modelo personalizado en comparación con el código. sugerencias con un modelo público genérico.

Resumen

Desarrollamos la capacidad de personalización de Amazon CodeWhisperer basándonos en una combinación de las técnicas técnicas líderes analizadas en esta publicación de blog y la evaluamos con estudios de usuarios sobre la productividad de los desarrolladores, realizados por Persistent Systems. En estos dos estudios, encargados por AWS, se pidió a los desarrolladores que crearan una aplicación de software médico en Java que requería el uso de sus bibliotecas internas. En el primer estudio, los desarrolladores sin acceso a CodeWhisperer tardaron (en promedio) ~8.2 horas en completar la tarea, mientras que aquellos que usaron CodeWhisperer (sin personalización) completaron la tarea un 62 por ciento más rápido en (en promedio) ~3.1 horas.

En el segundo estudio con un conjunto diferente de cohortes de desarrolladores, los desarrolladores que usaron CodeWhisperer y que habían sido personalizados usando su código base privado completaron la tarea en 2.5 horas en promedio, un 28 por ciento más rápido que aquellos que usaron CodeWhisperer sin personalización y completaron la tarea en aproximadamente 3.5 horas. horas en promedio. Creemos firmemente que las herramientas como CodeWhisperer, personalizadas para su base de código, desempeñan un papel clave a la hora de aumentar aún más la productividad de los desarrolladores y recomendamos probarlas. Para obtener más información y comenzar, visite el Página de Amazon CodeWhisperer.


Sobre los autores

sol qing Es científico aplicado sénior en los laboratorios de IA de AWS y trabaja en AWS CodeWhisperer, un asistente de codificación generativo impulsado por IA. Sus intereses de investigación se encuentran en el procesamiento del lenguaje natural, AI4Code y la IA generativa. En el pasado, había trabajado en varios servicios basados ​​en PNL, como Comprehend Medical, un sistema de diagnóstico médico en Amazon Health AI y un sistema de traducción automática en Meta AI. Recibió su doctorado de Virginia Tech en 2017.

Arash Farahani es un científico aplicado en Amazon CodeWhisperer. Sus intereses actuales son la IA generativa, la búsqueda y la personalización. A Arash le apasiona crear soluciones que resuelvan los problemas de los desarrolladores. Ha trabajado en múltiples funciones dentro de CodeWhisperer e introdujo soluciones de PNL en varios flujos de trabajo internos que afectan a todos los desarrolladores de Amazon. Recibió su doctorado de la Universidad de Illinois en Urbana-Champaign en 2017.

Xiao Fei Ma es gerente de ciencias aplicadas en AWS AI Labs. Se unió a Amazon en 2016 como científico aplicado dentro de la organización SCOT y luego a AWS AI Labs en 2018 trabajando en Amazon Kendra. Xiaofei se ha desempeñado como gerente científico de varios servicios, incluidos Kendra, Contact Lens y, más recientemente, CodeWhisperer y CodeGuru Security. Sus intereses de investigación se encuentran en el área de AI4Code y el procesamiento del lenguaje natural. Recibió su doctorado en la Universidad de Maryland, College Park en 2010.

Murali Krishna Ramanathan es científico aplicado principal en los laboratorios de IA de AWS y codirige AWS CodeWhisperer, un compañero de codificación generativo impulsado por IA. Le apasiona crear herramientas de software y flujos de trabajo que ayuden a mejorar la productividad de los desarrolladores. En el pasado, creó Piranha, una herramienta de refactorización automatizada para eliminar código debido a indicadores de funciones obsoletas y dirigió iniciativas de calidad de código en ingeniería de Uber. Ha recibido el premio de la facultad de Google (2015), el premio al artículo distinguido ACM SIGSOFT (ISSTA 2016) y el premio Maurice Halstead (Purdue 2006). Recibió su doctorado en Ciencias de la Computación de la Universidad Purdue en 2008.

Ramesh Nallapati es científico aplicado principal sénior en AWS AI Labs y codirige CodeWhisperer, un compañero de codificación generativo impulsado por IA, y Titan Large Language Models en AWS. Sus intereses se encuentran principalmente en las áreas de Procesamiento del Lenguaje Natural e IA Generativa. En el pasado, Ramesh ha brindado liderazgo científico en la entrega de muchos productos de AWS basados ​​en PNL, como Kendra, Quicksight Q y Contact Lens. Ocupó puestos de investigación en Stanford, CMU e IBM Research, y recibió su doctorado. en Ciencias de la Computación de la Universidad de Massachusetts Amherst en 2006.

punto_img

Información más reciente

punto_img