Construire du code à partir d’un langage naturel

Effectué

L’une des capacités des modèles Azure OpenAI consiste à générer du code à partir d’invites en langage naturel. Les tâches peuvent aller d’une simple commande d’une ligne à une application complète. Les modèles IA peuvent aussi modifier et mettre à jour le code fourni ou les réponses précédentes pour achever la tâche demandée.

Modèles IA pour la génération de code

Dans les générations précédentes de modèles gpt, certains ont été entraînés spécialement pour être utilisés avec du code (souvent appelés modèles codex). À mesure que les nouvelles générations de modèles évoluent, les modèles de base améliorent considérablement leurs performances et leur compréhension à la fois du langage et du code, ce qui élimine le besoin de modèles de code spécifiques. Cette amélioration se traduit par un modèle unique pour les générations plus récentes (comme gpt-35-turbo et gpt-4), lequel peut être utilisé à la fois pour le langage naturel et le code.

Les exemples indiqués dans ce module utilisent gpt-35-turbo.

Écrire des fonctions

Les modèles Azure OpenAI sont capables de créer des fonctions et des applications en plusieurs langages si vous décrivez tout simplement ce que vous voulez. Par exemple, supposons que vous avez besoin d’une implémentation de la recherche binaire, mais que vous ne vous souvenez pas de la manière de procéder. À l’invite write a function for binary search in python, vous allez probablement recevoir une réponse avec la fonction et une explication du code.

Sure, here's an example implementation of binary search algorithm in Python:

def binary_search(array, target):  
    low = 0  
    high = len(array) - 1  
  
    while low <= high:  
        mid = (low + high) // 2  
        if array[mid] == target:  
            return mid  
        elif array[mid] < target:  
            low = mid + 1  
        else:  
            high = mid - 1  
  
    return -1  
 
This function takes in two arguments - an array of integers and a target integer that we want to search
for in the array. The function initializes two pointers - low and high - to the first and last indices
of the array, respectively.

Inside the while loop, the function calculates the middle index using integer division (//). If the 
middle element is equal to the target, the function returns the index of the middle element. If the 
middle element is less than the target, we update the low pointer to mid + 1. Otherwise, we update the 
high pointer to mid - 1. We continue these steps until we find the target or the pointers cross each 
other (i.e., low > high).

If the target is not found in the array, the function returns -1.

Note that the binary search algorithm assumes that the input array is sorted in ascending order. If 
the array is not sorted, the algorithm may not return the correct result.

La requête peut aller plus loin que les fonctions et demander une série de fonctions, voire une application entière. La réponse fournit un bon point de départ pour la tâche que vous essayez d’accomplir.

Modifier le langage de codage

Si vous avez du code dans un langage, mais que vous en avez besoin dans un autre, Azure OpenAI peut le traduire pour vous. Par exemple, supposons que vous avez cette fonction print_squares en Python.

def print_squares(n):  
    for i in range(1, n+1):  
        print(i**2)   

Si vous fournissez ce code, ainsi que l’invite convert this code to C#, vous allez probablement obtenir quelque chose de similaire à la fonction suivante.

public void PrintSquares(int n)  
{  
    for (int i = 1; i <= n; i++)  
    {  
        Console.WriteLine(i * i);  
    }  
}  

Notez que le modèle a compris les différences entre la façon dont les boucles for et les fonctions sont définies dans les différents langages (y compris les modificateurs d’accès en C#) et qu’il a modifié le code de manière appropriée.

Comprendre le code inconnu

Les modèles Azure OpenAI s’avèrent utiles pour comprendre le code qui n’a pas l’air cohérent ou qui est susceptible d’être écrit dans un langage que vous ne connaissez pas. Par exemple, supposons que vous avez reçu la fonction suivante (dans un langage de codage fictif) et que vous ne sachiez pas comment la comprendre.

fn qzplv(n: i32, m: i32) -> i32 {
    if n == 0 {
        return m + 1;
    } else if m == 0 {
        return qzplv(n - 1, 1);
    } else {
        return qzplv(n - 1, qzplv(n, m - 1));
    }
}

Quand vous la fournissez au modèle, avec l’invite could you explain what this code is doing?, vous obtenez une réponse similaire à celle-ci :

Sure, I'd be happy to explain what this code is doing!

This code is implementing the Ackermann function, which is a well-known mathematical function that 
grows very quickly in terms of computation time as its inputs increase. The function takes two integer 
arguments (n and m) and returns another integer.

Here's how the function works:
- If n is equal to 0, the function returns m + 1.
- If m is equal to 0, the function calls itself recursively with n - 1 and 1 as arguments.
- Otherwise, the function calls itself recursively with n - 1 and the result of calling itself with n 
and m - 1 as arguments.

The function is implemented in a way that is easy to understand and follow, but it has a very high 
computational complexity. In fact, it grows so quickly that it can't be computed for values of n and m 
greater than about 4 or 5.

La combinaison de l’explication et de la traduction dans un langage que vous connaissez rend cette fonctionnalité encore plus utile.