Compartilhar via


Modelos Codex e Serviço OpenAI do Azure

Observação

Este artigo foi criado e testado com base nos modelos de geração de código herdados. Esses modelos usam a API de conclusões e seu estilo de interação de prompt/conclusão. Se você quiser testar as técnicas descritas neste artigo, recomendamos usar o modelo gpt-35-turbo-instruct que permite o acesso à API de conclusões. No entanto, para a geração de código, a API de conclusões de chat e os modelos GPT-4 mais recentes geralmente produzirão os melhores resultados, mas os prompts precisariam ser convertidos no estilo de conversa 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 em bilhões de linhas de código. Ela é a mais preparada no Python e proficiente em dezenas de linguagens, incluindo C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL e até Shell.

Use o Codex para várias tarefas, incluindo:

  • Transformar comentários em código
  • Concluir sua próxima linha ou função no contexto
  • Trazer conhecimento para você, como encontrar uma biblioteca útil ou uma chamada à API para um aplicativo
  • Adicionar comentários
  • Reescrever código para eficiência

Como usar os modelos codex

Veja alguns exemplos de uso do Codex que podem ser testados no playground do Estúdio de OpenAI do Azure com uma implantação de um modelo de série de 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 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?

Práticas recomendadas

Começar com um comentário, dados ou código

Você pode experimentar o uso de 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 gravar uma função útil, como os nomes das variáveis ou qual classe uma função identifica.

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

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

Essa abordagem é escalada até o ponto em que você pode fornecer ao Codex um comentário e um exemplo de esquema de banco de dados para fazê-lo gravar solicitações de consulta úteis em vários bancos de dados. Aqui está um exemplo em que fornecemos as colunas e os nomes de tabela 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 de banco de dados, ele é capaz de fazer uma estimativa informada sobre como formatar uma consulta.

Especificar a linguagem de programação

O Codex entende dezenas de linguagens de programação diferentes. Muitas compartilham convenções semelhantes para comentários, funções e outras sintaxes de programação. Ao especificar a linguagem e qual versão em um comentário, o Codex é mais capaz de fornecer uma conclusão para o que você deseja. Dito isso, a Codex é bastante flexível com estilo e sintaxe. Aqui está um exemplo de 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

Solicitar o Codex com o que você deseja que ele faça

Se você desejar que o Codex crie uma página da Web, coloque a linha de código inicial em um documento HTML (<!DOCTYPE html>) depois que seu comentário informar ao Codex o que ele deve fazer a seguir. O mesmo método funciona para criar uma função a partir de um comentário (colocando após 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 nosso comentário deixa muito claro para o Codex o que queremos que ele faça.

Ou se quisermos gravar uma função, podemos iniciar o prompt da seguinte maneira e o Codex entenderá o que ele precisa fazer a seguir.

# Create a function to count to 100

def counter

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

O Codex conhece um grande número de bibliotecas, APIs e módulos. Ao dizer ao Codex quais usar, seja de um comentário ou importando-as para o código, o Codex fará sugestões com base nelas 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 -->

Ao especificar a versão, você consegue garantir que o Codex use a biblioteca mais atual.

Observação

O Codex pode sugerir bibliotecas e APIs úteis, mas sempre nunca deixe 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 da saída. Por exemplo, ao trabalhar com Python, em alguns casos usar cadeias de caracteres de documento (comentários entre aspas triplas) pode fornecer resultados de maior qualidade do que usar o símbolo de cerquilha (#).

"""
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. Usar esse formato ajuda o Codex a entender de forma mais clara 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.
    """

Fornecer exemplos para resultados mais precisos

Se tiver um estilo ou formato específico que você precise que o Codex use, fornecer exemplos ou demonstrar isso 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 como 0 ou próximo de zero (como 0,1 ou 0,2) tende a dar melhores resultados na maioria dos casos. Ao contrário dos modelos GPT-3, em que uma temperatura mais alta pode fornecer resultados úteis criativos e aleatórios, temperaturas mais altas com modelos Codex podem gerar respostas aleatórias ou erráticas.

Nos casos em que você precisa que o Codex forneça resultados potenciais diferentes, comece em zero e incremente para cima em 0,1 até encontrar uma variação adequada.

Organizar tarefas em funções

Podemos fazer com que o Codex grave funções especificando o que a função deve fazer em termos mais precisos conforme possível no comentário. Por exemplo, ao gravar o seguinte comentário, o Codex cria uma função de temporizador JavaScript disparada quando um usuário pressiona um botão:

Um temporizador JavaScript simples

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

Criar dados de exemplo

Os aplicativos de teste geralmente exigem o uso de dados de exemplo. Como o Codex é um modelo de linguagem que entende como compreender e gravar linguagem natural, você pode pedir ao Codex para criar dados como matrizes de nomes, produtos e outras variáveis compostas. Por exemplo, aqui pedimos ao Codex para criar uma matriz de temperaturas climáticas.

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

Solicitar ao Codex para executar essa 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 aplicativos pequenos

Podemos fornecer ao Codex um comentário que consiste em uma solicitação complexa, como criar um gerador de nome aleatório ou executar tarefas com a entrada do usuário e o Codex pode gerar o restante, 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
*/

Limitar o tamanho da conclusão para resultados mais precisos ou latência menor

Solicitar conclusões mais longas no Codex pode levar a respostas imprecisas e repetições. Limitar o tamanho da consulta reduzindo max_tokens e definindo tokens de parada. Por exemplo, adicione \n como uma sequência de paradas para limitar as conclusões a uma linha de código. Conclusões menores também incorrem em menor latência.

Usar streaming para reduzir a latência

Consultas codex grandes podem levar dezenas de segundos para serem concluídas. Para criar aplicativos que exigem latência menor, como assistentes de codificação que executam a preenchimento automático, considere usar streaming. As respostas serão retornadas antes que o modelo termine de gerar toda a conclusão. 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-a cuidadosamente (por exemplo, usando configurações razoáveis para max_tokens e stop).

Usar o Codex para explicar o código

A capacidade do Codex de criar e entender o código nos permite usá-lo para executar tarefas como explicar o que faz o código em um arquivo. Uma maneira de fazer isso é colocando um comentário após uma função que começa com "Essa função" ou "Este aplicativo é". O Codex geralmente interpretará isso como o início de uma explicação e concluirá o restante 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 humano 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
--

Escrevendo testes de unidade

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

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

# Unit test
def

Verificando o código para erros

Usando exemplos, você pode mostrar ao Codex como identificar erros no código. Em alguns casos, nenhum exemplo é necessário, 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 do Codex para erros não deve substituir a revisão cuidadosa feita pelo usuário. )

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

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

Assim como um programador humano se beneficiaria da compreensão da estrutura do banco de dados e dos nomes das colunas, o Codex pode usar esses dados para ajudá-lo a escrever solicitações de consulta precisas. Neste exemplo, inserimos o esquema de um banco de dados e informamos ao Codex o que consultar no 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 em que você lista a linguagem do código que deseja converter em um comentário, seguido pelo código e, em seguida, um comentário com a linguagem na qual você deseja que ele seja convertido.

# 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 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óximas etapas

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