はじめに
近年、文書作成や情報整理、プログラム開発など、様々な業務領域で生成AIが導入されています。企業としても、生成AIを導入し、業務を効率化することが重要なテーマとなっています。
しかし、単に生成AIを導入するだけで効率化できるのでしょうか。
生成AIは短時間で多くのものを生み出せます。一方で、作成した内容が本当に正しいかを確認する作業は人間が行う必要があります。むしろ、生成AIへの依存が高まるほど、人間による確認の重要性は増していきます。その結果、確認作業に多くの時間を費やしてしまって効率化できていない、という経験をされた方も多いのではないでしょうか。
本記事では、私たちがソフトウェア開発の現場で生成AIの活用を進める中で気づいた、生成AI活用のために重要なことについて紹介します。
開発スピードの向上と新たに生まれた不安
開発現場への生成AI導入
昨今の生成AIの進歩を受け、私たちも開発スピードの向上を目標として、開発業務に生成AIを取り入れることにしました。
導入にあたり、私たちの過去の開発業務を分析しました。その結果、特にコードの実装と動作確認が多くの時間を占めていることがわかりました。
これまでコードの実装は、生成AIに相談しながら人間が記述する形で進めていました。そこで、開発者が仕様を生成AIに与えてコードを一から生成させることで、開発にかかる時間を削減することにしました。
動作確認は、主に手動テストで行っていました。実装したコードが正しく動作するかを人手でひとつひとつ確認する必要があり、多くの時間を要していました。一部の動作確認は自動テストによって行っていましたが、その作成にはある程度時間がかかっていました。そこで、生成AIに手動テストの内容を自動テストに置き換えさせることで、必要な時間を削減することを考えました。
生成AIの利用にあたっては、意図した成果物を安定して生成できるよう、様々な工夫を行いました。仕様書を生成AIが読みやすいフォーマットに修正したり、プロンプトを整備したりして指示方法を統一することで、誰が利用しても一定の品質でコードやテストを生成できる環境を整えました。さらに、実際に利用する中でも、より品質の高い成果物を生成できるよう、仕様書のフォーマットやプロンプトの改善を継続的に行いました。
生まれた不安
ここまでの試行錯誤によって、採用可能なコードやテストを短い時間で生成できるようになり、開発スピードも確実に向上していきました。そのため、私たちは当初の目的を達成できそうだと感じていました。
その一方で、私たちはひとつの違和感に気づきました。生成AIによって作成されたコードを、同じく生成AIによって作成されたテストで検証し、そのテストが通過していることを根拠に品質を判断しているという点です。そのテストは本当に妥当なのでしょうか。コードは本当に期待通りに動作しているのでしょうか。この構造の問題に気づいたことで、私たちは生成されたコードに対して不安を感じるようになりました。
不安を解消しつつ生成AIを活用するためのアプローチ
不安の分析
なぜこのような不安を感じるのでしょうか。それは、生成AIが作成した自動テストは、動作確認として不十分だからです。
私たちは、テストによって動作確認を行っています。コードレビューの際、主にテストの結果に基づいて機能コードの正しさを判断しています。なぜなら、テストを実行した結果こそが、機能コードの振る舞いを示すものだからです。つまり、試験項目を確認することで、実装が要件を満たしているかを判断できます。
このことから、動作確認には、網羅性(正常系や異常系、境界値のケースなどの様々なケースを試験できること)や妥当性(試験自体に誤りがなく、正しく試験できること)が大切です。
しかしながら、生成AIが作成した自動テストは、網羅性や妥当性を誰にも評価されないまま使用されています。つまり、自動テストの結果が機能コードの振る舞いを正しく示しているとは言えません。そのため、自動テストに基づいて機能コードが想定通りに動くかどうかを確認すると不安に感じます。
不安を解消するために必要なこと
この不安を解消するには、網羅性や妥当性の評価を行うことが有効であると考えられます。
考えられるアプローチのひとつに、コードを作成した生成AIとは異なるモデルを使ってテストケースを確認する方法があります。異なるモデルを用いることで、元のモデルの盲点を見つけられる可能性があります。しかし、この方法は不安の根本的な解消にはつながりません。なぜなら、生成AIの評価自体が、品質の根拠にならないからです。自動テストの網羅性や妥当性は、最終的には人間が確認すべきものであり、生成AIの評価結果はその代わりにはなり得ません。
別のアプローチとして、生成AIが作成した自動テストを人手で評価する方法があります。このアプローチを実際に行ったところ、網羅性や妥当性が十分かどうかを判断し、不安を解消するためには多くの時間を要しました。その要因として、網羅性が十分かどうかを判断するためには、関連する他のファイルをひとつひとつ参照して、テストケースに観点の漏れがないかどうかを確認する必要がありました。妥当性が十分かどうかを判断するためには、テストが正しく動作しているかどうかを追うために機能コードも確認する必要がありました。結果として、開発スピードは以前と同程度になり、生成AIを活用して効率化しようとした意味が薄れてしまうとわかりました。
つまり、生成AIが作成した自動テストを動作確認として使用するためには、テストケースの網羅性と妥当性を生成AIや人手に頼ることなく評価するアプローチが必要になります。
不安を解消するアプローチ ~ミューテーションテスト~
新たなアプローチを模索する中、私たちはミューテーションテストという手法に目をつけました。ミューテーションテストとは、機能コードに条件分岐や定数などのバグを模した小さな変更(ミュータント)を埋め込み、テストがその異常を検知できるかどうかを確認することで、テスト自体の品質を評価する仕組みです。
ミューテーションテストでは、まず最初に、機能コードへミュータントを埋め込みます。次に、変更された機能コードに対して、自動テストを実行します。テストが失敗するようになれば、妥当なテストであると言えます。一方、テストが成功のままであると、テストケースに欠如や誤りがあると言えます。
さらに、ミューテーションテストには、ツールが存在します。これを使用すると、人手に頼ることなく、機能コード全体に対して多数のミュータントを一定のルールに沿って埋め込むことができます。その結果、テストの抜け漏れを機械的に検出できます。
以上のことから、生成AIで作成した自動テストにミューテーションテストを組み合わせることで、テストケースの網羅性と妥当性を生成AIや人手に頼ることなく評価できるようになると考えました。
生成AI×ミューテーションテストの実践と効果
実際に、生成AIが作成した自動テストに対してミューテーションテストを行いました。その結果、埋め込まれた225件のミュータントのうち91件(約40%)が検知できず、生成AIが作成した自動テストには、一定数の誤りや見落としがあることが確認できました。
そこで、自動テストを修正することにしました。各テストケースの修正は次のステップで行いました。
- 未検知ミュータントの情報を整理
- 整理されたミュータントの情報をもとに人間が手動で修正
作業を進める中で、未検知ミュータントの中には、フレームワークの設定箇所などに埋め込まれたものがありました。それらは検知する手段がないため、ミュータントの埋め込みを行わない設定を施しました。
それ以外のミュータントは、テストケース自体やテストケース内の確認項目が不足していたため、修正することで検知できるようにしました。これにより、すべてのミュータントを検知できる状態になったため、自動テストの網羅性・妥当性があるといえるようになりました。
テストケースの修正後、生成AIで作成した自動テストを動作確認に使用し、改めてコードレビューをしました。自動テストが機能コードの振る舞いを漏れなく表すようになったことで、自動テストの内容に基づいて機能コードの正しさを判断できました。その結果、関連する複数のファイルをひとつひとつ参照する必要がなくなり、コードレビューの時間削減につながりました。
このような結果から、生成AIによるコードやテストの自動生成にミューテーションテストを組み合わせることで、テストケースの網羅性と妥当性を確認しながら、効率的に開発を進められるようになるとわかりました。最終的に私たちの開発プロジェクトは、開発日数が計画よりも約18%短縮され、手動テストの件数は過去の開発実績と比較して約70%削減できました。
おわりに ~生成AI活用において本当に重要なこと~
生成AIの活用により、コードの実装や動作確認など多くのプロセスを自動化できるようになりました。私たちの開発においても、開発期間の短縮という効果を感じました。
その一方で、私たちは生成AIの問題にも直面しました。それが、生成AIが作り出した成果物に対する品質保証の難しさです。私たちは、生成されたコードやテストを読むことで品質を保証しようとしました。しかし、それだけでは成果物の正しさを判断することに多くの時間を要することが、実際の開発を通じてわかりました。
この経験から、今後のシステム開発においては、人間のレビューが開発全体の一番の課題になる可能性が高くなったと感じました。生成AIの導入によって、私たちの役割はレビュワーへと変化しました。今後は、生成AIの成果物の量は増加し、それに比例して人間のレビュー負荷も高まっていくと考えられます。つまり、人間のレビューが開発全体のボトルネックになる可能性が高く、それをどう解消するかを考える必要があります。私たちは、ミューテーションテストの導入によってそれを解消しました。
この課題は、システム開発に限らず様々な場面で発生すると考えられます。現在、多くの企業が生成AIの導入を進めていますが、重要なのは単に業務を生成AIに置き換えることではありません。生成AIの成果物の正しさをどのように判断するかという仕組みこそが、業務の品質や効率に直結しています。つまり、今後その仕組みを改善していくことが重要になっていくでしょう。
技業LOG
NTTPCのサービスについても、ぜひご覧ください


