Codex モデルと Azure OpenAI Service

Note

この記事は、レガシ コード生成モデルに対して作成およびテストされました。 これらのモデルでは、入力候補 API と、対話のプロンプト/完了スタイルが使用されます。 この記事で説明されている手法をそのままテストしたい場合は、completions API にアクセスできる gpt-35-turbo-instruct モデルの使用をお勧めします。 ただし、コード生成の場合、チャット完了 API と最新の GPT-4 モデルが一般的に最適な結果をもたらしますが、プロンプトをそれらのモデルとの対話固有の会話スタイルに変換する必要があります。

Codex モデル シリーズは、自然言語と数十億行のコードの両方でトレーニングされた GPT-3 シリーズの後継です。 Python で最も能力が高く、C#、JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL、シェルなど、12 以上の言語に精通しています。

Codex は次のようなさまざまなタスクに使用できます。

  • コメントをコードに変換する
  • コンテキストで次の行または関数を完成させる
  • アプリケーションに役に立つライブラリや API 呼び出しの検索など、知識をユーザーに提供する
  • コメントの追加
  • 効率を改善するためにコードを書き換える

Codex モデルの使用方法

次に示すのは Codex の使用例です。code-davinci-002 のような Codex シリーズ モデルをデプロイして、Azure OpenAI Studio のプレイグラウンドでテストできます。

"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 で Web ページを作成する場合は、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 を使用する場合、ドキュメント文字列 (三重引用符で囲まれたコメント) を使用すると、ポンド (#) 記号を使用するよりも品質が高まることがあります。

"""
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 など) に設定すると、ほとんどの場合、より良い結果が得られます。 temperature が高いほど有用な創造的でランダムな結果を提供する GPT-3 モデルとは異なり、Codex モデルでは、temperature が高いと、完全にランダムまたは不規則な応答となる場合があります。

さまざまな潜在的な結果を提供するために 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 を減らし、stop トークンを設定して、クエリのサイズを制限してください。 たとえば、\n を停止シーケンスとして追加し、候補を 1 行のコードに制限します。 候補が小さいほど、待機時間も短くなります。

ストリーミングを使用して待機時間を短縮する

大規模な Codex クエリの完了には数十秒かかる場合があります。 オートコンプリートを実行するコーディング アシスタントなど、待機時間を短縮する必要があるアプリケーションを構築するには、ストリーミングの使用を検討してください。 モデルが候補全体の生成を完了する前に、応答が返されます。 候補の一部のみを必要とするアプリケーションでは、プログラム的に、または stop にクリエイティブな値を使用して候補を切り捨てることで待機時間を短縮できます。

ユーザーは、API から複数のソリューションを要求し、返された最初の応答を使用することで、ストリーミングと重複を組み合わせて待機時間を短縮できます。 n > 1 を設定してこれを行ってください。 この方法では、より多くのトークン クォータが消費されるため、慎重に使用してください (たとえば、max_tokensstop に合理的な設定を使用する)。

Codex を使用してコードを説明する

コードを作成して理解する Codex の機能により、これを使用して、ファイル内のコードの実行内容を説明するなどのタスクを実行できます。 これを実現する 1 つの方法は、"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 をサポートする基となるモデルに関する記事を確認します。