本記事は電通国際情報サービス Advent Calendar 2021の18日目のポストです。
(本記事の太字部分は、GitHub Copilotで補完された箇所です。その仕組みや感想などは記事の後半で説明します。)
こんにちは。ISID Xイノベーション本部の半田です。普段は社内向けの構成管理サービスの運用をやっています。 今年の6月末、GitHubは「関数名とコメントから、関数のソースコードを補完する」機能、GitHub Copilotのテクニカルプレビューを開始しました。
このCopilot、私もここ2ヶ月くらい使用しているのですが、最近ソースコードだけではなく日本語も補完してくれることに気づきました。
そこで今日は、このGitHub Copilotにブログの記事を書いてみてもらおうと思います。 Copilotで使われている技術などの内容はありませんが、気休め程度にお付き合いください。
※なお、以下のパラグラフではGitHub Copilotによる補完をそのまま掲載します。以下の文章には事実関係の誤りや、日本語の揺れがあることをご容赦ください。
GitHub Copilotに日本語を書いてもらった
その1
まずはGitHub Copilotに、GitHub Copilot自身の説明をしてもらいましょう。あくまで補完のためのツールなので、テーマや書き出しの文は私から与える必要があります。
はじめまして。今日は、GitHub Copilotに日本語を書いてもらったのです。GitHub Copilotは、GitHubの補完機能を日本語で使えるようにしたものです。
みなさんは、GitHub Copilotを使っているのですか?私は、GitHubの補完機能を使っているのですが、その補完機能は日本語を使えるようになったのです。
ところで、GitHub Copilotは、GitHubの補完機能を使っているのですが、その補完機能は日本語を使えるようになったのです。
ということで、GitHub Copilotに日本語を書いてもらったのです。 ありがとうございます。
GitHub Copilotによる補完部分は、以下の太字の部分でした。
はじめまして。 今日は 、GitHub Copilotに日本語を書いてもらったのです。 G itHub Copilotは、GitHubの補完機能を日本語で使えるようにしたものです。
みなさん は、GitHub Copilotを使っているのですか? 私は 、GitHubの補完機能を使っているのですが、その補完機能は日本語を使えるようになったのです。
ところで 、GitHub Copilotは、GitHubの補完機能を使っているのですが、その補完機能は日本語を使えるようになったのです。
という ことで、GitHub Copilotに日本語を書いてもらったのです。 あ りがとうございます。
私が与えた文章はとても少ないですが、なんだかそれっぽい日本語が生成されてきました。ただ、内容はとても薄いですし、なんだか日本語の補完ツールだという説明になっていますね。この記事の前段から学習したことを、ほとんどそのまま言っているようです。
一方で、文章のつながりはとても自然で驚きました。接続詞は私が与えていますが、例えば「ところで」に続くセンテンスとして「○○ですが、」という言葉がきていますね。ほかにも、「という(ことで)」に続くセンテンスとして要点を簡潔に表現しているのです。
ちなみに補完はこのように表示されます。
その2
さすがに接続詞だけだと、文章の中身としてはほとんど空っぽですね。
次はもう少し意図を持って文章を与えてみましょう。普段書いているプログラミング言語を紹介したいと思います。
こんにちは。 みなさんは、普段どのようなプログラミング言語を使っていますか?
私は、PythonとTypeScriptを使っています。主にWebアプリケーションを作っています。 ほかにも、JavaScriptやPHPなども使っています。
普段の仕事を便利にするための自動化もしています。 例えば、GitHubの監査ログを収集して、Google BigQueryに保存しています。 この収集では、RxJSを使っています。RxJSは、JavaScriptのPromiseをラップして、非同期処理を楽にするためのライブラリです。
ほかにも、社内システムから出力される工数の実績データをGoogle Sheetsに保存して、Google Data Studioで統計を表示しています。 メンバーがどのような業務をしているのかを知りたいときなどに使います。
このような簡単な処理を自動化するのに、Pythonは非常に便利です。
こちらも答え合わせです。
こんにちは。 みなさんは、普段どのようなプログラミング言語を使っていますか?
私はPythonとTypeScriptを使っています。 主にWebアプリケーションを作っています。 ほかにも、JavaScriptやPHPなども使っています。
普段の仕事を便利にするための自動化もしています。 例えば、GitHubの監査ログを収集して、Google BigQueryに保存しています。 この収集では、RxJSを使っています。 RxJSは、JavaScriptのPromiseをラップして、非同期処理を楽にするためのライブラリです。
ほかにも、社内システムから出力される工数の実績データをGoogle Sheetsに保存して、Google Data Studioで統計を表示しています。 メンバーがどのような業務をしているのかを知りたいときなどに使います。
このような簡単な処理を自動化するのに、Pythonは非常に便利です。
いかがでしょうか。私はPHPをあまり書きませんし、RxJSを「Promiseをラップして、非同期処理を楽にするためのライブラリ」と説明するのは多少危険な気がします。それでもずいぶん正確に文章を構成できていますね。
例えば「自動化もしています」という部分では、まるで前半の文章に情報を並立していることを理解しているかのように「も」という助詞を使用していますね。
GitHub Copilotに日本語を書いてもらって感じたこと
GitHub Copilotの「クセ」
最初は「へえ、日本語も補完するんだ」という驚きをモチベーションに記事を書き始めましたが、ここまで書いてみてGitHub Copilotにはいくつかの癖があるように感じました。少しまとめます。
ファイル内の文章も学習する
ソースコードもファイル内のコンテンツを学習しているそうですが、日本語も同じように学習しているようですね。文章の前半より後半の方が、補完の精度は高くなっていきます。 試しに新しいファイルを開いて同じ文章を入力してみましたが、得られる結果は異なるものでした。 文章内にあるキーワードや自分やチームが持っている書き方の「クセ」を、ちゃんと学習してくれているようです。
一文を短く終わらせる傾向にある
どの文章も、表示される補完は一文が短く終わっているなと感じました。主語と述語を簡潔に結んでいるような印象です。 「傾向にある」と書いたのは、まれにとてつもなく長い補完を表示したり、同じ文章が何度もループして表示されたりする事があったためです。 私は一文を長く書いてしまう傾向にあるので、この補完を見て「そろそろ文章を終わらせなきゃ」と焦ることもしばしばありました。
与えられた接続詞に対して、適切な助詞を補ったセンテンスを補完している…?
これは驚きましたね。接続詞にどのような文章を続けるかというのは、時に人間であっても難しいことがあります。 もちろん完全に正しいセンテンスが表示されるわけではないのですが、どうやって意味の通る文章を生成しているのかはとても興味深いですね。AIってすごいです。
どう付き合っていくか?
今回は日本語の補完を題材にしましたが、ソースコードの補完であっても、今回の補完に感じた違和感や誤りと同じようなものがあると思われます。
言わずもがなではありますが、GitHub Copilotによる補完は意味的に正しいものを確実に補完してくれるわけではないことを理解する必要があります。 日本語であればパッと見てその意味があっているかどうかを確認できることも多いですが、例えばソースコードで条件分岐の式を書くときなど、正しく補完されているかを意識して確認した方が良さそうです。
また、補完は基本的に過去のコードを学習して、それらしきものを表示してくれるものです。同じようなコードを書くような状況と、まったく新しいコードを書くような状況では、精度も異なるはずです。
これらのことから、基本的には「stackoverflowやQiitaなどのソースコードをコピー&ペースト」する時と同じように扱うと良いのかなと考えています。 そのコードは正常にコンパイルできるのか、ランタイムエラーはでないのか、要件は満たせているのかなどを丁寧に確認できるようであれば、GitHub Copilotの補完は強力な相棒になってくれるでしょう。
日本語の補完に使うときは、文末を補完してもらうのが良いかなと思います。 文頭からの補完でセンテンスの意味的な整合性を確保するのは難しいですが、文末を少し補完してもらえるだけでも結構便利です。文末につける言葉のバリエーションに悩んだときも、アイデアをもらえてありがたいですよ。
あるときは驚くような高い精度の補完を、またあるときはクスッと笑えるような補完を提示してくれるGitHub Copilotですが、引き続きMicrosoft Officeの「イルカ」のようにかわいがってみようかなと思いました。
あとがき
記事を書いている途中、GitHub Copilotからは 「そうですね、日本語も補完するのは面倒だ」という苦痛を感じました。 という補完を出してくれました。タイミングが良すぎて笑っちゃいました。 公式ドキュメントでは、日本語を学習しているとは明記されていません。もし万が一にもGitHub Copilotで日本語を書きたい時は、どうぞ自己責任でお願いします。
執筆:@handa.kenta、レビュー:@sato.taichi (Shodoで執筆されました)