ナカザンドットネット

それって私の感想ですよね

GitHub Copilotをたぶん最低限の挙動で使うための設定

時間が流れるのは早いもので、GitHub Copilotが2022年6月21日に正式リリースされてから、2ヶ月が経ちました。会社でCopilot利用料が経費で落ちるようになったので、引き続き使っていきます。

github.com

当初は「コメントを書くとコードを自動生成してくれる」ツールとして有名になったと記憶していますが、2ヶ月使ってみた感想としては、ほとんどその使い方はしていません。コメントを参考情報の一つとして読んでくれていそうな挙動をするときはありますが、コード生成を目的としてコメントを書いたことは全くありませんでした。

私個人の感想としては、 ちょっと強めのIntelliSense という感じです。今書いている近くにあるコードや、プロジェクト内のコードを参考にして、次に書きそうなコードをサジェストしてくれるツールとして重宝しています。

例えば、5分前に書いたコードと、変数名やそこから生えているプロパティの名前は違っているものの、処理の大筋としては似ているコードを書いている場合などに、今いるスコープの中で使える変数や、そこから生えていそうなプロパティ(おそらく型情報を読んでいそう?)に合わせて、先に書いたコードの大筋に沿ったコードを生成してくれたりします。

人によって体験が違う気がする

私は比較的スムーズにCopilotに慣れることができたのですが、Twitterでタイムラインを見渡すと、そうでもない意見がそれなりに見られました。

  • 書いているコードとほとんど関係ない頓珍漢なサジェストばかりが出てくる
  • どこかのリポジトリからコピペしたようなコードがサジェストされる

特に後者の挙動は「著作権的にどうなの?」と物議を醸しているようですね。

さて、Copilotをそれなりに使っている私が、なぜこの話題を他人事のように話しているかというと、特にそういった挙動に出会っていないためです。微妙に惜しいサジェストを出されて無視する(Escキーを押す)ことはあるので、前者に近い体験は全くしていないわけでもないのですが、「いったいどこを見て、そんなコードをサジェストしたんだ」と思うことは全くと言っていいほど無いのです。

もしかして、見えている世界が違うのでは?と考えてみたところ、Copilotの利用開始時に適当に設定した項目のことを思い出しました。

GitHubからのコピペを弾かれる設定

GitHubの設定画面を漁ると、Copilotの設定画面があります。

私の場合は、次のように設定してあります。

nkznのcopilot設定

設定項目は、次の二つです。

  • Suggestions matching public code
    • Allow
    • Block ✅
  • Allow GitHub to use my code snippets for product improvements
    • ON
    • OFF ✅

Allow〜のほうは、よくある「製品の改善のために情報を共有する」の類ですね。手元のコードが送信されてしまうので、流石にこれはオフにしました。

本記事で焦点を当てたいのは、 "Suggestions matching public code" のほうです。これは、CopilotさんがサジェストしようとしたコードがたまたまGitHub上の公開コードと一致した場合に、そのままサジェストとして出す(Allow)か、除外して別の候補を出す(Block)かを切り替える設定だと私は認識しています。

ヘルプページにも記載があります。

What can I do to reduce GitHub Copilot’s suggestion of code that matches public code?

We built a filter to help detect and suppress the rare instances where a GitHub Copilot suggestion contains code that matches public code on GitHub. You have the choice to turn that filter on or off during setup. With the filter on, GitHub Copilot checks code suggestions with its surrounding code for matches or near matches (ignoring whitespace) against public code on GitHub of about 150 characters. If there is a match, the suggestion will not be shown to you. We plan on continuing to evolve this approach and welcome feedback and comment.

かいつまんで読むと、「CopilotがサジェストしようとしたコードがGitHubで公開されているコードと一致(※空白文字は無視)した場合に、そのサジェストを実際に行うかどうか」の設定のようです。

これをオフにしておけば、GitHub上のコードと完全一致したコードがサジェストから弾かれ、何かしらCopilotのアレンジが入ったコードがサジェストされることになります。前述した「頓珍漢なサジェスト」が出てくるのは、GitHub上のコードをそのまま出してしまった場合が多いのかなと思いますので、この設定をするだけでも、ある程度は快適になるのではないでしょうか。

実際、私の手元では、プロジェクト内にあるコードをアレンジしたと思われるサジェストが出てくることが多いです。あまり大量のコードを生成してくれることはありませんが、次の1行に書こうと思っていたコードをそれなりの精度でサジェストしてくれるので、重宝しています。

まとめ

GitHub Copilotの設定について紹介しました。

ぶっちゃけると、 Allow にして使ったことがあるわけではないので、もしかしたら他の要因で妙なサジェストが出づらくなっている可能性もあり、本当にこの設定が支配的なのかはわかっていません。クラス名や変数名、関数名等の命名を適切に行なっておくと、サジェストの精度が高くなる気がするので、命名に気を遣っている人にはいいことがあるかもしれません。しらんけど。

裏取りが全くできていない、個人の感想みたいな記事になってしまいましたが、とりあえず Block にしてない人は Block にして使用感を見てみてくださいという記事でした。

※ 記事公開後、 Allow のままでも快適、というご意見もやはり見かけたので、そこまで支配的ではない可能性がある……

宣伝

株式会社モニクルでは、はたらく世代・子育て世代がお金の不安を手放せる手助けをするための金融サービス業をより広めるために、ソフトウェアエンジニアを募集しています。

90秒だけお時間をいただいて、↓の動画を見ていただけると、どんなサービスをやっている会社なのかざっくりわかってもらえると思います。

www.youtube.com

マネイロにお金の相談をしにきてくださるだけでも嬉しいですし、もしこの記事を読んで会社自体にも興味を持っていただけたら、↓のCulture Deck(会社説明資料)を読んでみてください。

speakerdeck.com

さらに興味を持ってもらえた方はMeetyで私と雑談しましょう!

meety.net

よろしくお願いします!