Поделиться через


Модели Codex и Служба Azure OpenAI

Внимание

Эта статья была создана и протестирована на основе устаревших моделей создания кода. Эти модели используют API завершения и его стиль взаимодействия с запросом и завершением. Если вы хотите протестировать методы, описанные в этой статье, рекомендуется использовать gpt-35-turbo-instruct модель, которая позволяет получить доступ к API завершения. Однако для создания кода API завершения чата и последних моделей GPT-4o будут получать наилучшие результаты, но запросы должны быть преобразованы в стиль беседы, характерный для взаимодействия с этими моделями.

Серия моделей Codex является потомком нашей серии GPT-3, которая была обучена как на естественном языке, так и на миллиардах строк кода. Лучше всего такие модели разбираются в Python, но хорошо понимают и более десятка других языков, в том числе C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL и даже Shell.

Codex можно использовать для выполнения различных задач, включая:

  • Преобразование комментариев в код
  • Завершение следующей строки или функции в контексте
  • Извлечение знаний, например поиск полезной библиотеки или вызова API для приложения
  • Добавление комментариев
  • Перезапись кода для повышения эффективности

Использование моделей завершения с кодом

Ниже приведены несколько примеров использования Codex, которые можно протестировать на детской площадке Azure AI Studio с развертыванием модели серии Codex, например code-davinci-002.

Фраза "Привет" (Python)

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

Создание случайных имен (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
"""

Создание запроса 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 =

Объяснение кода (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?

Рекомендации

Начните с комментария, данных или кода

Вы можете поэкспериментировать с помощью одной из моделей Codex на нашей тестовой площадке (при необходимости стилизуя инструкции в качестве комментариев).

Для создания полезного завершения с помощью модели Codex, следует подумать о том, какая информация потребуется программисту для выполнения задачи. Это может быть просто четкий комментарий или данные, необходимые для написания полезной функции, например имена переменных или класс, обрабатываемый функцией.

В этом примере мы сообщаем Codex, как необходимо назвать функцию и какую задачу она будет выполнять.

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

Этот подход масштабируется до такой степени, когда можно предоставить Codex комментарий и пример схемы базы данных, чтобы она написала полезные запросы к различным базам данных. Ниже приведен пример, в котором представлены столбцы и имена таблиц для запроса.

# 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

При показе Codex схемы базы данных она может сделать информированное предположение о необходимом формате запроса.

Укажите язык программирования

Codex понимает десятки различных языков программирования. Многие из них используют схожие соглашения в отношении комментариев, функций и других синтаксических конструкций программирования. Если вы укажете язык и версию в комментарии, Codex сможет более эффективно подстроить завершение под ваши пожелания. При этом модели Codex являются довольно гибкими в плане стиля и синтаксиса. Ниже приведен пример для R и Python.

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

Поставьте Codex задачу в соответствии со своими пожеланиями

Если вы хотите создать веб-страницу Codex, поместите начальную строку кода в HTML-документ (<!DOCTYPE html>) после того, как комментарий сообщает Codex, что он должен сделать дальше. Тот же метод подойдет для создания функции из комментария (путем добавления после комментария новой строки, начинающейся с func или def).

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

Размещение <!DOCTYPE html> после комментария даст Codex возможность более четко понять, чего мы от нее хотим.

А если мы хотим написать функцию, можно запустить запрос следующим образом, и Codex поймет, что ей нужно делать дальше.

# Create a function to count to 100

def counter

Указание библиотек поможет Codex понять, чего вы хотите

Codex знакома с большим количеством различных библиотек, API и модулей. Если вы укажете Codex, какие из них следует использовать, либо через комментарий, либо путем их импорта в код, Codex будет делать предложения на основе именно этих , а не альтернативных источников.

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

Указав версию, вы убедитесь, что Codex использует самую последнюю версию библиотеки.

Примечание.

Codex может предложить полезные библиотеки и API, но следует обязательно провести собственные исследования, чтобы убедиться, что такие библиотеки и API безопасны для вашего приложения.

Стиль комментариев может повлиять на качество кода

При использовании некоторых языков стиль комментариев может повысить качество результатов. Например, при работе с Python в отдельных случаях использование строк документа (комментариев, заключенных в тройные кавычки) может дать более качественные результаты, чем использование символа решетки (#).

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

Комментарии внутри функций могут быть полезными

Рекомендуемые стандарты написания кода обычно предлагают размещение описания функции внутри такой функции. Использование данного формата помогает Codex лучше понимать, каких действий вы ожидаете от функции.

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

Приведите примеры более точных результатов

Если вы хотите, чтобы Codex использовала определенный стиль или формат, приведение примеров или демонстрация в первой части запроса поможет Codex обеспечить более точное соответствие вашим потребностям.

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

Более низкие показатели температуры дают более точные результаты

Установка температуры API на уровне, равном (0) или близком к нулю (например, 0,1 или 0,2) в большинстве случаев дает более точные результаты. В отличие от моделей GPT-3, где более высокая температура может обеспечить полезные творческие и случайные результаты, более высокие температуры с моделями Codex могут создавать случайные или эрратические ответы.

Если вы хотите, чтобы Codex выдавала различные потенциальные результаты, начните с нуля, а затем постепенно увеличивайте показатель на 0,1, пока не найдете подходящий вариант.

Организуйте задачи в функции

Для того чтобы писать функции с помощью Codex, необходимо как можно точнее указать в комментариях, что именно функция должна делать. Например, если вы напишете следующий комментарий, Codex создаст функцию таймера JavaScript, которая активируется при нажатии пользователем кнопки:

Простой таймер JavaScript

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

Создание примеров данных

Тестирование приложений часто требует использования примеров данных. Поскольку Codex является языковой моделью, которая понимает, как распознавать естественный язык и писать на нем, можно ставить Codex задачи по созданию таких данных, как массивы вымышленных имен, продуктов и других переменных. Здесь, например, мы просим Codex создать массив данных о температуре воздуха.

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

Запрос Codex на выполнение этой задачи приведет к созданию следующей таблицы:

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

Составные функции и небольшие приложения

Мы можем написать Codex комментарий, состоящий из сложного запроса, например, о создании генератора случайных имен или выполнении задач с пользовательскими входными данными, а Codex может создать остальное при условии достаточно количества маркеров.

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

Ограничение размера завершения для получения более точных результатов или сокращения задержек

Запрос более длительных завершений в Codex может привести к неточным ответам и повторениям. Ограничьте размер запроса, уменьшив максимальное число маркеров (max_tokens) и установив маркеры остановки. Например, добавьте \n в качестве последовательности остановки, чтобы ограничить размер завершений одной строкой кода. Завершения меньшего размера также приводят к меньшим задержкам.

Использование потоковой передачи для сокращения задержки

Выполнение больших запросов Codex может занять десятки секунд. Для создания приложений, требующих меньшей задержки, например помощников по написанию кода, выполняющих автозавершение, рекомендуется использовать потоковую передачу. Ответы будут возвращены до окончания создания моделью всего завершения. Приложения, которым требуется только часть завершения, могут сократить задержку путем отключения завершения либо программным способом, либо с использованием креативных значений для stop.

Для сокращения задержки пользователи могут объединять потоковую передачу с дублированием, запросив несколько решений у API и используя первый возвращенный ответ. Для этого нужно задать n > 1. Такой подход потребляет больше маркеров из квоты, поэтому используйте их продуманно (например, задав разумные параметры для max_tokens и stop).

Использование Codex для объяснения кода

Способность модели Codex создавать и понимать код позволяет использовать ее для выполнения таких задач, как объяснение действий кода в файле. Одним из способов является добавление комментария после функции, который начинается со слов "Эта функция" или "Это приложение представляет собой". Codex обычно интерпретирует это как начало объяснения и завершает его соответствующим образом.

/* Explain what the previous function is doing: It

Объяснение SQL-запроса

В этом примере мы используем Codex для объяснения целей SQL-запроса в удобочитаемом для человека формате.

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

Создание модульных тестов

Модульный тест можно создать в Python, просто добавив комментарий "Модульный тест" и запустив функцию.

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

# Unit test
def

Проверка кода на наличие ошибок

С помощью примеров можно показать Codex, как обнаруживать ошибки в коде. В некоторых случаях примеры не потребуются, однако демонстрация уровня и детализации описания может помочь Codex понять, что искать и как это объяснить. (Проверка на наличие ошибок, выполняемая Codex, не должна заменять тщательную проверку пользователем. )

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

Использование исходных данных для написания функций баз данных

Аналогично тому, как программисту полезно понимать структуру базы данных и имена столбцов, Codex может использовать эти данные для написания точных запросов. В этом примере мы вставляем схему для базы данных и сообщаем Codex, для чего запрашивается эта база данных.

# 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

Преобразование между языками

С помощью Codex можно выполнить преобразование из одного языка в другой, следуя простому формату, в котором в комментарии указывается язык кода, который требуется преобразовать, затем код, а затем комментарий с указанием языка, в который его следует преобразовать.

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

Перезапись кода для библиотеки или платформы

Если вы хотите, чтобы Codex повысила эффективность функции, вы можете предоставить ей код для перезаписи и инструкции по использованию формата.

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

Следующие шаги

Ознакомьтесь с дополнительными сведениями о базовых моделях, лежащих в основе Azure OpenAI.