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_tokens
및 stop
에 대해 합리적인 설정 사용).
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를 지원하는 기본 모델에 대해 자세히 알아봅니다.