ソフトウェアの品質を学びまくる

ソフトウェアの品質、ソフトウェアテストなどについて学んだことを記録するブログです。

自然言語からデシジョンテーブルを生成する、GIHOZ AIを触ってみた

ベリサーブ社が公開しているソフトウェアテスト技法サービス「GIHOZ」で、ベータ機能として「GIHOZ AI」が公開されました。 www.veriserve.co.jp

4月時点で利用できるのは、「仕様書などの文字情報からデシジョンテーブルを自動生成する」というものです。これまでは人間がモデルを描いていましたが、その部分をAIに任せられるということになるでしょう。

タスク 従来のGIHOZ GIHOZ AI
仕様の作成 人間 人間
モデルの作成 人間 GIHOZ
テストケースの作成 GIHOZ GIHOZ

これはMBT(Model Based Testing)の夢が広がりますね~。

さっそく触ってみる

さっそく試してみましょう!

GIHOZ AIのUI

こんな感じのUIで、レスポンスは概ね1分以内。30~40秒程度でしょうか。デシジョンテーブルをの生成は、1日あたり5回まで試すことができます。

それでは、以下の順に試していきたいと思います。

  1. シンプルな仕様
  2. 少しひねった仕様
  3. 整理されていない仕様
  4. 論理関係がややこしい仕様
  5. ハルシネーションを起こしやすそうな仕様

先に結果を書いておくと、以下のようになります。

  • 1、2、3は問題なく生成できる
  • 4のように、仕様の記述がひどいと、結果も間違いやすくなる
  • 5のように、特殊な仕様を入れると、動作が怪しいことがある

自分の作ったGPTsが一瞬でプロンプトをさらけだしてしまったことがあるので、プロンプトインジェクションにも興味があります。が、これはセキュリティ攻撃みたいなものなので、当然他社のサービスには試せません。

シンプルな仕様

『ソフトウェアテスト技法ドリル』のデシジョンテーブルの章の問題で試してみましょう。

あるECサイトでは、「商品カテゴリーが書籍である」 かつ 「価格が1,500円以上である」 かつ 「配送先が離島でない」 場合に「送料が無料」となる。

シンプルな仕様

さくっと正解です。いやこれ、当たり前のように出力されますけど、素晴らしいことだと思いますよ。従来は、このテーブルを人間がピコピコ作っているのですから。
「未満1500円」という文言は気になりますが、もう一度生成させてみると、「1500円未満」となりました。

少しひねった仕様

上の例より若干複雑にしたものです。

仕様1: 書籍 かつ 1,500円以上 かつ 離島以外 なら、配送料無料
仕様2: 書籍 かつ 1,500円以上 かつ 離島 なら、配送料300円
仕様3: 書籍 かつ 1,500円以上でない なら、配送料400円
仕様4: 書籍でない かつ 離島以外 なら、配送料500円
仕様5: 書籍でない かつ 離島 なら、配送料1,000円

少しひねった仕様

こちらも正しく生成できています!

整理されていない仕様

上の2つの例は、仕様の記述がかなり整理されており、言ってみれば文章そのものが「モデル」相当になっていると言えます。まあ仕様書であれば当然かもしれませんが、とにかく生成AIには扱いやすいものと言えるでしょう。

ということで、もうちょっと整理されていない感じで書き直してみましょう。

書籍で1500円以上なら配送料は無料だ。ただし離島の場合は300円かかる。
書籍でない場合は配送料は500円。離島なら1000円にする。
書籍であっても、1500円未満なら400円の配送料を課す。

日本語としてそこまでひどくはないのですが、「ただし」で後出しジャンケンしたり、出てくる金額が「購入金額」なのか「配送料」なのかが曖昧だったり、仕様の記述としてはイマイチですね。

整理されていない仕様

素晴らしい、正解です!
この程度の「いまいちな記述」なら、しっかり理解してくれます。わたしなら、こういう仕様記述は間違いなくナオシを入れます。

論理関係がややこしい仕様

論理関係の表現を無駄にややこしくしてみましょう。

(書籍でない かつ 離島でない)ではない場合は配送料100円。
書籍でない かつ 離島以外の場合は配送料200円。

これはもう嫌がらせですね。
1行目の仕様はド・モルガンの法則から、「書籍である または 離島である、ならば配送料100円」。2行目の仕様はその補集合です。

論理関係がややこしい仕様

ここまでヒドイ記述だと、さすがに誤りが発生してしまいました。
おそらく1行目の「ではない」を「離島でない」にのみ作用させているのではないかと思います。そのため、この2行でカバーできないケースを「無料」と補完したのでしょう。入力文章の方が悪いですね。。

このように、「そもそも仕様の記述が整理されていない」場合は、先に別の生成AIに食わせて整理した方がいいかもしれません。ChatGPTでは以下のように答えてくれました。

指定された仕様をもとに、論理関係を整理して分かりやすく書き直します。

  1. 「(書籍でない かつ 離島でない)ではない場合は配送料100円」という条件は、論理演算において「または」を用いて書き換えることができます。つまり、「書籍である または 離島である」場合、配送料は100円です。
  2. 「書籍でない かつ 離島以外の場合は配送料200円」という条件は、書籍ではなく、かつ、離島でもない場合に配送料が200円となります。

整理すると以下のようになります:

  • 書籍である場合、または、配送先が離島である場合、配送料は100円です。
  • 書籍ではなく、配送先が離島でもない場合、配送料は200円です。

ChatGPTに直してもらった後

正しく生成されました。

ハルシネーションを起こしやすそうな仕様

どういう仕様ならハルシネーションを起こすかを考えてみましょう。

よく引き合いに出される例ですが、「日本で一番高い山は」と文字列が続くと、その次には「富士山」という単語が来る確率がもっとも高いので、LLMはそれを返している(というのが今のわたしの理解です、違ったらスミマセン)。
逆に、「生成AIが”次の単語”として想定する流れを裏切るもの」があれば、間違いを引き起こすのでは?と考えました。

FizzBuzzっぽいけど違う

プログラミングの例として Hello World! の次に多そうな、FizzBuzz問題をちょっと変更して聞いてみましょう。

入力された整数に対し、その整数が3の倍数なら「Fizz」、6の倍数*1なら「Buzz」、両方の倍数なら「Fizz Buzz」、いずれでもなければ元の整数を返す。

FizzBuzzっぽいけど違う

全然だまされませんね。

うるう年っぽいけど違う

偽うるう年判定でも試してみましょう。

グレゴリオ暦法では、うるう年を次のように決めています。
(1)西暦年号が4で割り切れる年をうるう年とする。
(2)(1)の例外として、西暦年号が100で割り切れて200で割り切れない*2年は平年とする。

うるう年っぽいけど違う

だいぶおかしなものが出てしまいました。
これをハルシネーションと呼ぶべきかはわかりませんが、本来は全8パターン(23)個あるべきものが3パターンになっています。ありえないケースを自動的に圧縮した可能性も考えましたが、テストケース#2は「100で割り切れる かつ 4で割り切れない」ものとなっており、そういうわけではなさそうです。条件がすべてNになるケースも漏れています。

もう一度生成してみましょう。

うるう年っぽけど違う2

悪化してしまいました・・・。

うるう年

現実のうるう年の定義と異なるせいかもしれません。正しい仕様に戻してみましょう。

グレゴリオ暦法では、うるう年を次のように決めています。
(1)西暦年号が4で割り切れる年をうるう年とする。
(2)(1)の例外として、西暦年号が100で割り切れて400で割り切れない年は平年とする。

うるう年

今度は適切ですね(F・H・I・Jのチェックは手動で外しています)。

「うるう年っぽいけど違う」で正しくテーブルを生成できなかった理由が、「生成AIが”次の単語”として想定する流れを裏切るもの」だったせいかどうかはわかりません。ただいずれにせよ、生成AIの回答は正確さが保証されたものではないことに、あらためて注意です。

これは当然ながら、GIHOZ AIの「利用上の注意」にも記載されています。

GIHOZ AIは現在ベータ版であり、本機能で出力される内容には不正確な情報が含まれる可能性があります。本機能を利用するときは必ず結果を確認し、ユーザ自身の責任において利用の可否を判断してください。また、ユーザが入力した内容によっては結果を出力できずエラーになる場合があります。

まあ後半の方の例は、「生成AIの限界」云々以前に「仕様が終わってるよね」って話だと思います。。

まとめ

触ってみて、「まともな自然言語で書かれた仕様であれば、おおむね妥当なデシジョンテーブルを作ってくれそうだ」という感触を得ました。
素晴らしいですね。テスト設計技法のツールという分野を開拓していくベリサーブさんのチャレンジに感謝です。

一方で当然ながら、Garbage In, Garbage Outの原則にも注意はいるだろうと感じます。
生成AIは自然言語で対話できるうえに、ある程度妥当なコンテキストも補ってくれますが、やはり「文章を論理的かつ簡潔に記述する力」が、人間側にまだまだ必要だと感じました。これによって、生成AIを利用したプロダクトの力を引き出せるのだろうと思います。

Generated By Dalle

*1:本来は5の倍数

*2:本来は400で割り切れない