Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

#javado かなりライトユーザー ChatGPTは課金はしてるけどGPT-3.5(とAPI)で大体事足りてる  →今日は私自身も勉強したり新しい使い方を体験したい 基本的には、IntelliJ IDEAやVSCodeで、Github Copilotでのコード生成支援を利用  →プログラミングにはとても便利。 
   プログラミング以外を色々書くときにはやや邪魔にも感じる...(Copilotじゃない方がよい?) IntelliJでは、ChatGPTでコード確認(リファクタリング、バグ発見)にも利用しはじめた  →プラグインで使い勝手も結構変わってくる あとはいろいろ気が向いた時にMacGPT経由などで質問してみている  →いわゆる「ChatGPTに聞いてみた」と同じ使い方。 使ってるプラグインやツールでデモりながら、設定したことや、使い分けに感じることを話したい 私の⽣成AIの開発への利⽤のスタンス 6

Slide 5

Slide 5 text

#javado 開発やプログラミングの中ではすごく賢い推測変換として利用できるイメージ  →No Ideaの状態から生み出す・一般的なコードを書いてもらうより、   今のコードの続き・今のコードを元にした提案をしてもらえて嬉しい Education版は教員も学生も無償なので、学生さんも用量・用法を守って積極的に使ってほしい  →どういう使い方が良いか?を例示できるようになりたい(と思って試している) Github Copilot 7 設定としては 
 公開コードとのマッチングする提案はブロックして使ってる improvementsもOFF 
 (エデュケーション使わせてもらっている身でとても心苦しいけど) 画像引用:https://github.com/settings/copilot

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

#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も申請した)

Slide 8

Slide 8 text

#javado とても簡単...だが、公式プラグインはないので、どのプラグインにするか?は迷う... 個人的にはIntelliJ IDEAで、CodeGPTというプラグインを採用した 対話型ウィンドウだけではなく、コードを指定してプロンプトをAPIに投げやすい プロンプトのカスタマイズ・追加もできる 
 (https://plugins.jetbrains.com/plugin/21056-codegpt) 使ってるモデルはGPT-3.5だけど、自分の使い方では機能的に十分と思う VSCode向けは正直、良い感じのプラグインがわからない...(開発に使ってないので) きっと次の たかぎとねこ さんが開発したプラグインが良い感じなのでは IntelliJ IDEA(VSCode)への導⼊⽅法 10 ※学生にもわかりやすく「回答は日本語で」をつけたりできる...が、翻訳待ちで軽快さが損なわれる気もする...

Slide 9

Slide 9 text

#javado A. プラグインの使い方の紹介 B. 4つの指示で、動作の違いを見てみる 新規のコードを作る例(1) 
  // 生徒データは学籍番号・氏・名・年齢・所属研究室のフィールドを持つ // フィールドはそれぞれfinalで、値オブジェクトである。 新規のコードを作る例(2) 
 // 年齢をフィールドで管理する。ただし0歳以上120歳以下にして、それ以外は例外を投げる 既存コードと組み合わせて作る例(1) 
 // フィールドの値を用いてXXXXを作成するファクトリメソッド 既存コードと組み合わせて作る例(2) 
 // XXXXと同じフィールドを持つ Copilot / ChatGPTのDemo 11

Slide 10

Slide 10 text

#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行やコードブロックごと に提案

Slide 11

Slide 11 text

#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で の実装を提案してくれることもある 
 (プロンプト次第)

Slide 12

Slide 12 text

#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 クラスをタブで開いた / 開いていないで    提案結果が異なる! 
    (たまに失敗することもある)

Slide 13

Slide 13 text

#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) { // コンストラクタやメソッドを定義することができます }

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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