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 Hiroto Yamakawa 4 公立千歳科学技術大学 情報システム工学科 専任講師 R&D: Experimental Development of

    ICT Services, Learning Technology, Computer in Education, Programming & Programmer's Education 千歳市バスロケーションシステムの開発(2016-2022) 適応型学習支援システムの開発、活用 レポート内の話しことば診断システムの開発 大学・小学校・地域でのプログラミング教育の実践(最近は学生とドメイン駆動設計にモブワークで挑戦するのが楽しい)
  2. #javado かなりライトユーザー ChatGPTは課金はしてるけどGPT-3.5(とAPI)で大体事足りてる  →今日は私自身も勉強したり新しい使い方を体験したい 基本的には、IntelliJ IDEAやVSCodeで、Github Copilotでのコード生成支援を利用  →プログラミングにはとても便利。 
   プログラミング以外を色々書くときにはやや邪魔にも感じる...(Copilotじゃない方がよい?) IntelliJでは、ChatGPTでコード確認(リファクタリング、バグ発見)にも利用しはじめた

     →プラグインで使い勝手も結構変わってくる あとはいろいろ気が向いた時にMacGPT経由などで質問してみている  →いわゆる「ChatGPTに聞いてみた」と同じ使い方。 使ってるプラグインやツールでデモりながら、設定したことや、使い分けに感じることを話したい 私の⽣成AIの開発への利⽤のスタンス 6
  3. #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も申請した)
  4. #javado A. プラグインの使い方の紹介 B. 4つの指示で、動作の違いを見てみる 新規のコードを作る例(1) 
  // 生徒データは学籍番号・氏・名・年齢・所属研究室のフィールドを持つ //

    フィールドはそれぞれfinalで、値オブジェクトである。 新規のコードを作る例(2) 
 // 年齢をフィールドで管理する。ただし0歳以上120歳以下にして、それ以外は例外を投げる 既存コードと組み合わせて作る例(1) 
 // フィールドの値を用いてXXXXを作成するファクトリメソッド 既存コードと組み合わせて作る例(2) 
 // XXXXと同じフィールドを持つ Copilot / ChatGPTのDemo 11
  5. #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行やコードブロックごと に提案
  6. #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で の実装を提案してくれることもある 
 (プロンプト次第)
  7. #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 クラスをタブで開いた / 開いていないで    提案結果が異なる! 
    (たまに失敗することもある)
  8. #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) { // コンストラクタやメソッドを定義することができます }
  9. #javado Github CopilotはIDEに備わっていない、既存コードと連携した高度なコード補完に、 ChatGPTは要所要所で検討や最適化を伴う作業に...と使い分けるとよさげ? Copilotは、直前までにColpilotを使った or 開いたコードの情報の利用を期待して推測できる 自分の考えやセオリーと、既存コードの内容に併せた賢いコード補完として使うと快適に感じる 例)以前作ったクラスの情報を元に新しいクラスを作る   →IDEでタブに開いておくと、提案に組み込んでくれる

     ※Copilotが独自にプロジェクト内を走査するというわけではないので、たまに失敗する ChatGPTは、プロンプトで細かく(幅広く)支援行動を選んで実行できる 作業のチェックポイントとなる要所要所で、検討や最適化に使うと快適に感じる 例)プログラミングの開始時に細かく条件指定して提案させる   完成後にコードをリファクタリングさせる、などがより手軽   →良い意味で自分のセオリーと異なる提案をしてくれる(たまに話を聞いてない)  ※前に作ったXXクラスを使って...などは、同じ対話スコープの中で 前提コードをプロンプトに入れないと難しいので、プロンプトコントロールがちょっと大変 Github CopilotとChatGPTを使って感じた使い分けの⽷⼝ 18 いずれにせよ、プロンプトやコメントアウトがどれだけ具体的か、はかなり重要....