なんとかして AI で楽をするぞ

こんにちは。

最近は猫も杓子も AI、AI といった調子ですね。

われわれプログラマとしては便利になるのはいいのですが、このままいけば早晩ノージョブになってしまうのではないかとひやひやする日々ではあります。

しかしやはり便利なものは便利なわけでして、こうなれば日々の業務に積極的に活用して人間としての意地を見せてやるぞ、と張り切るわけであります。

弊社では開発者は自由に GitHub Copilot を利用できるようになっています。実際に普段コードを書いていてその優秀さに驚くばかりです。ただ、コードを書くだけが業務ではないので、もっといろいろできないか?もっと楽させてくれないか?と思うこともあります。

今回は AI さん(主に GitHub Copilot さん)のお手並みを拝見していくぞ!そして楽をするぞ!というかんじでやっていきたいと思います。

コードレビュー

日々の業務で結構めんどくさいのがコードレビューです。

他人のコードを見たときに「????」となるところは多々あると思いますが、実際に指摘するかどうか、指摘するとしてどのように伝えるか、悩ましいところであります。

人間相手のコードレビューだと相手の感情への配慮なども必要になってきますが、AI にレビューを任せしまえばそんな配慮も不要です。

レビューが即座に実行される点も大きな利点であるといえます。レビュー待ちの状態で数日経過してしまうといったようなことはおきません。

また、なんど同じ失敗をしても AI は怒りません。怖い先輩のように「これ前も指摘したよね!」とか言ってこないのです。これは心理的安全性の面でもプラスにはたらくのではないでしょうか。

もちろん、ドメイン特有の知識が必要になるような指摘まで AI がになうことができるとは現時点では思っていません。そこを担保するためには人間の目が必要なるでしょう。しかしそれ以外の部分、コーディングの作法や基礎的な文法の誤り、リーダビリティの担保や保守性を向上させるための記法についてはかなりの部分が AI コードレビューに任せられそうです。

現時点で代表的といえる AI レビューサービスには以下のようなものがあります。

  1. PR-Agent
  2. Copilot Pull Request

順に見ていきましょう。

PR-Agent

公式リポジトリはここです。

Codium が公開している OSS で、プルリクエストに対する広範な AI 支援を提供してくれます。

現在対応しているプラットフォームは GitHub、Gitlab、Bitbucket、Azure DevOps で、機能提供の対応状況はまちまちですが、GitHub で利用する場合はすべての機能を利用できるようになっています。

利用に際して必要なものは OpenAI の APi key と、GitHub 等へのアクセストークンになります。

ローカル実行も可能ですが、もっとも便利な使い方は GitHub Actions 等で PR の オープンなどをトリガーとした自動実行でしょう。

.github/workflows/pr_agant.yml の env に下記のように設定するとPRのオープンをきっかけにして要約、レビュー、改善点の提案を行ってくれます。

env:
  OPENAI_KEY: ${{ secrets.OPENAI_KEY }} # Make sure to add your OpenAI key to your repo secrets
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Make sure to add your GitHub token to your repo secrets
  github_action_config.auto_review: "true" # enable\disable auto review
  github_action_config.auto_describe: "true" # enable\disable auto describe
  github_action_config.auto_improve: "true" # enable\disable auto improve

要約の内容は以下のようなものになります。

自動レビューはこんな感じ。

改善提案はこんな感じです。

また、/generate_labels で自動でラベル付けもしてくれるようです。便利ですね!

Copilot Pull Request

GitHub Copilot も同様の機能を提供しています。

ただし現状では GitHub Copilot Enterprise ベータでの限定提供のようです。

主な機能はPRに対する要約の作成、テストの自動作成、レビューの作成でしょう。

要約の作成は、PR作成時の概要欄に下記のようにコマンドを直接入力することで実行されます。

## 概要
copilot:summary

## 変更の内容
copilot:walkthrough

## ポエム
copilot:poem

プルリクエストのテンプレートに上記のように設定しておけば、人間が記述する必要はなくなります。

テストの自動生成については TestPilot で行うことができます。

現在オープンソースで開発進められており、LLM API のエンドポイントを指定してやれば実行可能です。

性能ですが、arXiv でプレプリントが公開されています。

An Empirical Evaluation of Using Large Language Models for Automated Unit Test Generation

OpenAI の gpt3.5 turbo LLM を使用し、25のnpmパッケージに含まれる1684のAPIに対して単体テストを自動で生成してみたところ、平均で 70.2 % のカバレッジを達成することができたそうです。

下記のように対象とするパッケージによって結果がまちまちなようでまだ発展途上であるという印象は受けますが、このまま改善がすすめばカバレッジのために人間が頑張ってひとつひとつ実行パスをつぶしていくというような作業は必要なくなるのかもしれません。

自動レビュー作成についてはPRのコメント欄に /prbot review などとコメントするとレビューコメントを返信してくれる、という動作になるようです。こちらはまだあまり具体的な情報が見つかりませんでした。

テストコード作成

人生でもっともめんどくさいことの一つは適切なテストコードの作成であるといえると思います。

Copilot を利用することについて、簡単にテストコードを作成することができます。

対象のコードを選択して /tests を実行すれば下記のようにテストコードを作成してくれます。

これのなにがうれしいかというと、TDDとの相性が非常にいい、ということです。

TDDでは red => green => refactor の流れで実装を進めていきます。

この流れを GitHub Copilot の助けを借りながら進めると以下のようになります。

  1. まず Copilot chat などを利用しつつ最小限のコードを作成します。
  2. /tests などを利用してテストコードのひな形を作成します。
  3. 仕様に応じてテストコードを追加します。
  4. テストを実行し、red になることを確認します。
  5. テストコードを充足するようなコードを生成させます。
  6. 必要に応じて修正します。
  7. green の状態をキープしつつリファクタリングを進めます。

このように非常に簡単かつ効率的に TDD を実践することができます。

実のところ TDD でめんどくさいところは一番最初に最小限の実装、最小限のテストを書くところだったりします。AI の助けをかりることでその「めんどくさい」を軽やかに飛び越えることができるのです。おすすめです。

コミットメッセージ作成

人生でもっともめんどくさいことの一つは適切なコミットメッセージを考えることであるといえるでしょう。

ちょっと油断すると「fix」とか「a」とかが無限に並び、後から見たときに何が何やら分からなくなるのですが、AIさんにお願いすれば差分からいい感じのコミットメッセージを作成してくれるのではないでしょうか。

GitHub Blog – Generate commit messages

上記 GitHub の公式ブログの記事でも紹介されているように、VSCode のソース管理ペインでコミットメッセージ入力欄の右のキラキラボタンを押すと、コミットメッセージを作成してくれます。

実際に使ってみた感想ですが、差分が単純であれば下記のように端的なコミットメッセージを作成してくれます。

差分のファイルが多すぎたり雑多の変更が混ざっていたりすると以下のように意味の通らないメッセージが生成されます。

これはコミットメッセージ作成にとどまらない効果をもたらすのではないかと思います。

  1. コミットメッセージを GitHub Copilot に作成させたい
  2. 変更差分が雑多だと変な文章が作成されてしまう
  3. 意味のあるコミット単位でコミットするように心掛けるようになる
  4. コミット履歴がきれいに!!!!!(デデーン)

怠惰を求めて勤勉に行き着くのが人間の常ですが、コミットメッセージを自分で考えたくないという気持ちがきれいなコミット履歴につながるのです。もう人間がコミットメッセージを考えるのを禁止するべきなのではないでしょうか。

コメント作成

人生でもっともめんどくさいことの一つは適切なコメントの作成であるといえると思います。

Generate documentation for your code

Copilot の /doc コマンドを使用することでメソッドコメントを自動生成することができます。

コメントが英語になってしまう場合は以下のように丁寧にお願いすれば日本語で出力してくれます。

丁寧にお願いするのがイヤな人は、in jap などと付けても日本語で出力してくれます。

コメントは、ないよりはあったほうがいい(所説ある)のですが、どうにもめんどくさくてつい書くことをサボってしまいがちです。そんな時にこそ AI さんの力を借りましょう。

また、これは前述のコミットメッセージと同様の効果なのですが、メソッドがあまりにも長かったり、ひとつのメソッドの中で複雑すぎる処理をしていると適切なコメントを生成してくれません。

コメントを考えるのがめんどくさいという気持ちがメソッドを適切な長さと粒度、責務に分割する動機になります。いいことしかありません。

まとめ

T.S.エリオットが言うように、我々は探求をやめるべきではありません。そしてわれわれのすべての探求は、最後には最初にいた場所にもどり、初めてその場所を知ることにあります。

すくなくとも今はまだ、AI にできることとできないことがあります。

人間とAIはある意味新しい共進化のパートナーであり、世界の形を劇的に作り変えている最中であるといえるでしょう。AI が人間に提示する新しい世界のなかで、われわれは初めて本当の自分を知ることになるのかも知れません。

もう日々のチャットコミュニケーションとか業務連絡への対応とかもやっといてくれないか?

あ、そうですか。