Partilhar via


Modelos Codex e Serviço Azure OpenAI

Importante

Este artigo foi criado e testado em relação aos modelos de geração de código herdados. Esses modelos usam a API de conclusão e seu estilo de interação prompt/complete. Se você deseja testar as técnicas descritas neste artigo, recomendamos usar o gpt-35-turbo-instruct modelo que permite o acesso à API de conclusão. No entanto, para a geração de código, a API de conclusão de chat e os modelos GPT-4o mais recentes produzirão os melhores resultados, mas os prompts precisariam ser convertidos para o estilo de conversação específico para interagir com esses modelos.

A série de modelos Codex é um descendente da nossa série GPT-3 que foi treinada em linguagem natural e bilhões de linhas de código. É mais capaz em Python e proficiente em mais de uma dúzia de linguagens, incluindo C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL e até mesmo Shell.

Você pode usar o Codex para uma variedade de tarefas, incluindo:

  • Transforme comentários em código
  • Conclua sua próxima linha ou função no contexto
  • Traga conhecimento para você, como encontrar uma biblioteca útil ou uma chamada de API para um aplicativo
  • Adicionar comentários
  • Reescreva o código para eficiência

Como usar modelos de conclusão com código

Aqui estão alguns exemplos de uso do Codex que podem ser testados no playground do Azure AI Studio com uma implantação de um modelo da série Codex, como code-davinci-002.

Dizendo "Olá" (Python)

"""
Ask the user for their name and say "Hello"
"""

Criar nomes aleatórios (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
"""

Criar uma 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 =

Explicando o 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?

Melhores práticas

Comece com um comentário, dados ou código

Você pode experimentar usando um dos modelos Codex em nosso playground (instruções de estilo como comentários quando necessário.)

Para que o Codex crie uma conclusão útil, é útil pensar em quais informações um programador precisaria para executar uma tarefa. Isso pode ser simplesmente um comentário claro ou os dados necessários para escrever uma função útil, como os nomes das variáveis ou a classe que uma função manipula.

Neste exemplo, dizemos ao Codex como chamar a função e qual tarefa ela vai executar.

# Create a function called 'nameImporter' to add a first and last name to the database

Essa abordagem é dimensionada até o ponto em que você pode fornecer ao Codex um comentário e um exemplo de um esquema de banco de dados para fazê-lo escrever solicitações de consulta úteis para vários bancos de dados. Aqui está um exemplo em que fornecemos as colunas e os nomes das tabelas para a 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

Quando você mostra ao Codex o esquema do banco de dados, ele é capaz de fazer uma suposição informada sobre como formatar uma consulta.

Especificar a linguagem de programação

Codex compreende dezenas de linguagens de programação diferentes. Muitos compartilham convenções semelhantes para comentários, funções e outras sintaxe de programação. Ao especificar o idioma e qual versão em um comentário, o Codex é mais capaz de fornecer uma conclusão para o que você deseja. Dito isto, o Codex é bastante flexível com estilo e sintaxe. Aqui está um exemplo para R e Python.

# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points

Avisar Codex com o que você quer que ele faça

Se você quiser que o Codex crie uma página da Web, colocar a linha inicial de código em um documento HTML (<!DOCTYPE html>) após o comentário informa ao Codex o que ele deve fazer em seguida. O mesmo método funciona para criar uma função a partir de um comentário (seguindo o comentário com uma nova linha começando com func ou def).

<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>

Colocar <!DOCTYPE html> após o nosso comentário deixa muito claro para o Codex o que queremos que ele faça.

Ou se quisermos escrever uma função, podemos iniciar o prompt da seguinte forma e o Codex entenderá o que ele precisa fazer em seguida.

# Create a function to count to 100

def counter

Especificar bibliotecas ajudará o Codex a entender o que você deseja

Codex está ciente de um grande número de bibliotecas, APIs e módulos. Ao dizer ao Codex quais usar, seja a partir de um comentário ou importá-los para o seu código, o Codex fará sugestões com base neles em vez de alternativas.

<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->

Especificando a versão, você pode certificar-se de que o Codex usa a biblioteca mais atual.

Nota

O Codex pode sugerir bibliotecas e APIs úteis, mas certifique-se sempre de fazer sua própria pesquisa para garantir que elas sejam seguras para seu aplicativo.

O estilo de comentário pode afetar a qualidade do código

Em alguns idiomas, o estilo dos comentários pode melhorar a qualidade dos resultados. Por exemplo, ao trabalhar com Python, em alguns casos o uso de cadeias de caracteres doc (comentários envoltos em aspas triplas) pode fornecer resultados de qualidade superior ao uso do símbolo de libra (#).

"""
Create an array of users and email addresses
"""

Comentários dentro de funções podem ser úteis

Os padrões de codificação recomendados geralmente sugerem colocar a descrição de uma função dentro da função. O uso desse formato ajuda o Codex a entender mais claramente o que você deseja que a função faça.

def getUserBalance(id):
    """
    Look up the user in the database ‘UserData' and return their current account balance.
    """

Forneça exemplos para resultados mais precisos

Se você tiver um estilo ou formato específico que precisa usar do Codex, fornecer exemplos ou demonstrá-lo na primeira parte da solicitação ajudará o Codex a corresponder com mais precisão ao que você precisa.

"""
Create a list of random animals and species
"""
animals  = [ {"name": "Chomper", "species": "Hamster"}, {"name":

Temperaturas mais baixas dão resultados mais precisos

Definir a temperatura da API para 0, ou perto de zero (como 0,1 ou 0,2) tende a dar melhores resultados na maioria dos casos. Ao contrário dos modelos GPT-3, onde uma temperatura mais alta pode fornecer resultados criativos e aleatórios úteis, temperaturas mais altas com modelos Codex podem produzir respostas aleatórias ou erráticas.

Nos casos em que você precisa do Codex para fornecer resultados potenciais diferentes, comece em zero e, em seguida, aumente em 0,1 até encontrar a variação adequada.

Organizar tarefas em funções

Podemos fazer com que o Codex escreva funções especificando o que a função deve fazer em termos tão precisos quanto possível no comentário. Por exemplo, escrevendo o seguinte comentário, o Codex cria uma função de temporizador JavaScript que é acionada quando um usuário pressiona um botão:

Um temporizador JavaScript simples

// Create a timer that creates an alert in 10 seconds

Criando dados de exemplo

O teste de aplicativos geralmente requer o uso de dados de exemplo. Como o Codex é um modelo de linguagem que entende como compreender e escrever linguagem natural, você pode pedir ao Codex para criar dados como matrizes de nomes inventados, produtos e outras variáveis. Por exemplo, aqui pedimos ao Codex para criar uma matriz de temperaturas meteorológicas.

/* Create an array of weather temperatures for San Francisco */

Pedir ao Codex para executar esta tarefa produzirá uma tabela como esta:

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 }
];

Funções compostas e pequenas aplicações

Podemos fornecer ao Codex um comentário que consiste em uma solicitação complexa, como criar um gerador de nomes aleatório ou executar tarefas com a entrada do usuário e o Codex pode gerar o resto, desde que haja tokens suficientes.

/*
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
*/

Limite o tamanho da conclusão para obter resultados mais precisos ou latência mais baixa

Solicitar preenchimentos mais longos no Codex pode levar a respostas imprecisas e repetição. Limite o tamanho da consulta reduzindo max_tokens e definindo tokens de parada. Por exemplo, adicione \n como uma sequência de parada para limitar as finalizações a uma linha de código. Finalizações menores também incorrem em menos latência.

Use o streaming para reduzir a latência

Consultas grandes do Codex podem levar dezenas de segundos para serem concluídas. Para criar aplicativos que exigem latência mais baixa, como assistentes de codificação que executam o preenchimento automático, considere o uso de streaming. As respostas serão retornadas antes que o modelo termine de gerar toda a conclusão. Os aplicativos que precisam apenas de parte de uma conclusão podem reduzir a latência cortando uma conclusão programaticamente ou usando valores criativos para stop.

Os usuários podem combinar streaming com duplicação para reduzir a latência solicitando mais de uma solução da API e usando a primeira resposta retornada. Faça isso definindo n > 1. Essa abordagem consome mais cota de token, portanto, use com cuidado (por exemplo, usando configurações razoáveis para max_tokens e stop).

Use o Codex para explicar o código

A capacidade do Codex de criar e entender código nos permite usá-lo para executar tarefas como explicar o que o código em um arquivo faz. Uma maneira de conseguir isso é colocando um comentário após uma função que começa com "Esta função" ou "Esta aplicação é". O Codex geralmente interpreta isso como o início de uma explicação e completa o resto do texto.

/* Explain what the previous function is doing: It

Explicando uma consulta SQL

Neste exemplo, usamos o Codex para explicar em um formato legível por humanos o que uma consulta SQL está fazendo.

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
--

Escrita de testes unitários

A criação de um teste de unidade pode ser realizada em Python simplesmente adicionando o comentário "Unit test" e iniciando uma função.

# Python 3
def sum_numbers(a, b):
  return a + b

# Unit test
def

Verificando erros no código

Usando exemplos, você pode mostrar ao Codex como identificar erros no código. Em alguns casos, não são necessários exemplos, no entanto, demonstrar o nível e os detalhes para fornecer uma descrição pode ajudar o Codex a entender o que procurar e como explicá-lo. (Uma verificação pelo Codex de erros não deve substituir a revisão cuidadosa pelo usuário. )

/* Explain why the previous function doesn't work. */

Usando dados de origem para gravar funções de banco de dados

Assim como um programador humano se beneficiaria de entender a estrutura do banco de dados e os nomes das colunas, o Codex pode usar esses dados para ajudá-lo a escrever solicitações de consulta precisas. Neste exemplo, inserimos o esquema para um banco de dados e dizemos ao Codex para que consultar o banco de dados.

# 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

Conversão entre idiomas

Você pode fazer com que o Codex converta de um idioma para outro seguindo um formato simples onde você lista o idioma do código que deseja converter em um comentário, seguido pelo código e, em seguida, um comentário com o idioma para o qual deseja traduzi-lo.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Reescrevendo código para uma biblioteca ou estrutura

Se você quiser que o Codex torne uma função mais eficiente, você pode fornecer a ele o código a ser reescrito, seguido de uma instrução sobre qual formato usar.

// 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:

Próximos passos

Saiba mais sobre os modelos subjacentes que alimentam o Azure OpenAI.