こんにちは。やまゆです。
昨今、 ChatGPT を筆頭に、 LLM を用いた生成 AI と呼ばれるものが大流行していますね。私はこの分野は疎くて、「超大規模なモデルを構築して、そこから自動補完みたいなものを行う」ものなのかなと思っている程度です。
インフィニットループでは、もちろんこの生成 AI にも注目しています。その中でもやはりプログラマーとして気になるのは、 GitHub Copilot などのコーディング支援を行ってくれるツールです。
JetBrains や Google などもコーディング支援のためのモデル構築を行っているみたいですが、今回はとっつきやすい GitHub Copilot を一部プロジェクトにて試験的に運用してみています。
リスク調査
最初は「推論に使われるソースコードの流出危険性」などのリスク調査から行いました。現状のエンジニアにとってはソースコード自体が成果物なので、この秘匿情報が流出する(特にサーバサイドコード)のはビジネスに非常に大きなリスクとなります。
GitHub Copilot for Business プランで適用される内容が表記されている GitHub Copilot Trust Center で、「対象ソースコードはクラウドサーバーに送信こそすれど、回答の生成後学習に回さずすぐに破棄する」と書かれています。
また、モデルの学習元であるパブリックソースコードが意図せずサジェストに含まれ、そちら側のライセンスに違反する可能性もありますが、(ざっくり)これに関わる問題が発生した場合は Microsoft 側が補償してくれることも記載されています。また、管理側の設定で「パブリックソースコードと類似したコードが発見された場合、サジェストを許可するかどうか」を決めることも出来ます。
マイクロソフト、お客様向けの Copilot Copyright Commitment を発表
GitHub Copilot for Individuals プランではこれらが適用されないため、企業のプライベートソースコードに対して利用することは推奨されませんが、 for Business であれば問題なさそうです。
ユニットテストへの試験適用
その後、関係者と合意を取り、実際に一部メンバーが GitHub Copilot をプロジェクトコードに適用し始めました。
リスク調査とある程度並行しての適用だったため、念のため「ユニットテストへの適用のみ」からスタートしました。
GitHub Copilot は現状「リポジトリの一部コードのみ適用する」機能がありません(言語ごとの ON/OFF はあります)。そのため、最初はコード入力中に自動的にサジェストを表示する機能を OFF にした状態にしました(開いているユニットテスト以外のコードで自動的にサジェストを行わないようにするため)。
これが中々の障害となり、導入後1か月程度はほぼ活躍の機会がありませんでした。
- 自動サジェストがないため、機能の存在自体を忘れる(Alt + \ でサジェストを実行します)
- ユニットテストを書く時間は全体の業務時間の限定されたもののため、サジェストを試す機会が少ない
- 現状のユニットテストはパラメータの微調整などが多く、サジェストを待つよりコピペした方が早い場合がある
- GitHub Copilot はリポジトリの全コードを自動的に読んでくれるわけではなく、「現在エディタのタブに開いているコード全て」を入力として受け付ける。
UserTest.php
を書きたい場合はUser.php
をタブに開いておかないと精度の高いサジェストを受けられないという制限がある- つまり、その時点で
User.php
というユニットテスト以外のコードも送信する必要があるので、ユニットテストへの適用、という点がクリア出来ない
- つまり、その時点で
これでは検証のしようがない、ということで、ユニットテストだけでなく Infrastructure as Code(CDKTF) の実装コードも対象とすることになりました。
Infrastructure as Code(CDKTF) や OSS プロダクトへの適用
主に筆者が中心となって、 IaC コードや趣味で書いている OSS プロダクトへ適用範囲を広げました。
実装コードも OK ということで、自動サジェスト機能を ON にしました。これでかなり環境が変わった気分がしました。
現代のプログラミングでは、元々エディタやその拡張機能で Language Server Protocol(LSP) を利用したメソッド、プロパティなどのサジェストなどが行われます。エディタによるサジェストは、実装を見て実在するもののみをサジェストするため非常に正確ですが、 GitHub Copilot は正確性が欠ける代わりに先見性のあるサジェストをしてくれます。
new Kuber
とだけ書いた時、例えば vscode のサジェストは以下のようになります。
コード例は TypeScript なので、既に import 済みのクラスがサジェストの上の方に来るようになっていますね。もちろんどれも存在するクラス名なので正確です。
これが GitHub Copilot だと、以下のようになります。
この斜体で表示されている部分が GitHub Copilot によるサジェストです。クラス名だけでなく、引数までサジェストしてくれています。
これは、同一ファイルに書かれているコードから推論し、「ここではこう書きたいんじゃないかな?」というものを出力してくれています(全てが正しいわけではありませんが、確かにこう書きたいと思う場合もあります)。
もしこの推論が正しいと思うのであれば、ここで Tab を押すだけで入力が実行されます。もし中身に調整が必要であれば、もちろん入力後すぐに修正が可能ですし、このサジェストが適用出来ない場合は無視すれば良いだけです。
GitHub Copilot の面白いところは、この行の推論だけでなく、終わったあとの続きの行まで一気に出してくれる所にあります。
コメントも何も書いていないのに、ここでは第三引数のオブジェクトの中身を推論してくれました。これはちょっと下の行に書かれている実装にそっくりです。ここまではエディタのサジェストではやってくれません。
例えば chartVersion
が想定と違ったりすることもあるかと思いますが、それ以外のボイラープレート的コードを Tab 一個で入力してくれるのはとても魅力的に思います。
また、ライブラリの作成時は利便性のためにたくさんのプロパティや getter/setter を書いたりと、似たようなコードを羅列することもあります。そういった場合、最初の1パターンだけ自分で書いてしまえば、残りのほとんどのパターンを GitHub Copilot の生成に頼ることが出来ます。実際 OSS コードでそういった部分を GitHub Copilot に任せてみましたが、非常に高速化出来ている印象です。
GitHub Copilot Chat について
それだけでなく、現在パブリックベータ中の GitHub Copilot Chat も強い味方です。これは ChatGPT のように、エディタ上で GitHub Copilot に話しかけることで、コンテキスト(今開いているファイルや、範囲選択している部分など)に基づいて返答をしてくれる機能です。
例えば、自分で書いておらずよくわからない関数があったとします。その際に Ctrl + I
で Chat 欄を開き、「関数 computeAllUsers について説明してください。」と入力すると、日本語でその関数の実装について説明を受けることが出来ます。 phpDoc 等のドキュメント生成を自動的に行ってくれる場合もあります。実装の詳細を知っている人とペアプログラミングをしているような感覚になるので、もし不明なコードがあったとしてもなんとかなる場合が増えるのではないかと考えています。
プロジェクトコード全体への適用
IaC への導入でかなりの成果が出ることが判明したので、プロジェクトコード全体へも適用可能と判断されました。そこで、一部メンバーではなく、全メンバーが自動サジェストを利用出来るようにし、コーディングを始めました。
最初は拡張のインストールがうまくいかない、サジェストが逆に邪魔に思うなどの点もありましたが、1カ月ほど経った現状では、それぞれのメンバーが GitHub Copilot(及び GitHub Copilot Chat) をうまく活用し、自身のコーディングに活かせているように見えます。
特に経験の浅い言語のサジェストや Chat による説明が効果を出しているようです。現状の価格であれば、一人あたり月 2 時間ほど効率化出来ればペイするので、そのレベル以上の成果が出ているのではないでしょうか。
まとめ
GitHub Copilot はまだ出てから日も浅く、様々な機能の追加が告知されています(PR の description の自動生成や、リポジトリ全体をモデルに組み込むなど)。今後の発展が楽しみですね。
弊プロジェクトだけでなく、他プロジェクトでも既に採用事例があり、 IL 社内では「使えるプロジェクトからどんどん利用していく」という流れが出来つつあります。弊社は「コーディングの効率化が生産性に直結する」開発スタイルなので、このような生産性向上のための仕組みはどんどん取り入れていく所存です。
そんな最先端技術も貪欲にかじりついていく IL にご興味がある方は、是非 採用情報 をご覧ください!