Modèles Codex et Azure OpenAI Service
Important
Cet article a été créé et testé sur les modèles de génération de code hérité. Ces modèles utilisent l’API de saisie semi-automatique et son style d’interaction d’invite/saisie semi-automatique. Si vous souhaitez tester les techniques décrites dans cet article, nous vous recommandons d’utiliser le modèle gpt-35-turbo-instruct
qui permet d’accéder à l’API de saisie semi-automatique. Toutefois, pour la génération de code, l’API de complétion de conversation et les derniers modèles GPT-4o donneront les meilleurs résultats, mais les invites devront être converties dans le style conversationnel spécifique à l’interaction avec ces modèles.
La série de modèles Codex est un descendant de notre série GPT-3 qui a été entraînée sur le langage naturel et des milliards de lignes de code. Ils sont les plus capables en langage Python et maîtrisent plus d’une douzaine de langages, notamment C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL et même Shell.
Vous pouvez utiliser Codex pour de nombreuses tâches, notamment :
- Transformer les commentaires en code
- Terminer votre ligne ou fonction suivante dans du contexte
- Vous apporter des connaissances, telles que la recherche d’une bibliothèque ou d’un appel d’API utile pour une application
- Ajouter des commentaires
- Réécriture du code à des fins d’efficacité
Comment utiliser des modèles de complétion avec du code
Voici quelques exemples d’utilisation de Codex qui peuvent être testés dans le terrain de jeu d’Azure AI Studio avec le déploiement d’un modèle de série Codex comme code-davinci-002
.
Dire « Hello » (Python)
"""
Ask the user for their name and say "Hello"
"""
Créer des noms aléatoires (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
"""
Créer une requête 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 =
Explication du code (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?
meilleures pratiques recommandées.
Commencer par un commentaire, des données ou du code
Vous pouvez expérimenter à l’aide de l’un des modèles Codex dans notre terrain de jeu (en transformant les instructions en commentaires selon les besoins).
Pour que Codex crée une complétion utile, il est utile de réfléchir à l’information dont un programmeur aurait besoin pour effectuer une tâche. Cela peut simplement être un commentaire clair ou les données nécessaires pour écrire une fonction utile, comme les noms des variables ou la classe qu’une fonction gère.
Dans cet exemple, nous allons dire à Codex comment appeler la fonction et quelle tâche elle va effectuer.
# Create a function called 'nameImporter' to add a first and last name to the database
Cette approche s’adapte même au point où vous pouvez fournir un commentaire et un exemple de schéma de base de données pour que Codex écrive des requêtes utiles pour diverses bases de données. Voici un exemple où nous fournissons les colonnes et les noms de table pour la requête.
# 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
Lorsque vous montrez à Codex le schéma de la base de données, celui-ci est en mesure de faire une estimation informée sur la façon de mettre en forme une requête.
Spécifier le langage de programmation
Codex inclut des dizaines de langages de programmation différents. Beaucoup partagent des conventions similaires pour les commentaires, les fonctions et d’autres syntaxes de programmation. En spécifiant le langage et quelle version dans un commentaire, Codex est mieux à même de fournir une complétion pour ce que vous souhaitez. Cela dit, Codex est assez flexible avec le style et la syntaxe. Voici un exemple pour R et Python.
# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points
Indiquer à Codex ce que vous voulez qu’il fasse
Si vous souhaitez que Codex crée une page web, le fait de placer la ligne de code initiale dans un document HTML (<!DOCTYPE html>
) après vos commentaires indique à Codex ce qu’il doit faire ensuite. La même méthode fonctionne pour créer une fonction à partir d’un commentaire (en suivant le commentaire avec une nouvelle ligne commençant par func ou def).
<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>
En plaçant <!DOCTYPE html>
après notre commentaire, Codex sait très précisément ce que nous voulons qu’il fasse.
Ou si nous voulons écrire une fonction, nous pourrions commencer l’invite comme suit et Codex comprendra ce qu’il doit faire ensuite.
# Create a function to count to 100
def counter
La spécification des bibliothèques aidera Codex à comprendre ce que vous souhaitez
Codex est conscient d’un grand nombre de bibliothèques, d’API et de modules. En disant à Codex ce qu’il faut utiliser, d’un commentaire ou en les important dans votre code, Codex fera des suggestions basées sur eux plutôt que sur des alternatives.
<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->
En spécifiant la version, vous pouvez vous assurer que Codex utilise la bibliothèque la plus récente.
Notes
Codex peut suggérer des bibliothèques et des API utiles, mais veillez toujours à effectuer vos propres recherches pour vous assurer qu’elles sont sûres pour votre application.
Le style de commentaire peut affecter la qualité du code
Avec certains langages, le style de commentaires peut améliorer la qualité de la sortie. Par exemple, lors de l’utilisation de Python, dans certains cas, l’utilisation de chaînes doc (commentaires entre guillemets triples) peut donner des résultats de meilleure qualité que l’utilisation du symbole livre (#
).
"""
Create an array of users and email addresses
"""
Les commentaires à l’intérieur des fonctions peuvent être utiles
Les normes de codage recommandées suggèrent généralement de placer la description d’une fonction à l’intérieur de la fonction. L’utilisation de ce format permet à Codex de comprendre plus clairement ce que vous voulez que la fonction fasse.
def getUserBalance(id):
"""
Look up the user in the database ‘UserData' and return their current account balance.
"""
Fournir des exemples pour obtenir des résultats plus précis
Si vous disposez d’un style ou d’un format particulier que vous souhaitez que Codex utilise, fournir des exemples ou en faire la démonstration dans la première partie de la demande aidera Codex à répondre à votre demande plus précisément.
"""
Create a list of random animals and species
"""
animals = [ {"name": "Chomper", "species": "Hamster"}, {"name":
Les températures inférieures donnent des résultats plus précis
La définition de la température de l’API sur 0, ou proche de zéro (par exemple, 0,1 ou 0,2) tend à donner de meilleurs résultats dans la plupart des cas. Contrairement aux modèles GPT-3, où une température plus élevée peut fournir des résultats créatifs et aléatoires utiles, des températures plus élevées avec les modèles Codex peuvent produire des réponses aléatoires ou erratiques.
Dans les cas où vous avez besoin de Codex pour fournir différents résultats potentiels, commencez à zéro, puis incrémentez vers le haut de 0,1 jusqu’à ce que vous trouviez une variation appropriée.
Organiser les tâches en fonctions
Nous pouvons faire en sorte que Codex écrive des fonctions en spécifiant ce que la fonction doit faire en termes aussi précis que possible dans un commentaire. Par exemple, en écrivant le commentaire suivant, Codex crée une fonction de minuteur JavaScript déclenchée lorsqu’un utilisateur appuie sur un bouton :
Minuteur JavaScript simple
// Create a timer that creates an alert in 10 seconds
Création d’un exemple de données
Le test d’applications nécessite souvent l’utilisation d’exemples de données. Étant donné que Codex est un modèle de langage qui comprend comment comprendre et écrire le langage naturel, vous pouvez demander à Codex de créer des données telles que des tableaux de noms composés, de produits et d’autres variables. Par exemple, ici, nous demandons à Codex de créer un tableau de températures météorologiques.
/* Create an array of weather temperatures for San Francisco */
Demander à Codex d’effectuer cette tâche produira un tableau comme celui-ci :
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 }
];
Fonctions composées et petites applications
Nous pouvons fournir à Codex un commentaire composé d’une requête complexe, comme la création d’un générateur de noms aléatoire ou l’exécution de tâches avec l’entrée utilisateur et Codex peut générer le reste à condition qu’il y ait suffisamment de jetons.
/*
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
*/
Limiter la taille de complétion pour des résultats plus précis ou une latence inférieure
Demander des complétions plus longues dans Codex peut entraîner des réponses imprécises et une répétition. Limitez la taille de la requête en réduisant max_tokens et en définissant des jetons d’arrêt. Par exemple, ajoutez \n
en tant que séquence d’arrêt pour limiter les complétions à une seule ligne de code. Les complétions plus petites entraînent également moins de latence.
Utiliser le streaming pour réduire la latence
Les grandes requêtes Codex peuvent prendre des dizaines de secondes. Pour créer des applications qui nécessitent une latence inférieure, comme des assistants de codage qui effectuent une autocomplétion, envisagez d’utiliser le streaming. Les réponses seront retournées avant que le modèle ne termine la génération de l’intégralité de la complétion. Les applications qui n’ont besoin que d’une partie d’une complétion peuvent réduire la latence en réduisant la complétion par programmation ou en utilisant des valeurs créatives pour stop
.
Les utilisateurs peuvent combiner le streaming avec la duplication pour réduire la latence en demandant plusieurs solutions à l’API et en utilisant la première réponse retournée. Pour ce faire, définissez n > 1
. Comme cette approche consomme davantage de quota de jetons, utilisez-la soigneusement (par exemple, en utilisant des paramètres raisonnables pour max_tokens
et stop
).
Utiliser Codex pour expliquer le code
La capacité du Codex à créer et à comprendre du code nous permet de l’utiliser pour effectuer des tâches, comme expliquer ce que fait le code d’un fichier. Une façon d’accomplir cela consiste à placer un commentaire après une fonction qui commence par « Cette fonction » ou « Cette application est ». Codex interprétera généralement cela comme le début d’une explication et terminera par complétion le reste du texte.
/* Explain what the previous function is doing: It
Explication d’une requête SQL
Dans cet exemple, nous utilisons Codex pour expliquer dans un format lisible par l’homme ce qu’une requête SQL effectue.
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
--
Écriture de tests unitaires
La création d’un test unitaire peut être effectuée en Python simplement en ajoutant le commentaire « Test unitaire » et en commençant une fonction.
# Python 3
def sum_numbers(a, b):
return a + b
# Unit test
def
Recherche d’erreurs dans le code
En utilisant des exemples, vous pouvez montrer à Codex comment identifier les erreurs dans le code. Dans certains cas, aucun exemple n’est requis. Toutefois, démontrer le niveau et le détail pour fournir une description peut aider Codex à comprendre ce qu’il faut rechercher et comment l’expliquer. (Une recherche d’erreurs par Codex ne doit pas remplacer la révision minutieuse par l’utilisateur.)
/* Explain why the previous function doesn't work. */
Utilisation de données sources pour écrire des fonctions de base de données
Tout comme un programmeur humain tirerait avantage de la compréhension de la structure de base de données et des noms de colonnes, Codex peut utiliser ces données pour vous aider à écrire des requêtes précises. Dans cet exemple, nous insérons le schéma d’une base de données et indiquons à Codex dans quel but interroger la base de données.
# 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
Conversion d’un langage à un autre
Vous pouvez faire en sorte que Codex convertisse un langage en un autre langage en suivant un format simple dans lequel vous répertoriez le langage du code à convertir dans un commentaire, suivi du code, puis d’un commentaire avec le langage dans lequel vous souhaitez qu’il soit converti.
# Convert this from Python to R
# Python version
[ Python code ]
# End
# R version
Réécriture du code pour une bibliothèque ou une infrastructure
Si vous souhaitez que Codex rende une fonction plus efficace, vous pouvez lui fournir le code à réécrire suivi d’une instruction sur le format à utiliser.
// 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:
Étapes suivantes
Découvrez-en plus sur les modèles sous-jacents d’Azure OpenAI.