다음을 통해 공유


Codex 모델 및 Azure OpenAI Service

Important

이 문서는 레거시 코드 생성 모델에 대해 작성 및 테스트되었습니다. 이러한 모델은 완성 API 및 상호 작용의 프롬프트/완성 스타일을 사용합니다. 이 문서에 설명된 기술을 테스트하려면 완성 API에 대한 액세스를 허용하는 gpt-35-turbo-instruct 모델을 사용하는 것이 좋습니다. 그러나 코드 생성의 경우 채팅 완성 API와 최신 GPT-4o 모델을 통해 최상의 결과를 얻을 수 있지만 프롬프트는 해당 모델과 상호 작용하는 데 필요한 대화형 스타일로 변환되어야 합니다.

Codex 모델 시리즈는 자연어와 수십억 줄의 코드에 대해 학습된 GPT-3 시리즈의 하위 항목입니다. Python에서 가장 뛰어나고 C#, JavaScript, Go, Perl, PHP, Ruby, Swift, TypeScript, SQL, 심지어 Shell을 포함한 12개 이상의 언어에 능숙합니다.

다음과 같은 다양한 작업에 Codex를 사용할 수 있습니다.

  • 주석을 코드로 변환
  • 컨텍스트에서 다음 줄 또는 함수 완성
  • 유용한 라이브러리 찾기 또는 애플리케이션에 대한 API 호출과 같은 지식 제공
  • 댓글 추가
  • 효율성을 위한 코드 재작성

코드로 완성 모델을 사용하는 방법

다음은 Codex 시리즈 모델을 code-davinci-002배포하여 Azure AI Studio 플레이그라운드에서 테스트할 수 있는 Codex를 사용하는 몇 가지 예입니다.

"Hello"라고 말하기(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를 제안할 수 있지만 항상 고유의 연구를 수행하여 애플리케이션에 안전한지 확인합니다.

주석 스타일은 코드 품질에 영향을 줄 수 있습니다.

일부 언어에서는 주석 스타일이 출력 품질을 개선시킬 수 있습니다. 예를 들어 Python으로 작업할 때 문서 문자열(3중 따옴표로 묶인 주석)을 사용하면 파운드(#) 기호를 사용하는 것보다 더 높은 품질의 결과를 얻을 수 있습니다.

"""
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에 가깝게(예: 0.1 또는 0.2) 대부분의 경우 더 나은 결과를 제공하는 경향이 있습니다. 온도가 더 높으면 유용하고 창의적이고 임의적인 결과를 제공할 수 있는 GPT-3 모델과 달리, Codex 모델의 온도가 높을수록 실제로 임의적이거나 불규칙한 응답을 제공할 수 있습니다.

Codex가 다른 잠재적인 결과를 제공해야 하는 경우 0에서 시작한 다음 적절한 변형을 찾을 때까지 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_tokensstop에 대해 합리적인 설정 사용).

Codex를 사용하여 코드 설명

Codex의 코드 만들기 및 이해 기능은 파일의 코드가 하는 일을 설명하는 것과 같은 작업을 수행하는 데 사용할 수 있습니다. 이를 수행하는 한 가지 방법은 "This function" 또는 "This application is"로 시작하는 주석을 함수 뒤에 추가하는 것입니다. 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에서 "Unit test"라는 주석을 추가하고 함수를 시작하는 것만으로 단위 테스트를 만들 수 있습니다.

# 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를 지원하는 기본 모델에 대해 자세히 알아봅니다.