Modelos de códice y Azure OpenAI Service
Importante
Este artículo se creó y probó en los modelos de generación de código heredados. Estos modelos usan la API de finalizaciones y su estilo de interacción de solicitud/finalización. Si desea probar las técnicas descritas en este artículo textualmente, se recomienda usar el modelo gpt-35-turbo-instruct
que permite el acceso a la API de finalizaciones. Sin embargo, para la generación de código, la API de finalizaciones de chat y los modelos GPT-4o más recientes producirán los mejores resultados, pero las indicaciones deberán convertirse al estilo conversacional específico para interactuar con esos modelos.
La serie de modelos Codex es una descendiente de nuestra serie GPT-3 que ha sido entrenada tanto en lenguaje natural como en miles de millones de líneas de código. Es más capaz en Python y competente en más de una docena de lenguajes incluyendo JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL, e incluso Shell.
Puede utilizar el Codex para una variedad de tareas, entre ellas:
- Convertir comentarios en código
- Completar la siguiente línea o función en contexto
- Traer conocimientos, como buscar una biblioteca útil o una llamada API para una aplicación.
- Agregar comentarios
- Reescritura de código para mejorar la eficacia
Uso de modelos de finalizaciones con código
Estos son algunos ejemplos de uso de Codex que pueden probarse en el área de juegos del Estudio de IA de Azure con una implementación de un modelo de la serie Codex, como code-davinci-002
.
Decir "Hola" (Python)
"""
Ask the user for their name and say "Hello"
"""
Crear nombres aleatorios (Python)
"""
1. Create a list of first names
2. Create a list of last names
3. Combine them randomly into a list of 100 full names
"""
Crear una consulta MySQL (Python)
"""
Table customers, columns = [CustomerId, FirstName, LastName, Company, Address, City, State, Country, PostalCode, Phone, Fax, Email, SupportRepId]
Create a MySQL query for all customers in Texas named Jane
"""
query =
Explicar el código (JavaScript)
// Function 1
var fullNames = [];
for (var i = 0; i < 50; i++) {
fullNames.push(names[Math.floor(Math.random() * names.length)]
+ " " + lastNames[Math.floor(Math.random() * lastNames.length)]);
}
// What does Function 1 do?
Procedimientos recomendados
Comience con un comentario, datos o código
Puedes experimentar con uno de los modelos de Codex en nuestra área de juegos (estilizando las instrucciones como comentarios cuando sea necesario)
Para que Codex cree una finalización útil es necesario pensar en qué información requerirá un programador para realizar una tarea. Puede tratarse simplemente de un comentario claro o de los datos necesarios para escribir una función útil, como los nombres de las variables o la clase que maneja una función.
En este ejemplo le decimos a Codex cómo llamar a la función y qué tarea va a realizar.
# Create a function called 'nameImporter' to add a first and last name to the database
Este enfoque se amplía incluso hasta el punto de que se puede proporcionar a Codex un comentario y un ejemplo de esquema de base de datos para conseguir que escriba peticiones de consulta útiles para varias bases de datos. Este es un ejemplo en el que se proporcionan las columnas y los nombres de tabla para la consulta.
# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]
# Create a query for all albums with more than 10 tracks
Cuando se le muestra a Codex el esquema de la base de datos, es capaz de hacer una suposición informada sobre cómo formatear una consulta.
Especificar el lenguaje de programación
El Codex entiende docenas de lenguajes de programación diferentes. Muchos comparten convenciones similares para comentarios, funciones y otra sintaxis de programación. Al especificar el idioma y la versión en un comentario, Codex es más capaz de proporcionar una terminación para lo que usted desea. Dicho esto, el Codex es bastante flexible con el estilo y la sintaxis. Este es un ejemplo de R y Python.
# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points
Pida al Codex lo que quieres que haga
Si desea que el Codex cree una página web, coloque la línea inicial de código en un documento HTML (<!DOCTYPE html>
) después de que su comentario indique lo que debe hacer a continuación. El mismo método funciona para crear una función a partir de un comentario (siguiendo el comentario con una nueva línea que empiece por func or def).
<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>
La colocación <!DOCTYPE html>
después de nuestro comentario hace que sea muy claro para el Codex lo que queremos que haga.
O si queremos escribir una función podríamos empezar la solicitud de la siguiente manera y Codex entenderá lo que tiene que hacer a continuación.
# Create a function to count to 100
def counter
La especificación de bibliotecas ayudará al Codex a comprender lo que quiere
El Codex es consciente de un gran número de bibliotecas, API y módulos. Si le dice a Codex cuáles debe utilizar, ya sea desde un comentario o importándolas en su código, Codex hará sugerencias basadas en ellas en lugar de en las alternativas.
<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->
Al especificar la versión, puede asegurarse de que Codex utiliza la biblioteca más actual.
Nota
El Codex puede sugerir bibliotecas y API útiles, pero asegúrese siempre de realizar su propia investigación para asegurarse de que son seguras para su aplicación.
El estilo de comentario puede afectar a la calidad del código
Con algunos idiomas, el estilo de comentarios puede mejorar la calidad de la salida. Por ejemplo, cuando se trabaja con Python, en algunos casos, el uso de cadenas de documento (comentarios encapsulados entre comillas triples) puede dar resultados de mayor calidad que usar el símbolo de libra (#
).
"""
Create an array of users and email addresses
"""
Los comentarios dentro de las funciones puede ser útil
Normalmente, los estándares de codificación recomendados sugieren colocar la descripción de una función dentro de la función. El uso de este formato ayuda a Codex a entender más claramente lo que quiere que haga la función.
def getUserBalance(id):
"""
Look up the user in the database ‘UserData' and return their current account balance.
"""
Proporcione ejemplos para obtener resultados más precisos
Si tiene un estilo o formato particular que necesita que Codex utilice, proporcionar ejemplos o demostrarlo en la primera parte de la solicitud ayudará a Codex a ajustarse con mayor precisión a lo que necesita.
"""
Create a list of random animals and species
"""
animals = [ {"name": "Chomper", "species": "Hamster"}, {"name":
Las temperaturas más bajas proporcionan resultados más precisos
Ajustar la temperatura API a 0, o cerca de cero (como 0,1 o 0,2) tiende a dar mejores resultados en la mayoría de los casos. A diferencia de los modelos GPT-3, donde una temperatura más alta puede proporcionar resultados creativos y aleatorios útiles, las temperaturas más altas con modelos Codex podrían producir respuestas aleatorias o erráticas.
En los casos en los que necesite que el Codex proporcione resultados potenciales diferentes, comience en cero y luego incremente hacia arriba en 0,1 hasta que encuentre una variación adecuada.
Organizar las tareas en funciones
Podemos conseguir que Codex escriba funciones especificando lo que la función debe hacer en términos tan precisos como sea posible en los comentarios. Por ejemplo, al escribir el siguiente comentario, Codex crea una función de temporizador en JavaScript que se activa cuando el usuario pulsa un botón:
Un temporizador de JavaScript sencillo
// Create a timer that creates an alert in 10 seconds
Crear datos de ejemplo
Las aplicaciones de prueba suelen requerir el uso de datos de ejemplo. Dado que Codex es un modelo de lenguaje que entiende cómo comprender y escribir lenguaje natural, puede pedirle a Codex que cree datos como matrices de nombres inventados, productos y otras variables. Por ejemplo, aquí le pedimos a Codex que cree una serie de temperaturas meteorológicas.
/* Create an array of weather temperatures for San Francisco */
Si se pide al Codex que realice esta tarea, se obtendrá una tabla como la siguiente:
var weather = [
{ month: 'January', high: 58, low: 48 },
{ month: 'February', high: 61, low: 50 },
{ month: 'March', high: 64, low: 53 },
{ month: 'April', high: 67, low: 55 },
{ month: 'May', high: 70, low: 58 },
{ month: 'June', high: 73, low: 61 },
{ month: 'July', high: 76, low: 63 },
{ month: 'August', high: 77, low: 64 },
{ month: 'September', high: 76, low: 63 },
{ month: 'October', high: 73, low: 61 },
{ month: 'November', high: 68, low: 57 },
{ month: 'December', high: 64, low: 54 }
];
Funciones compuestas y pequeñas aplicaciones
Podemos proporcionar a Codex un comentario que consista en una solicitud compleja como la creación de un generador de nombres aleatorios o la realización de tareas con la entrada del usuario y Codex puede generar el resto siempre que haya suficientes tokens.
/*
Create a list of animals
Create a list of cities
Use the lists to generate stories about what I saw at the zoo in each city
*/
Limitar el tamaño de la terminación para obtener resultados más precisos o reducir la latencia
Solicitar terminaciones más largas en el Codex puede dar lugar a respuestas imprecisas y a repeticiones. Limite el tamaño de la consulta reduciendo max_tokens y estableciendo tokens de parada. Por ejemplo, agregue \n
como secuencia de parada para limitar las terminaciones a una línea de código. Las finalizaciones de menor tamaño también conllevan una menor latencia.
Uso de la transmisión para reducir la latencia
Las grandes consultas de Codex pueden tardar decenas de segundos en completarse. Para crear aplicaciones que requieran una latencia menor, como los asistentes de codificación que realizan autocompletado, considere la posibilidad de usar la transmisión en flujo. Las respuestas se devolverán antes de que el modelo termine de generar la finalización completa. Las aplicaciones que solo necesitan una parte de la finalización pueden reducir la latencia cortando la finalización mediante programación o con valores creativos para stop
.
Los usuarios pueden combinar la transmisión con la duplicación para reducir la latencia solicitando más de una solución a la API y usar la primera respuesta devuelta. Para ello, hay que configurar n > 1
. Este enfoque consume más cuota de tokens, así que úselo con cuidado (por ejemplo, al usar valores razonables para max_tokens
y stop
).
Usar Codex para explicar el código
La capacidad de Codex de crear y entender código nos permite utilizarlo para realizar tareas como explicar lo que hace el código de un archivo. Una forma de conseguirlo es poner un comentario después de una función que empiece por "Esta función" o "Esta aplicación es". El Codex normalmente interpretará esto como el comienzo de una explicación y completará el resto del texto.
/* Explain what the previous function is doing: It
Explicar una consulta SQL
En este ejemplo, usamos el Codex para explicar en un formato legible lo que hace una consulta SQL.
SELECT DISTINCT department.name
FROM department
JOIN employee ON department.id = employee.department_id
JOIN salary_payments ON employee.id = salary_payments.employee_id
WHERE salary_payments.date BETWEEN '2020-06-01' AND '2020-06-30'
GROUP BY department.name
HAVING COUNT(employee.id) > 10;
-- Explanation of the above query in human readable format
--
Escribir pruebas unitarias
La creación de una prueba de unidad puede lograrse en Python simplemente al agregar el comentario "Prueba unitaria" y comenzar una función.
# Python 3
def sum_numbers(a, b):
return a + b
# Unit test
def
Comprobar si hay errores en el código
Mediante el uso de ejemplos, puede mostrar a Codex cómo identificar errores en el código. En algunos casos no se requieren ejemplos, sin embargo, demostrar el nivel y el detalle para proporcionar una descripción puede ayudar a Codex a entender qué buscar y cómo explicarlo. (La comprobación de errores por parte del Codex no debería sustituir la revisión cuidadosa por parte del usuario)
/* Explain why the previous function doesn't work. */
Uso de datos de origen para escribir funciones de base de datos
Al igual que un programador humano se beneficiaría de entender la estructura de la base de datos y los nombres de las columnas, Codex puede utilizar estos datos para ayudarle a escribir peticiones de consulta precisas. En este ejemplo, se inserta el esquema de una base de datos y se indica a Codex para qué consultar la base de datos.
# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]
# Create a query for all albums with more than 10 tracks
Conversión entre idiomas
Puede conseguir que Codex convierta de un lenguaje a otro mediante un sencillo formato en el que se indica el lenguaje del código que se quiere convertir en un comentario, seguido del código y luego un comentario con el lenguaje al que se quiere traducir.
# Convert this from Python to R
# Python version
[ Python code ]
# End
# R version
Volver a escribir código para una biblioteca o marco
Si quieres que Codex haga una función más eficiente, puedes proporcionarle el código a reescribir seguido de una instrucción sobre qué formato utilizar.
// Rewrite this as a React component
var input = document.createElement('input');
input.setAttribute('type', 'text');
document.body.appendChild(input);
var button = document.createElement('button');
button.innerHTML = 'Say Hello';
document.body.appendChild(button);
button.onclick = function() {
var name = input.value;
var hello = document.createElement('div');
hello.innerHTML = 'Hello ' + name;
document.body.appendChild(hello);
};
// React version:
Pasos siguientes
Más información sobre los modelos subyacentes que impulsan Azure OpenAI.