ローソンデジタルイノベーション テックブログ

ローソンデジタルイノベーション(LDI)の技術ブログです

生成AIで単体テストシナリオを作成!プロンプトで工夫したことなどご紹介

ローソンデジタルイノベーション(LDI)のiOS/Android開発リーダーの阪口です。

LDIでは、アプリ開発スピードの向上のため、生成AIを活用した作業効率化を実施中です。

今回は施策の一つである、生成AIで単体テストシナリオ作成を実施した例をご紹介させていただきます。

はじめに

単体テストシナリオを作成するには、仕様の確認や影響範囲の把握に時間がかかることが課題となっていました。

また、シナリオの品質が人によって違いがあります。

そのため、生成AIで単体テストシナリオを作成することで、時間短縮と品質担保ができる開発環境作りに挑戦しました!

動作環境

社内データは、 Amazon Bedrock のナレッジベースに格納し、生成AIが参照できるクローズドな環境を用意しました。

生成AIは Claude 3.5 Sonnet を利用しています。

また、Amazon Bedrock で利用できる Claude 3.5 Sonnet への問い合わせを容易にできるように、生成AIへの問い合わせ用の検証用アプリを作成し、RAGから情報取得時のフィルターをアプリで簡単にできるようにしました。

学習データの準備

まず、実務で利用できる単体テストシナリオを作成できるようにするには、生成AIが「アプリの仕様」や「LDIの単体テストシナリオ作成時のルール」など社内データを参照できる環境にする必要があります。

それらの情報をAmazon Bedrockのナレッジベースに追加し、生成AIが情報を参照できるようにしました。

また、過去に作成した単体テストシナリオもサンプルデータとしてナレッジベースにいくつか追加しました。

検証の目標と検証方法

検証の目標

まずは、アウトプットの精度の合格ラインを設定し、その合格ラインに達成することを目標に検証を進めました。

精度の合格ライン

合格ラインは、「単体テストシナリオ作成コストの削減」と「生成AIの出力結果の手直しのコストの追加」のバランスを見て、以下の数値で合格ラインを設定しました。

単体テストシナリオの正解率が10回中6回以上で60%以上​

精度チェックの観点と正解率の算出方法

以下の3つの観点から正解率を算出し、合格ラインを達成できるか確認しました。

精度チェックの観点

観点①:パターン網羅性(不足テストケース数)​

観点②:仕様理解(期待結果が仕様と不一致の数)​

観点③:用語理解(テスト内容は正しいが用語が不一致の数)​

正解率の算出方法

正解率 = (必要テストケース数-観点①-観点②-観点③)/必要テストケース数

検証方法

生成AIへ同一プロンプトを問い合わせしても、回答内容が変わることがあるため、検証では同一プロンプトを複数回問い合わせし、アウトプットの精度を確認しました。

検証の実施

学習データのファイル形式比較

ファイルの形式によって、回答内容の精度に違いが出るか確認しました。

私が確認した際は、以下の順番で精度が良いことが確認できました。

  1. マークダウン
  2. PDF
  3. Excel
  4. Word

アプリの設計書はConfluenceで管理しており、それをマークダウンに変換するには量が多すぎるため、各ページをPDFで出力し、ナレッジベースに追加しました。

ナレッジベースでサポートされているファイル形式はこちらで確認できます。

Amazon Bedrock ナレッジベースデータの前提条件 - Amazon Bedrock

設計書の文言調整

設計書で、生成AIが理解しづらい書き方をしている箇所がいくつかあり、解釈がブレない書き方で明示的に説明する文章に清書し直すことで、回答の精度に大きく影響することがわかりました。

プロンプトの調整

プロンプト1つで精度確認

RAGから情報取得時に、設計書や単体テストシナリオ作成時のルールを参照するようにフィルターし、単体テストシナリオを作成するプロンプトで問い合わせしましたが、存在しない仕様をテスト対象に含め余計なテスト項目を作成するなど、多くのハルシネーションが発生し、精度があまり良くない結果になりました。

そのため、無理にプロンプトを1つにするのではなく、複数のプロンプトに分けて最終的に期待するアウトプットが出力されるように調整する方針に変えました。

プロンプトを複数に分けて精度確認

「仕様の把握」や「LDIのルール確認」「単体テストシナリオの作成」など、複数の作業を1つのプロンプトにまとめるのではなく、作業単位でプロンプトを細かく分けることで精度に影響があるか確認しました。

今回は、こちらの5つのプロンプトに分けて都度生成AIに問い合わせしました。

  1. テスト対象の画面全体の仕様説明依頼
  2. テスト対象の機能の仕様説明依頼
  3. 単体テストシナリオの作成依頼
  4. デシジョンテーブル作成依頼
  5. 作成したデシジョンテーブルを元に、単体テストシナリオの修正依頼

上記の5つのプロンプトで問い合わせた結果、1つのときと比べ、精度が向上することが確認できました。

また、複数回同一プロンプトで問い合わせしても、安定した精度をアウトプットされることが確認できました。

生成AIへの問い合わせを回数を減らし、精度が落ちないか確認

1プロンプト毎に1〜2分程度回答を待つ必要があるため、次は回数を減らして精度が落ちないか確認しました。

結果として、こちらの2つのプロンプトで、精度を落とすことなく回答されることが確認できました。

  1. デシジョンテーブル作成依頼(設計書を参照するようにフィルター)
  2. 作成したデシジョンテーブルを元に、単体テストシナリオを作成

プロンプトを5つから2つに減らすことで、問い合わせ時間が、合計10分弱から3分程度に減らすことができました。

プロンプトで工夫したところ

システムプロンプト

ハルシネーション対策
回答の選択肢に「分からない」を追加

「検索結果に質問に答えられる情報が含まれていない場合は、質問に対する正確な答えが見つからなかったことを明記してください。」をプロンプトに含めることで、無理やり回答内容を考えて発生するハルシネーションを防ぎました。

回答のソース元を指定

RAGから取得した情報のみで回答してほしい場合は、「あなたの仕事は、検索結果の情報のみを使ってユーザーの質問に答えることです。」を、

一般情報も含めた回答がほしい場合は、「検索結果に該当するものがない場合は、一般情報からの回答でかまいません。」のように、どの情報から回答をしてほしいか明確に伝えることで、期待する回答が生成しやすくし、ハルシネーションを防ぎました。

情報の欠落対策

生成AIが回答内容を要約して回答することがあり、内容が省略されるなど、情報が欠落することがあるため、

「要約せずに全ての内容を回答してください。」をプロンプトに含めることで、回答内容から情報が欠落しないようにしました。

推測情報対策

生成AIが、推測情報を正しい情報のように回答することがあるため、ミスリードに繋がる回答が度々見受けられました。

そのため、「文言から推測した説明を含めないでください。」をプロンプトに含めることで、推測情報を含めないようにしました。

回答言語の指定

言語を指定しないと、たまに英語で回答される現象が発生したため、

「全て日本語で回答してください。」をプロンプトに含めることで、必ず日本語で回答されるようにしました。

ユーザープロンプト

ユーザープロンプトは、マークダウンで以下の見出しをつけて記述すると精度が上がりました。

  • 命令
  • 期待する出力
  • 出力形式
  • 解決したい課題
  • 命令の背景情報

例:

# 命令
あなたは優秀なiOS/AndroidのQAエンジニアです。
XXXの単体テストを正確かつ詳細に抜け漏れがなく作成してください。

# 期待する出力
以下の観点で作成されているデシジョンテーブル
- XXX
- XXX

# 出力形式
- XXX
- XXX
- 正常系、準正常系、異常系で分ける

# 解決したい課題
XXXアプリのXXX画面で追加された新機能のXXXの単体テストシナリオ作成

# 命令の背景情報
XXXアプリはiOS/Androidで動作するアプリです。
XXXにXXX機能が追加されました。
そのため、あなたは単体テストシナリオを作成する必要があります。
単体テストシナリオは、LDI社の単体テストシナリオ作成ルールと、新機能追加時のテスト観点を考慮する必要があります。
(他、詳細な情報)

検証結果

以上の検証を繰り返すことで、連続6回で正解率65%以上(平均69%)といった、目標より高い正解率で結果を出すことができました。

まとめと今後の展望

まとめ

生成AIを活用することで、単体テストシナリオの作成が、人が作成する場合2,3時間はかかっていたものが、3分程度で作成できるようになりました。

そのため、今回の検証でかなりの時間短縮が見込めることが確認できました。

また、生成AIの回答精度をあげるためには以下の学びを得ることができました。

  • 学習データのテキストは、生成AIが理解しやすい文章で構成する
  • プロンプトは1つにまとめるより、複数に分けることも検討する
  • ユーザープロンプトは、マークダウンで記述すると生成AIが理解しやすくなる
  • ハルシネーションの防止のため、プロンプトの文言を工夫する

今後の展望

検証後は実際の業務でPoCを実施しました。

そこからフィードバックでいくつか課題が上がっているため、それらの対応を引き続き進めていく予定です。

  • 課題1:自分が知らない仕様のテスト項目も出力されるが、それが正しい情報か確認に時間がかかった

    • 解決済み:社内AIチャットボットで仕様を簡単に確認できるようにしました! techblog.ldi.co.jp
  • 課題2:必要テスト項目が20未満の場合、ハルシネーションが発生しやすい

    • アクション:必要テスト項目が少なくてもハルシネーションが発生しないようにプロンプトを調整する

最後に

今回は、生成AIを利用した単体テストシナリオを作成ツールの導入事例を紹介させていただきました。

LDIに興味が出てきた方、または応援いただける方は是非「読者になる」で応援していただけますと嬉しいです!

よろしくお願いいたします。