はじめに

Generative AIとは、既存のコンテンツから学習した内容をもとに新しいコンテンツを作成する人工知能の一種です。

たとえば、与えられたテキストを解析して学習データをもとにして適切な返信をさせたり、指定された内容を満たす画像を生成させたりすることができます。
Generative AIは日本では「生成系AI」や「生成AI」と訳されることが多いです。

Generative AIに関するサービスやモデルは次々とリリースされており、2023年6月現在も熱は高まり続けている状況です。
たとえば、代表的な画像生成系のサービスであればStability AIによるStable DiffusionやOpenAIによるDALL·E 2Midjourneyなどがあります。
テキスト生成系のサービスであれば、ChatGPTBardClaudeなどがあります。

私が所属する開発基盤センターは足元の開発プロセスを改善する施策を打ち出し、全社の開発生産性を高める役割を担っています。
そういった開発生産性を高める施策にGenerative AIを活用しない手はありません。

本記事では「ソフトウェアエンジニアリングでGenerative AIを活用する」という観点で調査した結果と、今後の活用の可能性について記載します。

「AI駆動開発」について

Generative AIが話題になるにつれ「AI駆動開発」といった言葉も聞こえてくるようになりました。
この言葉から受ける印象は「AIが中心にあり、AIによって開発がリードされるような開発プロセス」で、次のようなものを想像します。

  • 要件定義の支援:ステークホルダーとの会話をAIが整理し、現行の業務フローや現行システムのドキュメントなども解析し、要件を抽出する
  • 設計とプロトタイピング:AIがビジネス要件を自動的にソフトウェアの仕様や設計に変換し、プロトタイピングを行う
  • コーディング支援:コード生成やリファクタリングの提案、潜在的なバグの発見と修正案の提出などを行う
  • テストの自動化:設計書やコードからテストケースを生成し、自動テストを実施する
  • データ解析とインサイト生成:開発データ(コード、バグレポート、フィードバックなど)を解析し、開発プロセスを改善するための洞察を提供

それを踏まえて「AI駆動開発」を実現できる製品やサービスがあるか調査しました。
例えば「コード生成」といった要素を単独で見るなら、後述するGitHub CopilotAmazon CodeWhispererで実現できていますが、それ以外の要素も含めて包含的にサポートする製品やサービスは2023年6月現在では見当たりませんでした。

また、「AI駆動開発」という言葉を含んだ技術ブログや技術イベントはありましたが、いずれもAIを中心に据えるアプローチではなく、場面ごとでAIに支援を受けるアプローチを紹介していました。

AIを中心に据えて駆動するという意味では自然言語でAIと対話するだけでアプリケーションを作成できるGoogleのDuet AI for AppSheetやMicrosoftのCopilot in Power Appsへ思い至ります。
ただし、これらはノーコードツールの進化版だと理解しており、「ソフトウェアエンジニアリングでGenerative AIを活用する」ものとは異なる印象を持ちました。

これらのことから「ソフトウェアエンジニアリングでGenerative AIを活用する」という観点だとAIを中心に据えるアプローチ、「AI駆動開発」と呼べるものは時期尚早なのだろうと結論付けました。

Generative AIを活用している現行サービスの比較

AIを中心に据えるアプローチではなく、AIに支援させるアプローチであればすでにいくつもサービスがあります。
ここではそういったサービスについて代表的なものを挙げて、機能や価格の比較を行います。

チャット形式によるコードの生成

ChatGPT Bard
提供元 OpenAI Google
価格 無料(GPT-3.5モデルが使える)。ChatGPT Plusプラン(GPT-4モデルが使える)は月額20ドル 無料
特徴 複数の会話を保存しておくことが可能。ChatGPT Plusプランならプラグインを利用可能 試験運用中。会話の保存はできない

どちらも試してみましたが、コードを提案させる場合はBardよりもChatGPTの方が優れていると感じました。
また、ChatGPTでもGPT-3.5モデルよりGPT-4モデルの方がより良いコードを生成する印象を受けました。

一例ですが、以下のような素朴なプロンプトで生成されたコードを比較してみました。

Javaで日付のリストから今日よりも過去の日付のみに絞り込んだリストを返すメソッドのコードを書いてください。

生成されたコードは次の通りです。

 

ChatGPT(GPT-3.5)が生成したコード

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public class DateFilter {

    public static List<LocalDate> filterPastDates(List<LocalDate> dates) {
        List<LocalDate> filteredDates = new ArrayList<>();
        LocalDate today = LocalDate.now();

        for (LocalDate date : dates) {
            if (date.isBefore(today)) {
                filteredDates.add(date);
            }
        }

        return filteredDates;
    }
}

ChatGPT(GPT-4)が生成したコード

import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;

public class DateFilter {

    public static List<LocalDate> filterPastDates(List<LocalDate> dates) {
        LocalDate today = LocalDate.now();
        return dates.stream()
                .filter(date -> date.isBefore(today))
                .collect(Collectors.toList());
    }
}
Bardが生成したコード
public static List<Date> getPastDates(List<Date> dates) {
  List<Date> pastDates = new ArrayList<>();
  for (Date date : dates) {
    if (date.before(new Date())) {
      pastDates.add(date);
    }
  }
  return pastDates;
}

これら生成されたコードの特徴を次の表にまとめました。

ChatGPT(GPT-3.5) ChatGPT(GPT-4) Bard
日付のAPI java.time.LocalDate java.time.LocalDate java.util.Date
コレクションの処理方法 forループ Stream API forループ

日付のAPIはjava.time.LocalDateの方がjava.util.Dateよりも新しいもので、昔からあるライブラリならともかく新規でコードを書く場合はjava.time.LocalDateを使う方が良いです。
コレクションの処理方法はforループとStream APIのどちらが良いか一概には言えませんが、チェック例外のハンドリングを必要とせず副作用の無い操作であればStream APIを使用する方が良いでしょう。

これらのことから、ChatGPT(GPT-4)が生成したコードが最も良いと感じました。

コーディング支援

GitHub Copilot Amazon CodeWhisperer
提供元 GitHub AWS
価格 1人あたり月額19ドル
(GitHub Copilot for Businessプラン)
1人あたり月額19ドル
(Professionalプラン)
対応エディタ・IDE JetBrainsのIDE
Vim/Neovim
Visual Studio
Visual Studio Code
JetBrainsのIDE
Visual Studio Code
AWS Cloud9
AWS Lambda コンソール
JupyterLab
Amazon SageMaker Studio
対応言語 Python、JavaScript、TypeScript、Ruby、Go、C#、C++など Python、Java、JavaScript、TypeScript、C#、Go、Rust、PHP、Ruby、Kotlin、C、C++、シェルスクリプト、SQL、Scalaなど

※価格はいずれも企業向けのプランで比較をしています

GitHub Copilotの方がAmazon CodeWhispererよりも対応言語が少ないように見えますが、GitHub上の公開リポジトリを含む数十億行のコードを学習データとして使用しているので、実際にはより多くの言語のコードを生成できます。

実際にJavaを使用している開発プロジェクトでGitHub Copilotを利用していますが、問題なくJavaコードを生成してくれています。

Amazon CodeWhispererはオープンソースリポジトリやAmazon内部のリポジトリ、APIドキュメント、フォーラムから抽出したソースコードを学習データとして使用しています
そのため、AWSをフル活用しているようなプロジェクトだと、とても力を発揮してくれそうです。

また、Amazon CodeWhispererにはセキュリティスキャン機能があり、PythonとJava、JavaScriptコードをスキャンしてOWASPトップ10に含まれる脆弱性やセキュリティのベストプラクティスを満たさない脆弱性などを検出できます。
NablarchやSpringといったフレームワークを使用して開発している場合、多くの脆弱性はフレームワークによって対策されますが、そこにAmazon CodeWhispererによるセキュリティスキャンを加えることでより安心感を持って開発を進められるかもしれません。

API

OpenAI API Azure OpenAI Service
利用できるモデル GPT-4
GPT-3.5
DALL·E
Whisper
Embeddings
Moderation
GPT-3
GPT-4
GPT-3
DALL·E
Codex
Embeddings
価格 価格はほぼ同等 価格はほぼ同等
セキュリティ かならずインターネットを介してAPIへアクセスする Private Linkを利用することでインターネットを介さずAPIへアクセスできる

利用できるモデルはOpenAI APIの方が多く、新しいモデルをいち早く試したい場合はOpenAI APIを利用することになりそうです。

セキュリティ面では代表的なものとしてネットワーク経路について挙げましたが、こちらはAzure OpenAI Serviceが優れている点です。
本番稼働するシステムに組み込む場合はAzure OpenAI Serviceを利用することになるでしょう。

ソフトウェアエンジニアリングでの活用の可能性

2021年のガートナー ハイプ・サイクルに「AI拡張型ソフトウェアエンジニアリング(AI-Augmented Software Engineering)」というキーワードが登場しています。2021年の時点では「『過度な期待』のピーク期」にプロットされていましたが、昨今のGenerativeAIの盛り上がりを受け、ソフトウェアエンジニアリングを生業としている各社が様々な取り組みを行い、これから「幻滅期」へ向かっていくことだと思います。

弊社でもGenerativeAIの活用を進めて行くべく、社内の有識者も交えてアイデア出しを行いましたのでご紹介します。

挙げられたアイデアを「開発プロセスにおける工程」と「AIサポートの観点」の2軸からなる表へプロットしました。
縦軸が「開発プロセスにおける工程」、横軸が「AIサポートの観点」です。

AIに任せて完全自動化するもの AIと人間が対話をしながら進めるもの
提案
  • 既存の提案書を学習させて新しい提案書のドラフトを自動作成
  • アイデアの壁打ち相手
設計
  • 設計の矛盾チェック
  • 機能のパターン毎に仕様統括が設計したものを元に別機能を自動設計
実装
  • SQLと実行計画を元に性能改善案を提案
  • 実装のチェックリストを元に既存コードをリファクタリング
  • 依存ライブラリのバージョンアップに伴う必要な修正を実施
  • はじめて使うライブラリやPaaSの利用を対話しながらサポートする
  • 対話をしながらアプリケーションの初期構築を行う
  • コード修正に伴う設計書の変更を自動で反映
テスト
  • テストパターン表からテストコードを自動生成
  • 失敗した自動テストをもとに自動修正
  • 設計書とテストの観点をインプットにしてテストケースを自動生成
環境構築
  • インフラ構成図をもとにIaCコードを自動生成
  • インフラ設計・運用設計の自動化(モデルケースを定めて、それと類似のインフラ構成・運用の場合)
運用
  • 監視項目の提案
その他
  • 社内QAサイトのデータをもとにした技術的なアドバイス
  • レビュー指摘を自動分類し品質評価を実施

これらの中から何点かアイデアをピックアップし、補足も交えて説明します。

提案 × AIに任せて完全自動化するもの「既存の提案書を学習させて新しい提案書のドラフトを自動作成」
テーマを与えてドラフトを作成させるといったことは今でもChatGPTを用いて行っているケースはあると思いますが、既存の提案書を学習させることでよりコンテキストに沿った魅力的なドラフトになると考えています。

実装 × AIと人間が対話をしながら進めるもの「アプリケーションの初期構築」
今まではアーキテクトやリードプログラマーが行ってきたことですが、ある程度はAIに肩代わりさせられると考えています。
ただし、現時点では初期構築は出来ても非機能要件に関する作り込みを行わせるのは不可能で、今から数年かけて発展していくのではないかという意見が出ました。

実装 × AIに任せて完全自動化するもの「SQLと実行計画を元に性能改善案を提案」「実装のチェックリストを元に既存コードをリファクタリング」
これらはリファクタリングに活用する案です。
Googleではレビューコメントからコードの改善案を提案させるという試みが行われているようなので、リファクタリングでGenerative AIを活用することに関してはフィジビリティが高いと感じました。

テスト × AIと人間が対話をしながら進めるもの「設計書とテストの観点をインプットにしてテストケースを自動生成」
網羅的にテストケースを挙げることは労力がかかるところなので、ここを自動化できるとかなり効率化が図れると考えましたが、Generative AIはパターンを網羅することが苦手なため、ゼロからテストケースを生成させるのは向いていないのではといった意見が出ました。
テストは品質にも大きく関わるところなので、今はまだGenerative AIに任せられる範囲は少ないのかもしれません。

とはいえGPT-4の推論能力を活用した侵入テストツールが開発されていたりするため、テストで活用する可能性も引き続き探っていきたいと考えています。

その他 × AIに任せて完全自動化するもの「社内QAサイトのデータをもとにした技術的なアドバイス」
弊社が持っているグループ社員向けの技術支援・QAサイト「canal」のデータをインプットとして、技術的なアドバイスをさせる、といった案です。
現時点でも「canal」はとても有効活用されていますが、Generative AIを活用することで更に「canal」の価値が高まりそうです。

今後、これらのアイデアをさらに煮詰めて実現させるべく、継続して議論を行う予定です。

まとめ

「ソフトウェアエンジニアリングでGenerative AIを活用する」という観点で調査を行い、「AI駆動開発」と呼ぶにふさわしいAIを中心に据えたアプローチは時期尚早で、少なくとも今はコンテキストに応じてAIに支援させるアプローチで活用するものだと理解しました。

Generative AIに関するサービスはいくつも登場しており、それらと我々のアイデアを掛け合わせて今よりも一歩進んだソフトウェアエンジニアリングを実現するべく、これからもGenerative AIの活用を検討して行きます。

今後の取り組みも継続的にFintanで公開する予定ですので楽しみにお待ちください。次回はGitHub Copilotの利用レポートを公開予定です。