Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Github CopilotとChatGPTを使って感じた使い分けの糸口 / JavaDo #22

Github CopilotとChatGPTを使って感じた使い分けの糸口 / JavaDo #22

札幌)ChatGPT/GitHub Copilotなどを活用した開発を共有・体験したい!
https://connpass.com/event/282511/

Hiroto YAMAKAWA

May 20, 2023
Tweet

More Decks by Hiroto YAMAKAWA

Other Decks in Programming

Transcript

  1. #javado
    Github CopilotとChatGPTを使って感じた
    使い分けの⽷⼝
    公立千歳科学技術大学 山川広人


    (@gishi_yama)
    3

    View Slide

  2. #javado
    Hiroto Yamakawa
    4
    公立千歳科学技術大学 情報システム工学科 専任講師
    R&D: Experimental Development of ICT Services, Learning Technology,
    Computer in Education, Programming & Programmer's Education
    千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発
    大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)

    View Slide

  3. #javado
    😆🍶推しの酒蔵さんが札幌に来る!🍶😆というニュースに身を躍らせたものの、
    仕事でどうやっても北海道にいない日だった(´・ω:;.:…
    昨⽇あった悲しかったこと
    5
    日本酒好きな方は、

    私の無念をぜひはらしてください...

    View Slide

  4. #javado
    かなりライトユーザー ChatGPTは課金はしてるけどGPT-3.5(とAPI)で大体事足りてる
     →今日は私自身も勉強したり新しい使い方を体験したい
    基本的には、IntelliJ IDEAやVSCodeで、Github Copilotでのコード生成支援を利用
     →プログラミングにはとても便利。

      プログラミング以外を色々書くときにはやや邪魔にも感じる...(Copilotじゃない方がよい?)
    IntelliJでは、ChatGPTでコード確認(リファクタリング、バグ発見)にも利用しはじめた
     →プラグインで使い勝手も結構変わってくる
    あとはいろいろ気が向いた時にMacGPT経由などで質問してみている
     →いわゆる「ChatGPTに聞いてみた」と同じ使い方。
    使ってるプラグインやツールでデモりながら、設定したことや、使い分けに感じることを話したい
    私の⽣成AIの開発への利⽤のスタンス
    6

    View Slide

  5. #javado
    開発やプログラミングの中ではすごく賢い推測変換として利用できるイメージ
     →No Ideaの状態から生み出す・一般的なコードを書いてもらうより、
      今のコードの続き・今のコードを元にした提案をしてもらえて嬉しい
    Education版は教員も学生も無償なので、学生さんも用量・用法を守って積極的に使ってほしい
     →どういう使い方が良いか?を例示できるようになりたい(と思って試している)
    Github Copilot
    7
    設定としては

    公開コードとのマッチングする提案はブロックして使ってる
    improvementsもOFF

    (エデュケーション使わせてもらっている身でとても心苦しいけど)
    画像引用:https://github.com/settings/copilot

    View Slide

  6. #javado
    とても簡単


    GitHubの公式プラグインを入れて

    (Copilotを有効化してあるアカウントで)IntelliJ IDEA 経由でGithubへログインするだけ
    画面例はIntelliJ IDEAだが、VSCodeでもほぼ同じ工程で完了
    IntelliJ IDEA(VSCode)への導⼊⽅法
    8

    View Slide

  7. #javado
    開発やプログラミングの中ではアイディア出しやより良い案の模索として利用できるイメージ
     →No Ideaの状態から生み出す・一般的なコードを提案してもらえるイメージ
      キーワードレベルの前提条件などを付与した1問1答的な質問は設定しやすい反面、
      これまでのコードや流れ を前提条件にするのはプロンプトが大変...

    エディタに組み込むにはAPI(有償)前提だけど、
    やはり学生さんも用量・用法を守って積極的に使ってほしい
     →こちらもどういう使い方が良いか?を例示できるようになりたい(と思って試している)
    ChatGPT (API)
    9
    画像引用:https://help.openai.com/en/articles/5722486-how-your-data-is-used-to-improve-model-performance
    API経由のデータは学習や改善に使わないよ、と書かれてる
    (...が心配性なので、公式フォームからOpt Outも申請した)

    View Slide

  8. #javado
    とても簡単...だが、公式プラグインはないので、どのプラグインにするか?は迷う...
    個人的にはIntelliJ IDEAで、CodeGPTというプラグインを採用した
    対話型ウィンドウだけではなく、コードを指定してプロンプトをAPIに投げやすい
    プロンプトのカスタマイズ・追加もできる

    (https://plugins.jetbrains.com/plugin/21056-codegpt)
    使ってるモデルはGPT-3.5だけど、自分の使い方では機能的に十分と思う
    VSCode向けは正直、良い感じのプラグインがわからない...(開発に使ってないので)
    きっと次の たかぎとねこ さんが開発したプラグインが良い感じなのでは
    IntelliJ IDEA(VSCode)への導⼊⽅法
    10
    ※学生にもわかりやすく「回答は日本語で」をつけたりできる...が、翻訳待ちで軽快さが損なわれる気もする...

    View Slide

  9. #javado
    A. プラグインの使い方の紹介


    B. 4つの指示で、動作の違いを見てみる


    新規のコードを作る例(1)

     // 生徒データは学籍番号・氏・名・年齢・所属研究室のフィールドを持つ
    // フィールドはそれぞれfinalで、値オブジェクトである。
    新規のコードを作る例(2)

    // 年齢をフィールドで管理する。ただし0歳以上120歳以下にして、それ以外は例外を投げる
    既存コードと組み合わせて作る例(1)

    // フィールドの値を用いてXXXXを作成するファクトリメソッド
    既存コードと組み合わせて作る例(2)

    // XXXXと同じフィールドを持つ
    Copilot / ChatGPTのDemo
    11

    View Slide

  10. #javado
    public class StudentData {


    // ⽣徒データは学籍番号・⽒・名・年齢・所属研究室のフィールドを持つ
    // フィールドはそれぞれfinalで、値オブジェクトである。


    }
    Github Copilot でのクラス⽣成例(1)、(2)
    12
    public class StudentData {


    // ⽣徒データは学籍番号・⽒・名・年齢・所属研究室のフィールドを持つ
    // フィールドはそれぞれfinalで、値オブジェクトである。


    private final StudentId id;


    private final FistName fistName;


    private final LastName lastName;


    private final Age age;


    private final Laboratory laboratory;


    }
    public class Age {


    //年齢をフィールドで管理する。ただし0歳以上120歳以下にして、

    //それ以外は例外を投げる


    }


    public class Age {


    //年齢をフィールドで管理する。ただし0歳以上120歳以下にして、

    // それ以外は例外を投げる


    private final int value;




    public Age(int value) {


    if (value < 0 || 120 < value) {


    throw new IllegalArgumentException("年齢は0歳以上120歳以下です。");
    }


    this.value = value;


    }


    }


    最初はNameで提案するの
    で、FirstNameに書き換える
    と、その後LastNameを

    提案してくる
    1行やコードブロックごと
    に提案
    この後は既存のIDEの推測変
    換でコンストラクタや値オブ
    ジェクトのクラスを作ったり、


    さらにほしいメソッド仕様を

    コメントアウトで定義し、

    提案してもらう
    1行やコードブロックごと
    に提案

    View Slide

  11. #javado
    ChatGPT でのクラス⽣成例(1), (2)
    13
    public class Age {


    //年齢をフィールドで管理する。ただし0歳以上120歳以下にして、

    //それ以外は例外を投げる


    }


    public class StudentData {


    // ⽣徒データは学籍番号・⽒・名・年齢・所属研究室のフィールドを持つ
    // フィールドはそれぞれfinalで、値オブジェクトである。


    }
    public class StudentData {


    private final String studentNumber;


    private final String lastName;


    private final String firstName;


    private final int age;


    private final String researchGroup;


    public StudentData(String studentNumber, String lastName,

             String firstName, int age, String researchGroup) {
    this.studentNumber = studentNumber;


    this.lastName = lastName;


    this.firstName = firstName;


    this.age = age;


    this.researchGroup = researchGroup;


    }


    // フィールドに対するgetterメソッドを定義する


    public String getStudentNumber() {


    return studentNumber;


    }


    ....(以下略)
    まとめて提案
    ありがちな

    コンストラクタと
    かメソッドも

    全部提案される
    値オブジェクトに

    なってない...
    public class Age {


    private int age;


    public Age(int age) throws IllegalArgumentException {


    if (age < 0 || age > 120) {


    throw new IllegalArgumentException(

             "Age must be between 0 and 120.");


    }


    this.age = age;


    }


    public int getAge() {


    return age;


    }


    public void setAge(int age) throws IllegalArgumentException {


    if (age < 0 || age > 120) {


    throw new IllegalArgumentException(

            "Age must be between 0 and 120.");


    }


    this.age = age;


    }


    }


    Java17でと提案すると、recordで
    の実装を提案してくれることもある

    (プロンプト次第)

    View Slide

  12. #javado
    Github Copilot 既存コードと組み合わせて作る例(1), (2)
    14
    public class StudentData {


    // ⽣徒データは学籍番号・⽒・名・年齢・所属研究室のフィールドを持つ
    // フィールドはそれぞれfinalで、値オブジェクトである。


    private final StudentId id;


    private final FistName fistName;


    private final LastName lastName;


    private final Age age;


    private final Laboratory laboratory;


    // StudentDataと同じフィールドを持つレコード


    // フィールドの値を使ってレコードを作成するファクトリメソッド
    // フィールドの値を使ってレコードを作成するファクトリメソッド


    public StudentDataRecord toRecord() {


    return new StudentDataRecord(


      id, fistName, lastName, age, laboratory);


    }
    //StudentDataと同じフィールドを持つレコード


    public record StudentDataRecord(StudentId id, FistName


     fistName, LastName lastName, Age age, Laboratory laboratory) {}
    追加すると、

    既存コードの流れを踏まえて生成
     左は、同じクラス内でコードを書き続けている例だが、
     一度、別のクラスをタブで開いてCopilotに読ませる 
     と、開いたクラスの内容を踏まえて提案することも

     できるようになる


     例) // XXXX クラスと同じフィールド


     ⇒ CopilotpプラグインがOnの状態で、

       XXXX クラスをタブで開いた / 開いていないで
       提案結果が異なる!

       (たまに失敗することもある)

    View Slide

  13. #javado
    ChatGPT 既存コードと組み合わせて作る例(1), (2)
    15
    public class StudentData {


    private final String studentNumber;


    private final String lastName;


    private final String firstName;


    private final int age;


    private final String researchGroup;


    ...(略)
    public record StudentRecord(String studentNumber, String lastName,
    String firstName, int age, String researchGroup) {}


    Java17でStudentDataと同じ
    フィールドを持つレコード


    を同じプロンプトの流れで聞く
    同じプロンプトの流れで聞くかどうかで、回答が変わる(ステートレスなイメージ)

    もちろん既存コードごと投げれば、考慮して生成してくれるが、プロンプトが大変かも
    Java17でStudentDataと同じフィール
    ドを持つレコード


    を違う流れや新規のプロンプトで聞く
    public record StudentRecord(String name, int age, String address) {
    // コンストラクタやメソッドを定義することができます


    }


    View Slide

  14. #javado
    おまけ ChatGPTにリファクタリングしてもらう(1)
    16

    View Slide

  15. #javado
    おまけ ChatGPTにリファクタリングしてもらう(2)
    17

    View Slide

  16. #javado
    Github CopilotはIDEに備わっていない、既存コードと連携した高度なコード補完に、
    ChatGPTは要所要所で検討や最適化を伴う作業に...と使い分けるとよさげ?
    Copilotは、直前までにColpilotを使った or 開いたコードの情報の利用を期待して推測できる
    自分の考えやセオリーと、既存コードの内容に併せた賢いコード補完として使うと快適に感じる
    例)以前作ったクラスの情報を元に新しいクラスを作る
      →IDEでタブに開いておくと、提案に組み込んでくれる
     ※Copilotが独自にプロジェクト内を走査するというわけではないので、たまに失敗する
    ChatGPTは、プロンプトで細かく(幅広く)支援行動を選んで実行できる
    作業のチェックポイントとなる要所要所で、検討や最適化に使うと快適に感じる
    例)プログラミングの開始時に細かく条件指定して提案させる
      完成後にコードをリファクタリングさせる、などがより手軽
      →良い意味で自分のセオリーと異なる提案をしてくれる(たまに話を聞いてない)
     ※前に作ったXXクラスを使って...などは、同じ対話スコープの中で
    前提コードをプロンプトに入れないと難しいので、プロンプトコントロールがちょっと大変
    Github CopilotとChatGPTを使って感じた使い分けの⽷⼝
    18
    いずれにせよ、プロンプトやコメントアウトがどれだけ具体的か、はかなり重要....

    View Slide