Gunosy Tech Blog

Gunosy Tech Blogは株式会社Gunosyのエンジニアが知見を共有する技術ブログです。

生成系AIを活用した開発者支援

こんにちは。koidです。

この記事は Gunosy Advent Calendar 2023 の25日目の記事です。 24日目の記事は hyamamotoさんの 大規模データ基盤における冪等性を確保した dbt のオーケストレーション でした。

早いもので、今年の Advent Calendar も最終日となりました。 今年の Advent Calendar では、昨年に引き続き各技術領域についてのエントリを中心としつつも、若干LLM関連のエントリも見られるようになってきたかなと思います。

弊社では今年、業務支援特化・生成AIサービス「ウデキキ」をリリースしましたが、並行して、LLMを含めた生成系AIを活用し、社内の色々な業務を効率化していこうという動きが盛んになっています。*1

そんな中、今回は、生成系AI・LLMを活用した開発者支援について書きたいと思います。

生成系AIを活用した開発者支援

生成系AIを活用しての開発者支援にはどんなものがあるでしょうか。ご多分に漏れずChatGPT先生に聞いてみました*2

生成系AIを利用した開発者支援には、さまざまな方法が存在します。以下に、その具体的な方法をいくつか挙げてみます:

1. 自動コード生成:
  - 開発者が与えた仕様や要件に基づいて、AIがコードを生成する。これにより、簡単なタスクやパターンを自動化し、開発速度を向上させることが可能です。
2. コード補完と提案:
  - 開発者がコードを入力する際に、AIが自動的にコードの補完や次に来るであろうコードの提案を行う。これにより、開発者は迅速にコーディングできます。
3. エラーチェックとデバッグ支援:
  - AIがコードを解析し、潜在的なエラーやバグを検出する。また、エラーメッセージをよりわかりやすく説明することで、開発者が問題を特定しやすくなります。
4. リファクタリングの提案:
  - AIがコードベースを解析し、リファクタリングの提案を行う。コードの可読性やパフォーマンスを向上させ、保守性を高めます。
5. 自動テストケース生成:
  - AIがコードに基づいてテストケースを自動的に生成し、コードのテストカバレッジを向上させます。これにより、品質管理が強化されます。
6. 自動ドキュメンテーション:
  - AIがコードを解析し、適切なコメントやドキュメンテーションを自動的に生成する。開発者はコードの理解を助ける文書を手軽に作成できます。
7. 質問応答サポート:
  - 開発者が技術的な質問を投げかけると、AIが適切な回答や解決策を提供する。これにより、開発者は問題解決に迅速に取り組むことができます。
8. プロトタイピングの自動生成:
  - 開発者がアイデアを述べると、AIがそれを元にプロトタイプを自動的に生成する。アイデアの概念検証や迅速なプロトタイピングが容易になります。

これらの方法は、生成系AIを開発者のワークフローに統合することで、開発プロセスの効率性向上や品質向上を実現します。AIがルーチンなタスクを担当することで、開発者はより創造的で高度な作業に集中できるようになります。

弊社では年初より、GitHub Copilotを導入し、コード生成や補完、質問応答サポートなどに活用してきました。 各々、普段利用しているIDEのExtentionを利用し、開発に役立てています*3

もっと活用したい/便利にしたい

一定 GitHub Copilot も浸透してきたかなというところで、前述の社内業務効率化の取り組みの中で各所ヒアリングしてみると、「Pull Requestのレビューをもっと効率化したい」という声が上がってきました。

ChatGPT先生に、さらに聞いてみました。

レビューをサポートするためには、様々な方法があります。以下に、生成系AIを活用したレビューサポートの方法をいくつか挙げてみます:

1. コードレビューコメントの自動生成:
  - AIがコード変更差分を解析し、コードレビューコメントを自動的に生成する。これにより、コードレビューコメントの一貫性を高め、開発者同士のコミュニケーションを向上させます。
2. コード品質の自動評価:
  - AIがコードの品質メトリクスを解析し、潜在的な問題や改善点を指摘する。これにより、コードの品質を標準に合わせる助けとなります。
3. コードスタイルの確認:
  - AIがコードのスタイルガイドに準拠しているか確認し、スタイルの不一致を指摘する。統一されたコーディングスタイルを保つための助けになります。
4. セキュリティチェック:
  - AIがコードをセキュリティの観点から解析し、潜在的なセキュリティリスクを検出する。セキュリティの脆弱性を早期に発見し、修正するサポートを提供します。
5. テストカバレッジの確認:
  - AIがコードの変更に対するテストカバレッジを自動的に評価し、不足している部分を指摘する。テストの充実度を向上させ、品質を確保します。
6. 文書の自動生成:
  - コード変更に基づいて、AIが自動的に変更された機能やAPIのドキュメンテーションを生成する。新しい機能や変更点の理解を助けます。
7. コード変更の意図解析:
  - AIがコード変更の意図を解析し、変更セットに関する説明文を自動生成する。これにより、他の開発者がコード変更の目的を理解しやすくなります。

これらの方法は、AIを活用してレビュープロセスを強化し、品質向上やチームのコミュニケーションをサポートします。特にルーチンなチェックや解析作業をAIに任せることで、開発者はより高度なタスクに集中できるようになります。

コードスタイルやテストカバレッジ、セキュリティチェックについては、ある程度CIに組み込んでいますが、ディスクリプション等での説明不足*4に際しての意図の把握は骨が折れるものです。

Pull Requestのレビューをサポートしてくれるサービス・ツール

Pull Requestのレビューをサポートしてくれるサービス・ツールにはどんなものがあるでしょうか。

ざっくりですが、有償のサービスとしては以下のようなものがありました。

機能比較の星取表までは作りませんが、どのサービスも広範囲にカバーされています。 課金体系はどのサービスもユーザ数(Developer数)課金です。

また、GitHub Action等で利用可能なOSSについては、以下のようなものがありました。

有償のサービスに比べると、できることが一部限定的になる場合もありますが、OpenAI等のキーを自前で用意する&実行環境を自前で用意できれば、ライトに開始できそうです。

手軽に始めたい・体験したい

いくつかサービス・ツールがある中で、手軽に始めたい・体験したいというモチベーション*6で、Codium-ai/pr-agentを試験運用してみることにしました。

試験運用なので、そこまで他ツールと丁寧な比較・吟味はしていないのですが、トライしてみようと思ったポイントは下記です。

  • GitHub Actionsだけでなく、GitHub Appとしても導入可能
    • 自前でホストする必要はあるものの、各リポジトリにworkflowの設定をすることなく、どのリポジトリでもコメントで呼び出しができる(ので、撤退するのも楽)
    • 自前ホストについて、AWS Lambdaでホストする選択肢もあり、GitHub Actionsのランナーに比べると安価
  • OpenAI / Azure OpenAI (gpt-3.5, gpt-4) 以外のモデルも利用可能
    • Vertex-AIやBedrockなども利用可能
  • promptを追加する余地があり、レスポンスの日本語化がいけそうだった

試してみた

トライしてみようと思ったポイントにある通り、ActionsではなくAppとして、コストを抑えるためにAWS Lambdaでホストしてみました。 (実質従量課金にできるので、利用が進まなければコストはほぼかからない状態で導入できます)

また、現時点ではAWS BedrockのAnthropic Claude v2.1を利用して導入しています。

全部は紹介しきれず、当たり障りのなさそうなところを選んでのキャプチャですが、こんなイメージです

/describe

変更内容からdescriptionを自動生成してもらっています

/ask

コードの説明をしてもらっています*7

/improve

改善案を提案してもらっています(ある日のテックブログのエントリです)

ほかにもreviewそのものや、change logの作成、ドキュメント追加等のコマンドもあります

最後に

モデルの特性か、日本語化している影響か切り分けられていませんが、モデルからのレスポンスが期待しているフォーマットにならず、途中で処理がコケてしまうケースがチラホラあります。 弊社の開発チームで promptfoo を利用した複数モデルを比較できる環境が用意されているので、時間があるときに他のモデルとの比較を試してみたいなと思っています。

いったんまずは試験運用という形で、実際どこまで便利になるか、そしてみんなに使ってもらえるか探りつつ、今後の行く末を決めようかなと思っています。 (あまり使われないようであれば撤退するかもしれませんし、他のサービスも検討して乗り換える可能性もゼロではないかなと思います)

「その後どうなった?」というのは、しばらく運用してみて、また機会があれば書きたいと思います。

*1:もちろん手段ありきではなく、ケースによっては生成系AIを使わずに解決できる/したものもありますが

*2:って書いたら、社内で「ウデキキじゃないんですか?」って煽られました汗

*3:と信じています

*4:書き手によって粒度が違ったりするので

*5:ここでもまたwaitlist...

*6:と、Copilot for Pull Requestがいつまでもwaitlistでしびれを切らしたというのもあり

*7:Copilotでも似たようなことができますね