MEDIA - COLUMN メディア - コラム

AIがプログラミングする時代の到来!?

黒住 好忠顔写真

こんにちは。テクニカルスペシャリストの黒住です。

さまざまな分野で活用されている人工知能(AI)ですが、現在ではプログラミングの世界にもAIが浸透しつつあります。そう遠くない将来、プログラミング作業の多くをAIが行う時代が来るかもしれません。

今回は、現時点(2021年11月時点)で「AIがどの程度プログラミングできるのか」という点について、課題なども踏まえながら紹介していきたいと思います。

現時点のAIによるプログラミング

先に結論をお伝えすると、「現時点ではまだ、AIによる完全なプログラミングは困難」な状況にあります。高品質で正しいプログラムを作成する場合には、必ず人間の介在が必要になります。

しかしながら、AIによるプログラミング技術も大きく発展しており、人間が行うプログラミングをサポートする形で、AI技術が取り入れられています。

今回は、プログラミングへのAI活用として、Microsoft Visual Studio 2022と、GitHub Copilot の2についてお話ししたいと思います。

なお、このページに記載している全ての画像は、実際の動作が分かりやすいように「アニメーション再生」されるようにしています。各画像をクリックすれば、再び「最初から再生」できますので、気になる画像があればクリックして確認してみてくださいね。

Visual Studio 2022

最近リリースされたMicrosoft Visual Studio 2022には、AIによるコード補完機能が実装されています。以前から搭載されているIntelliCodeが機能アップし、AIによるコード補完が、より便利になった感覚です。

実際に動いているところを見た方が分かりやすいと思うので、Visual Studio 2022のAIが「ソースコードを提案してくる様子」をいくつか見てみましょう。

簡単な足し算

まずは、2つの値を合計する Sum メソッドの作成を試してみます。

以下画像のように、Sumという名前のメソッド定義を入力すれば、AIが return a+b; というコードを提案してきます。AIが提案するコードは薄い灰色で表示されるので、提案されたコードでで良ければ、TABキーで確定できます。

この動作を見ていると、どうやら「Sum」というメソッド名から、引数で渡した値を合計する処理だと推測しているようですね。

ファイルの読み込み処理

続いて、もう少し複雑な、指定されたファイルを読み込む処理を試してみます。

定義した関数の中で if と入力すると、nullチェックのコードが提案されます。続けて throw と入力すると引数がnullであることを示す例外をスローするコードが提案されます。

次の行で、ファイル存在チェックを行うために if(!F というコードを入力した段階で、「ファイルの存在チェックと、ファイルが見つからなかった場合の例外処理」が自動で提案されるようになります。

最後に return と入力すれば、ファイルを読み込んで返すコードが提案されるので、ここでも ReadFile というメソッド名を元に、AIがコーディングしたい処理の内容を推測していると思われます。

コメントから処理作成(VS2022では未対応)

コードを入力している段階で、「プログラミングしている人が行いたいであろう処理」をAIが推測して候補を提案してくれるのですが、何でもできるわけではありません。

例えば、コメントで「引数のnullチェック」と記述しても、何の反応もありません。人間であればコメントを読み取って処理を書いてくれるかもしれませんが、Visual Studio 2022では、そこまでの補完は行えないようです。

コメントは、コードに比べると曖昧な部分も多くなりがちなので、実際に使えるレベルのコード提案機能を実現するため、意図的にそのような仕様にしてある可能性も高そうですね。

Visual Studio 2022のAI機能の仕組み

Visual Studio 2022のAI機能は、GitHubのPublicリポジトリで公開されている、約50万プロジェクトのソースコードを元に学習が行われています。AIモデルにはTransformerを採用しており、プログラミング言語はC#に対応しています。

このAIでは、importしているライブラリの情報や、コード近くにあるメソッドや変数のコンテキスト情報なども考慮した上で、コードの推論が行われているようです。

GitHub Copilot(Preview)

続いて、より攻めている感じのある「GitHub Copilot」についてご紹介します。

Visual Studio 2022は「実際の製品として安定して利用できる」点にフォーカスしてあるように思えますが、GitHub Copilotの場合は、実験的な取り組みにも積極的にチャレンジしたソリューションになります。Visual Studio 2022のAI機能はC#が前提でしたが、GitHub Copilotは様々な言語のコードを学習しているので、Python、JavaScript、TypeScript、Ruby、Java、Goなど複数の言語に対応しています。私が試した限りでは、C#、SQL、HTML、CSS、シェルスクリプトやバッチファイルなどでも幅広く利用できました。

現時点で、GitHub Copilotは「Technical Preview」段階であり、さまざまな試みが行われている最中となります。そのため、実際にGitHub Copilotを使うためには、事前に利用申請を行い、申請が承認されてからの利用となりますので、ご注意ください。

それでは、GitHub Copilotの「先進的」な部分を実際に試しながら見ていきましょう。

なお、GitHub Copilotの場合も、AIが提案してくるコードは「薄い灰色」で表示されるので、その内容で良ければTABキーで確定できます。

簡単な足し算

まずは、Visual Studio 2022でも試した足し算をする関数をPythonで試してみます。

さすがに、このレベルであれば問題なくAIでコード生成ができていますね。 sum という関数名と引数を頼りに、実際に行いたい処理の内容を推測できているようです。

この手のツールは英語にしか対応していない場合が多いのですが、私が試した限り、GitHub Copilotは日本語も理解しているようです。最初は英語での提案になりますが、日本語で指示を書いていると自動的に日本語で返してくるようになりました。

フィボナッチ数列

少し難易度を上げて、フィボナッチ数列という、プログラムの再帰処理の例でよく取り上げられる処理を推測できるか試してみます。

関数名を fibonatch として定義すると、まずは「n番目のフィボナッチ数を返す」というコメントが提案されました。コメントの内容は行いたい処理と合致していたのでTABキーで確定させます。そうすると、次はコメントの内容から、実際の処理コードが提案されました。

関数名以外はTABキーしか入力していませんが、きちんと指定した関数名で再帰処理が行われるようなコードが生成されていますね。

英語とローマ字の混合

次は少しイジワルをして、日本人にありがちな「英語とローマ字を混在させた」関数名からコード生成を試してみます。指定した年が閏年かどうかを判断するために、 is_uru_year という、英語とローマ字を混在させた関数名を付けてみます。

結果は見事で、きちんと閏年を判定するコードが生成されています。

コメントから処理作成

関数名から処理内容を推測する機能はVisual Studio 2022でも対応していましたが、ここからは「コメントを元にコードを生成する」機能を試してみたいと思います。

ここでは、メールアドレスが正しいかどうかをチェックする check という関数を作成してみます。関数名からは処理内容を判断できないように、あえて check という曖昧な関数名を付けています。その代わり、コメントで「入力されたmailが正しいメールアドレスかチェックする」という実現したい処理の概要を記述します。

そうすると、正規表現を使ったメールアドレスチェックのコードが自動生成されました。

このように、処理コードだけに限らず、コメントなども含んだあらゆる「言語による記述」を処理できる点が、GitHub Copilotの凄いところです!

微妙なコメントの違いによる対応

続いて、プログラミング言語を変えてJavaScriptです。

こちらも、簡単なコメントだけを頼りに処理コードを自動生成してみたいと思います。しかも、実際の人間ならよく使う「括弧書きによる指示」を付けた状態で試してみました。コメントの書き方も曖昧で、人間であっても「括弧書きの内容でコーディングして欲しいのかな・・・」と思う感じの曖昧さです。

実装したい処理は「すべてのリンクを外部リンクに変更する」という内容で、括弧書きでコーディング時に使って欲しい技術(DOM、jQuery)を記載しています。

結果は以下を見ていただければ分かるのですが、曖昧なコメントの違いもきちんと認識した上でコードが生成されています。指示していないホスト名の判断処理も入っていますが、十分実用的なレベルです。

単純にソースコードのパターンを学習するだけでは、そのコードがDOM操作なのかjQuery操作なのか分からないと思うのですが、この違いもきちんと認識できた点には驚きました。

AIのコード生成でありがちなパターン

最後に、AIによるコード生成でありがちなパターンもご紹介しておきます。

こちらは文字コードのUTF-8をEBCDICに変換する処理を、コメントから自動生成したものです。関数名や処理はそれなりに生成されていますが、問題は、このコードを見ても「自動生成された処理の内容が正しいかどうか、人間がすぐには判断できない」ことです。(普段から文字コード変換を専門的に行っている人で無い限り、何か他の情報源を頼りに確認することになると思います)

AIが生成するコードは完璧ではないため、自動生成されたコードが正しいかどうか、最終的な判断は人間が行う必要があるのですが、その確認には時間がかかる場合もあります。

GitHub Copilotの仕組み

GitHub Copilotは、GitHub上のPublicリポジトリで公開されている、数十億行のソースコードを使って学習してあります。AIモデルは、GPT-3をベースに、コード用にファインチューニングしたOpenAIのCodexが利用されています。

AIを使った処理はサーバ側で行われていますが、クライアント側ではVSCodeやJetBrainsなどの複数環境に対応しています。

なお、VSCodeを利用している場合は Alt+[ , Alt+] キーで複数の候補を切り替えながら確認することも可能です。

AIコード生成を利用する上での注意点

AIによるコード生成は便利なのですが、現時点では注意すべき点もいくつか存在しています。特に、企業の製品開発などで利用しようと思っている場合は、以下の内容をきちんと押さえた上で、実際に利用するかどうか慎重に判断する必要があります。 

ライセンスの問題

GitHub Copilotなどの学習には、GitHub上で公開されているPublicリポジトリのソースコードが利用されています。(非公開になっているPrivateリポジトリのコードは使われていません)

公開済みのPublicリポジトリだから良い・・・と思うかもしれませんが、実際はそんなに簡単な話ではありません。GitHubで公開されているPublicリポジトリのソースは、さまざまなライセンスの下で公開されており、これらのコードをベースにしたAIが生成したコードは、ライセンス的にクリーンな状態なのかが明確ではありません。

GitHub Copilot側では「問題なし」という立ち位置になっていますが、実際の学習は「Publicリポジトリであれば、ライセンスは考慮せずに学習に利用している」という事なので、いずれ大きな問題に発展する懸念があります。

また、実際のコードはAIが学習した内容に基づいて自動生成(単純な元コードのコピー&ペーストではない)されているのですが、人間の指示が曖昧だと、0.1%くらいの確率で「元のソースコードをそのままコピーしてしまうケースが発生」するようです。

この問題はGitHub Copilot側も把握しており、適切な判断が行えるようにオリジントラッカーを構築している最中ということなので、将来は解決されるかもしれません。

セキュリティ上の問題が含まれるケースがある

数多くのオープンソースプロジェクトのコードを学習しているのですが、オープンソースで公開されているソースコードには、セキュリティの問題が含まれているケースが多々あります。

その結果、AIが自動生成したコードにも「セキュリティの問題が、そのまま含まれる」ケースが出てきます。何も考えずに自動生成されたコードを採用してしまうと、意図せず、問題のあるコードが紛れ込んでしまう可能性があります。

特に、プログラミング経験の浅い人が、生成されたコードの意味をよく理解せずに利用している場合は注意が必要です。ツール等によるコードのチェックや、有識者によるコードレビューなども検討した方が良いでしょう。

最新技術やトレンドには対応できない

プログラミングの世界にも、時代とともに書き方のトレンドが存在しており、多くの言語で「今となっては古く、あまり推奨されない書き方」も多く存在しています。

しかし、AIは「どれが古い書き方で、どれが新しい書き方」なのか判断できません。AIは、学習したソースコードをベースに提案を行うため、推奨されない古い書き方のコードを提案してくることもあります。

こちらについても、利用する人間側に知識が無いと、推奨されない古い書き方、場合によってはセキュリティ上推奨されていない関数などを含んだコードが紛れ込む可能性があります。

また、新しい技術やライブラリやAPIが登場したとしても、AIモデルは「新しい情報を知らない」ので、新しい内容での提案は見込めません。

活用のポイント

まだまだ課題も多いAIによるコード生成分野ですが、上手に活用すれば、間違いなく開発効率を向上できると思われます。

以下では、実際に使ってみて感じたポイントについて、いくつか紹介したいと思います。

指示は範囲を絞って適切に

現時点では、AIに全てのプログラムコードを生成させようと思ってはいけません。コードの範囲が広がるほど、正しいコードが生成される可能性は低くなってしまいます。

コードの自動生成を利用する場合は、関数内部の特定の処理部分に限定して、AIへの指示も具体的に記載することがポイントです。範囲が限られていて指示が適切であれば、自動生成されるコードも適切なケースが多くなります。(人間でも曖昧な指示を出されると困ると思いますが、それはAIであっても同じですね)

また、一般的な数学の処理や単位変換、有名なアルゴリズムなどは、関数単位でも問題の無いコードが生成されるケースが多いように感じます。

最終的なコードの責任は人間が負うこと!

AIによるコード生成を利用するかどうかにかかわらず、「コードを作った本人」が、コードに対する責任を持つことは非常に重要です。

Webで調べて見つけたコードを、内容も理解せずにそのまま使う・・・ような人はいないと思いますが、それはAIを利用する場合であっても同様です。AIが生成したコードを、そのまま信用してはいけません。

AIが生成したコードは「経験の浅い新人にコーディングを依頼して、その結果が返ってきた」ものだと思って、内容をしっかりとチェックすることが重要です。

最後に

今回は、最近になって性能が向上してきた「AIによるコーディング」について取り上げてみましたが、いかがでしたでしょうか。

まだ課題も多い分野ではありますが、今後も目が離せません。AIによるコード生成も、比較的簡単に試せる時代なので、もし興味があれば実際に試してみてくださいね。特に、GitHub Copilotには驚かされますよ!

それではまた、次回のコラムでお会いしましょう。


紹介した製品などのリンク(いずれも外部サイト)


当サイトの内容、テキスト、画像等の転載・転記・使用する場合は問い合わせよりご連絡下さい。

エバンジェリストによるコラムやIDグループからのお知らせなどを
メルマガでお届けしています。

メルマガ登録ボタン


黒住 好忠

この執筆者の記事一覧

関連するソリューション

生成AI

関連するナレッジ・コラム

今注目されている小規模言語モデル(SLM)について解説

音楽生成AI - MusicGen

AIを使って画像にキャプションを付けてみよう