メむンコンテンツぞスキップ
芋出し画像

OpenAI Codex の䜿い方

    OpenAI APIの「Codex」の䜿い方をたずめたした。

    前回

    1. Codex

    「Codex」は、自然蚀語ず数十億行のコヌドの䞡方で孊習したGPT-3ベヌスのモデルです。Pythonの胜力が最も高く、JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL、Shell を含む10を超える蚀語を熟知しおいたす。

    「Codex」は、次のような様々なタスクに利甚できたす。

    ・コメントをコヌドに倉換。
    ・コンテキスト内で次の行たたは関数を蚘述。
    ・アプリケヌションの有甚なラむブラリや API 呌び出しなどの知識の提䟛。
    ・コメントの远加。
    ・効率化のためのコヌドの曞き盎し。

    2. Codexの䜿甚䟋

    「Playground」でModelに「code-davinci-002」を指定しお詊しおいたす。

    画像

    2-1. 「Hello」ず蚀う (Python)

    """
    Ask the user for their name and say "Hello"
    """
    name = input("What is your name? ")
    print("Hello " + name)

    2-2. ランダムな名前の生成 (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
    """
    import random
    
    first_names = ['John', 'Jane', 'Corey', 'Travis', 'Dave', 'Kurt', 'Neil', 'Sam', 'Steve', 'Tom', 'James', 'Robert', 'Michael', 'Charles', 'Joe', 'Mary', 'Maggie', 'Nicole', 'Patricia', 'Linda', 'Barbara', 'Elizabeth', 'Laura', 'Jennifer', 'Maria']
    
    last_names = ['Smith', 'Doe', 'Jenkins', 'Robinson', 'Davis', 'Stuart', 'Jefferson', 'Jacobs', 'Wright', 'Patterson', 'Wilks', 'Arnold', 'Johnson', 'Williams', 'Jones', 'Brown', 'Davis', 'Miller', 'Wilson', 'Moore', 'Taylor', 'Anderson', 'Thomas', 'Jackson', 'White', 'Harris', 'Martin']
    
    full_names = []
    
    for i in range(100):
        first = random.choice(first_names)
        last = random.choice(last_names)
        full_names.append(f"{first} {last}")
    
    print(full_names

    2-3. 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 =
    query = """
    SELECT * FROM customers
    WHERE State = 'TX' AND FirstName = 'Jane'
    """
    
    run_query(query)

    2-4. コヌドの説明 (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?
    // Function 1 creates an array of 50 random full names.

    2-5. その他の䜿甚䟋

    その他の䜿甚䟋は、以䞋の「Example」で参照できたす。

    3. ベストプラクティス

    ベストプラクティスは、次のずおりです。

    3-1. コメント・デヌタ・コヌドから始める

    Codexに有甚な補完コヌドを䜜成させるには、プログラマがタスクを実行するためにどのような情報が必芁であるか考えるこずが圹立ちたす。䟋えば、明確なコメントや、倉数名や関数が扱うクラス名など、これらは補完コヌドを䜜成するために必芁なデヌタです。

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

    3-2. 蚀語の指定

    Codex は、数十の異なるプログラミング蚀語を理解したす。倚くは、コメント、関数、およびその他のプログラミング構文に぀いお同様の芏則を共有しおいたす。コメントで蚀語ずバヌゞョンを指定するこずにより、Codex は必芁なものをより適切に補完できたす。

    # 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>) を配眮したす。

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

    同じ方法で、コメントの埌に func たたは def で始たる行を远加するこずで、関数を䜜成できたす。

    # Create a function to count to 100
    
    def counter

    関数を曞き始めるず、Codexは次に䜕をする必芁があるかを理解したす。

    3-3. ラむブラリの指定

    コメントたたはむンポヌトで䜿甚するのラむブラリを指定するず、Codexが必芁なものを理解するのに圹立ちたす。

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

    バヌゞョンを指定するこずで、Codexが最新のラむブラリを䜿甚しおいるこずを確認できたす。

    3-4. コメントのスタむル

    䞀郚の蚀語では、コメントのスタむルによっお出力品質が向䞊したす。たずえば、Python を䜿甚する堎合、ドキュメント文字列 (䞉重匕甚笊で囲たれたコメント) を䜿甚するず、シャヌプ (#) 蚘号を䜿甚するよりも出力品質が向䞊したす。

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

    3-5. 関数内にコメントを蚘述

    関数内にコメントを蚘述した方が、Codexが明確に理解するのに圹立ちたす。掚奚されるコヌディングでは、通垞、関数の蚘述を関数内に配眮するこずを提案しおいたす。

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

    3-6. 䟋の指定

    Codexで䜿甚する必芁がある特定のスタむルたたは圢匏がある堎合は、芁求の最初の郚分で䟋を指定するず、Codexが明確に理解するのに圹立ちたす。

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

    3-7. temperaturesは䜎くする

    ほずんどの堎合、temperatures を0たたは0に近い倀 (0.1 や 0.2 など) に蚭定した方が、より良い結果を埗られたす。GPT-3では temperatures が高いほどクリ゚むティブな結果が埗られたすが、Codexにずっおはランダムで䞍芏則な結果になりたす。

    3-8. 関数が䜕をすべきかを指定

    コメントで関数が䜕をすべきかをできるだけ正確に指定するこずで、関数の補完コヌドを生成できたす。

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

    3-9. サンプルデヌタの䜜成

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

    3-10. タスクのリストアップ

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

    3-11. 結果サむズの制限

    maximum length を枛らし、stop sequence を蚭定しお、結果サむズを制限するこずは、より正確な結果を埗る、たたは埅ち時間を短瞮するこずに繋がりたす。

    3-12. ストリヌミングで埅ち時間を短瞮

    オヌトコンプリヌトなど、䜎レむテンシを必芁ずする機胜には、ストリヌミングの䜿甚を怜蚎しおください。モデルが党おの結果生成を完了する前に、応答が返されたす。

    3-13. コヌドに぀いお説明

    Codexに、コヌドが䜕を行っおいるかを説明しおもらうこずができたす。これを実珟する方法の1぀は、関数の埌に"This function" たたは "This application is." で始たるコメントを入れるこずです。Codexは通垞、これを説明の開始ず解釈し、残りのテキストを完成させたす。

    /* Explain what the previous function is doing: It

    3-14. 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
    --

    3-15. 単䜓テストの䜜成

    コメント「Unit test」を远加しお関数を開始するだけで、単䜓テストを䜜成できたす。

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

    3-16. ゚ラヌ原因に぀いお説明

    Codexに、コヌドの゚ラヌ原因を説明しおもらうこずができたす。

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

    3-17. デヌタベヌス構造ず列名の情報を指定

    デヌタベヌス構造ず列名の情報を指定するこずで、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 by Adele

    3-18. 蚀語の倉換

    ある蚀語から別の蚀語に倉換したい堎合は、倉換したいコヌドの蚀語をコメントにリストし、その埌にコヌドず翻蚳したい蚀語のコメントを蚘述したす。

    # Convert this from Python to R
    # Python version
    
    [ Python code ]
    
    # End
    
    # R version

    3-19. コヌドを曞き盎す

    関数を曞き盎したい堎合は、曞き換えるコヌドを提䟛し、その埌に䜿甚する圢匏に぀いおの指瀺を蚘述したす。

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

    4. コヌドの挿入

    completions゚ンドポむントは、prefix に加えお suffix を指定するこずで、コヌド内ぞのコヌドの挿入をサポヌトしたす。

    4-1. ベストプラクティス

    ベストプラクティスは、次のずおりです。

    ◎ max_tokens > 256 を䜿甚
    このモデルは、より長い補完コヌドを挿入するのに適しおいたす。max_tokens が小さすぎるず、suffixに接続する前にモデルが切断される可胜性がありたす。

    ◎ finish_reason == "stop" を優先
    モデルが自然な停止点、たたはナヌザヌが指定した stop sequence に到達するず、finish_reason == "stop" が蚭定されたす。これは、モデルが suffix にうたく接続できたこずを瀺しおおり、完成床の良いシグナルです。

    ◎ 35回リサンプリングする
    補完コヌドは prefix に接続したすが、suffix の接続に苊劎する堎合がありたす。その堎合は、3〜5回のリサンプリング (たたは k=3,5 で best_of を䜿甚) しお、finish_reason == "stop" でサンプルを遞択する手法が効果的です。リサンプリング時は、倚様性を高めるために temperatures を高くする必芁がありたす。

    【泚】 返されたすべおのサンプルが finish_reason == "length" の堎合は、max_tokens が小さすぎである可胜性が高いです。

    5. コヌドの線集

    edits゚ンドポむント は、コヌドを完成させるだけでなく、コヌドを線集するために䜿甚できたす。いく぀かのコヌドずその倉曎方法の指瀺を指定するず、code-davinci-edit-001モデルがそれに応じお線集を詊みたす。

    5-1. 䟋

    䟋は、次のずおりです。

    ◎ 関数を曞く
    ・INPUT

    (なし)

    ・INSTRUCTIONS

    Write a function in python that calculates fibonacci

    ・OUTPUT

    def fibonacci(num):
        a = 0
        b = 1
        if num ==1:
           print(a)
        else:
            print(a)
            print(b)
            #the  sequence starts with 0,1
            for i in range(2,num):
                c = a+b
                a = b
                b = c
                print(c)
    
    fibonacci(10)

    ◎ リファクタリング
    ・INPUT

        if num ==1:
            print(a)
        else:
            print(a)
            print(b)
            #the  sequence starts with 0,1
            for i in range(2,num):
                c = a+b
                a = b
                b = c
                print(c)
    
    fibonacci(10)

    ・INSTRUCTIONS

    Refactor this function to be recursive

    ・OUTPUT

    def fibonacci(num):
        if num <= 1:
            return num
        else:
            return fib(num-1) + fib(num-2)
    print(fibonacci(10))

    ◎ 関数のリネヌム
    ・INPUT

    def fibonacci(num):
        if num <= 1:
            return num
        else:
            return fib(num-1) + fib(num-2)
    print(fibonacci(10))

    ・INSTRUCTIONS

    Rename the function to fib

    ・OUTPUT

    def fib(num):
        if num <= 1:
              return num
          else:
            return fib(num-1) + fib(num-2)
    print(fib(10))

    5-2. ベストプラクティス

    ベストプラクティスは、次のずおりです。

    (1) 空のプロンプトの䜿甚を怜蚎しおください。この堎合、線集は補完ず同様になりたす。
    (2) 指瀺はできるだけ具䜓的に指定しおください。
    (3) モデルが解を芋぀けられず゚ラヌになるこずがありたす。その堎合は、指瀺を蚀い換える必芁がありたす。

    次回



     
     

    npaka

     
     
    プログラマヌ。iPhone / Android / Unity / ROS / AI / AR / VR / RasPi / ロボット / ガゞェット。幎2冊ペヌスで技術曞を執筆。アニ゜ン / カラオケ / ギタヌ / 猫 twitter : @npaka123

    あなたぞのおすすめ