Completar o código e auxiliar o processo de desenvolvimento
O Azure OpenAI pode ajudar os desenvolvedores em tarefas comuns de desenvolvimento de software, como escrever testes de unidade, concluir código parcial, comentar código e gerar documentação. O uso da assistência de IA pode permitir que os desenvolvedores gastem mais tempo em tarefas complexas de programação e resolução de problemas.
Código parcial completo
Os modelos OpenAI do Azure são capazes de gerar código com base em comentários, nomes de funções e código parcialmente escrito. Quanto mais contexto você puder fornecer ao modelo, mais precisa será a resposta.
Por exemplo, quando dado o seguinte prompt:
complete the following function
"""
# calculate the average of the numbers in an array, but only if they're even
def
complete the following function
"""
// calculate the average of the numbers in an array, but only if they're even
public
O modelo pega os comentários e o início da definição da função e a completa a partir de qualquer contexto que tenha.
# calculate the average of the even numbers in an array
def calculate_even_average(numbers):
total = 0
count = 0
for number in numbers:
if number % 2 == 0:
total += number
count += 1
if count == 0:
return 0 # avoid division by zero
else:
return total / count
// calculate the average of the even numbers in an array
public double CalculateEvenAverage(int[] numbers) {
int total = 0;
int count = 0;
foreach (int number in numbers) {
if (number % 2 == 0) {
total += number;
count++;
}
}
if (count == 0) {
return 0; // avoid division by zero
} else {
return (double) total / count;
}
}
Neste caso, foi capaz de discernir o que queríamos devido a um comentário relativamente simples e completo antes do início da função. Com funções ou tarefas mais complexas, é necessário mais contexto para obter uma resposta útil.
É importante notar que, para algumas linguagens, como Python, a sintaxe é clara o suficiente para que o modelo assuma qual linguagem é desejada. Para linguagens sintaticamente semelhantes, como C# ou Java, há uma maior probabilidade de que o modelo use a linguagem errada. Se for esse o caso, tente especificar o idioma no prompt ou fornecer mais código para o contexto.
Funcionalidade semelhante pode ser vista fornecendo código parcial para o modelo, sem quaisquer comentários. Pegue o seguinte prompt, por exemplo.
complete the following code
"""
def func1(n)
if n==0:
complete the following code
"""
public int Func1(int n) {
if (n == 0) {
O modelo de IA faz o seu melhor para completar a função com a conclusão mais provável da função.
def func1(n):
if n == 0:
return 1
else:
return n * func1(n-1)
public int Func1(int n) {
if (n == 0) {
return 1;
} else {
return n * Func1(n-1);
}
}
A resposta provavelmente também inclui uma explicação em linguagem natural do que essa função está fazendo. Neste caso, respondeu com uma implementação recursiva da função fatorial. No entanto, o prompt também poderia ter sido o início de uma função de Fibonacci, o que ilustra um caso em que precisamos de mais contexto no prompt para indicar melhor o que queremos do modelo.
Ferramentas como o GitHub Copilot utilizam modelos OpenAI para sugerir conclusão de código e função de forma semelhante aos exemplos acima. O GitHub Copilot é um excelente exemplo de uso real dessa funcionalidade que usa prompts internos e o contexto do código que você está escrevendo para agir como seu programador emparelhado.
Escrever testes de unidade
Os modelos OpenAI do Azure podem gerar testes de unidade para funções que você escreve para ajudar a tornar seu código mais robusto. Tomemos como exemplo a função de pesquisa binária.
def binary_search(arr, target):
left, right = 0, len(arr) - 1
while left <= right:
mid = (left + right) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
left = mid + 1
else:
right = mid - 1
return -1
public static int BinarySearch(int[] arr, int target)
{
int left = 0;
int right = arr.Length - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (arr[mid] == target)
{
return mid;
}
else if (arr[mid] < target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
return -1;
}
Forneça essa função junto com o prompt write three unit tests for this function
e você obterá uma resposta semelhante à seguinte.
def test_binary_search():
# Test case 1: Target element is in the middle of the array
arr1 = [1, 2, 3, 4, 5, 6]
target1 = 4
assert binary_search(arr1, target1) == 3
# Test case 2: Target element is at the beginning of the array
arr2 = [1, 2, 3, 4, 5, 6]
target2 = 1
assert binary_search(arr2, target2) == 0
# Test case 3: Target element is not in the array
arr3 = [1, 2, 3, 4, 5, 6]
target3 = 7
assert binary_search(arr3, target3) == -1
[Test]
public void TestBinarySearch1()
{
int[] arr = { 1, 2, 3, 4, 5 };
int target = 3;
int expected = 2;
int result = BinarySearch(arr, target);
Assert.AreEqual(expected, result);
}
[Test]
public void TestBinarySearch2()
{
int[] arr = { 10, 20, 30, 40, 50 };
int target = 35;
int expected = -1;
int result = BinarySearch(arr, target);
Assert.AreEqual(expected, result);
}
[Test]
public void TestBinarySearch3()
{
int[] arr = { 3, 6, 9, 12, 15 };
int target = 6;
int expected = 1;
int result = BinarySearch(arr, target);
Assert.AreEqual(expected, result);
}
Essa funcionalidade é ainda mais útil se você especificar os casos que deseja incluir no prompt, o que reduz o tempo necessário para escrever testes de unidade para seu código.
Adicionar comentários e gerar documentação
Para melhorar ainda mais seu código, os modelos de IA podem adicionar comentários e documentação para você. Tome a seguinte função como exemplo, que pode ser um pouco difícil de entender ao lê-la pela primeira vez sem comentários de código.
def permutations(lst):
if len(lst) == 0:
return []
elif len(lst) == 1:
return [lst]
else:
result = []
for i in range(len(lst)):
temp = lst[i]
remaining = lst[:i] + lst[i+1:]
for p in permutations(remaining):
result.append([temp] + p)
return result
public static List<List<int>> Permutations(List<int> lst)
{
if (lst.Count == 0)
{
return new List<List<int>>();
}
else if (lst.Count == 1)
{
return new List<List<int>> { lst };
}
else
{
List<List<int>> result = new List<List<int>>();
for (int i = 0; i < lst.Count; i++)
{
int temp = lst[i];
List<int> remaining = new List<int>(lst);
remaining.RemoveAt(i);
foreach (List<int> p in Permutations(remaining))
{
List<int> permutation = new List<int> { temp };
permutation.AddRange(p);
result.Add(permutation);
}
}
return result;
}
}
Forneça essa função ao modelo, juntamente com um prompt solicitando que ele adicione comentários ao código, e você obterá uma resposta semelhante à seguinte.
def permutations(lst):
# Check if the input list is empty
if len(lst) == 0:
return []
# Check if the input list has only one element
elif len(lst) == 1:
return [lst]
else:
# Initialize an empty list to store permutations
result = []
# Iterate through each element of the input list
for i in range(len(lst)):
# Remove the current element from the list and store it in a variable
temp = lst[i]
remaining = lst[:i] + lst[i+1:]
# Recursively call the function on the remaining list
for p in permutations(remaining):
# Append the current element to the beginning of each permutation and add it to the result list
result.append([temp] + p)
# Return the final list of permutations
return result
public static List<List<int>> Permutations(List<int> lst)
{
// Check if the input list is empty
if (lst.Count == 0)
{
return new List<List<int>>();
}
// Check if the input list has only one element
else if (lst.Count == 1)
{
return new List<List<int>> { lst };
}
else
{
// Initialize an empty list to store permutations
List<List<int>> result = new List<List<int>>();
// Iterate through each element of the input list
for (int i = 0; i < lst.Count; i++)
{
// Remove the current element from the list and store it in a variable
int temp = lst[i];
List<int> remaining = new List<int>(lst);
remaining.RemoveAt(i);
// Recursively call the function on the remaining list
foreach (List<int> p in Permutations(remaining))
{
// Append the current element to the beginning of each permutation and add it to the result list
List<int> permutation = new List<int> { temp };
permutation.AddRange(p);
result.Add(permutation);
}
}
// Return the final list of permutations
return result;
}
}
Dê um passo adiante e solicite documentação para a função à qual acabou de adicionar comentários.
def permutations(lst):
"""
Generates all possible permutations of a given list of integers using recursion.
Args:
lst (list): The list of integers to generate permutations for.
Returns:
list: A list of all possible permutations of the input list.
"""
# Check if the input list is empty
if len(lst) == 0:
return []
# Check if the input list has only one element
elif len(lst) == 1:
return [lst]
else:
# Initialize an empty list to store permutations
result = []
# Iterate through each element of the input list
for i in range(len(lst)):
# Remove the current element from the list and store it in a variable
temp = lst[i]
remaining = lst[:i] + lst[i+1:]
# Recursively call the function on the remaining list
for p in permutations(remaining):
# Append the current element to the beginning of each permutation and add it to the result list
result.append([temp] + p)
# Return the final list of permutations
return result
/// <summary>
/// Generates all possible permutations of a given list of integers using recursion.
/// </summary>
/// <param name="lst">The list of integers to generate permutations for.</param>
/// <returns>A list of all possible permutations of the input list.</returns> ```
public static List<List<int>> Permutations(List<int> lst)
{
// Check if the input list is empty
if (lst.Count == 0)
{
return new List<List<int>>();
}
// Check if the input list has only one element
else if (lst.Count == 1)
{
return new List<List<int>> { lst };
}
else
{
// Initialize an empty list to store permutations
List<List<int>> result = new List<List<int>>();
// Iterate through each element of the input list
for (int i = 0; i < lst.Count; i++)
{
// Remove the current element from the list and store it in a variable
int temp = lst[i];
List<int> remaining = new List<int>(lst);
remaining.RemoveAt(i);
// Recursively call the function on the remaining list
foreach (List<int> p in Permutations(remaining))
{
// Append the current element to the beginning of each permutation and add it to the result list
List<int> permutation = new List<int> { temp };
permutation.AddRange(p);
result.Add(permutation);
}
}
// Return the final list of permutations
return result;
}
}