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

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

ソフトウェア仕様についてChatGPTに相談してみる

 ChatGPTでテスト設計してみた記事と、そのアンサーソングを見つつ、また色んな人が色んなことをやってみた記事をみてChatGPTのすごさがあらためて伝わってきました。両方ともとても面白い記事です。

zenn.dev nihonbuson.hatenadiary.jp

 一方、わたしのは埋め草で、特に難しいことはしていません。
 仕様についてChatGPTに質問してみて、その回答と自分の期待値を比較してみようという実験です。

曖昧な仕様についての質問

 初めに、とてもシンプルな質問をしてみました。
 「曖昧」とは何か、「バス」とは何か、みたいなことはまったく配慮してあげなくていいはずなのですが、なぜか「機械でも読み取れるように」ちょっと気遣っている自分がいます。

以下の仕様に曖昧な点があるか、教えてください。
「バスの料金は、10歳以下が無料です」

 この質問の意図は、「自然言語で書かれたスペックの妥当性検証みたいなことができるのか?」を知ることです。
 また、期待回答は、「11歳以上の料金が定義されていない」でした。

 実際の回答は以下の通りです(太字はわたしによるものです)。

  1. 年齢の計算方法
    10歳以下という年齢には、具体的にどのような計算方法が使われているのかについては明確にされていません。例えば、誕生日当日の年齢を基準にするのか、前後何日間を含めるのか、切り捨てか切り上げかなどが不明確です。
  2. 料金の種類
    「バスの料金」とは、具体的にどのような種類の料金を指しているのかについても明確にされていません。一般的には、大人や学生などの料金区分がある場合がありますが、それらについては触れられていないため、10歳以下の子供にはどのような種類の料金が適用されるのか不明確です。
  3. 無料の範囲
    「10歳以下が無料」という表現からは、子供の年齢が10歳以下であれば完全に無料ということになると解釈できますが、実際にはいくつかの場合で料金が発生する可能性があります。たとえば、大人と同じ座席を使用する場合には、大人と同じ料金が必要になる場合があるため、この点についても明確にされていません。

以上のように、この仕様には曖昧な点がいくつかあります。具体的にどのような状況でどのような料金が適用されるかを確認するためには、より詳細な情報が必要です。

 正直、想像以上でした。
 この3つの回答それぞれが、素晴らしい示唆を与えてくれていると感じます。

回答1. 暗黙の了解をスルーしない

 この単純なスペックにおいてわたしは、無意識のうちに「年齢は、曖昧な要素が少なく一意に決まる情報」のように扱っていました。
 ところがChatGPTはそんな暗黙の前提、コンテキストに乗っかってきません。国や地域、法律や常識、それぞれで違う「年齢」の定義のうち、どれを採用するかというのは、場合によっては大事な条件になるでしょう。

回答2. 一般論を踏まえている

 2行であっさり書かれた仕様の文章の中に閉じてどうこう言うのではなく、「バスの料金といえば」という一般論を踏まえて、具体化の必要性について指摘しています。
 これはある意味「ドメイン知識」と言えるかもしれません。

回答3. 実ビジネスケースを考慮している

 たとえばペットを連れてグリーン車に乗っても、ペットの分の料金はかからないでしょう。一方でペットのケージを置くのに一座席使うのなら、その席の料金は払うことになりますよね。
 回答3は、「子どもであっても料金がかかるケースがあるのではないか?」という点を考慮しているといえ、実際に起こりうるビジネスケースをカバーしています。とても「QAっぽい」と感じました。

 なお、「11歳以上の料金が定義されていない」点をわたしから伝えたところ、ChatGPTの回答は以下の通りでした。

そうですね、確かに「11歳以上の料金」が明示されていない場合、その場合の料金についても不明確です。一般的に、バスの料金には大人料金や学生料金、シニア料金など、年齢に応じた様々な種類があることがあります。そのため、10歳以下が無料である場合には、11歳以上についてはどのような料金が適用されるのかについても明示する必要があります。より詳細な情報が必要になる場合がありますので、バス会社や交通機関に問い合わせることをおすすめします

 最後放置された。

仕様の矛盾についての質問

 次に、以下の質問をしてみました。

ある動物園の入園料金は、以下のルールで決まります。
6歳未満 無料
6歳以上18歳未満 1000円
18歳以上60歳未満 1500円
60歳以上 無料
この場合、15歳の人の入園料金はいくらになるでしょうか。

 以下のように、正しい答えをくれます。

問題にある動物園の入園料金のルールによると、15歳の人の入園料金は「6歳以上18歳未満 1000円」となります。よって、15歳の人の入園料金は1000円となります。

 正直、これだけですごすぎると思いますが。。
 次に、矛盾した仕様を提示します。

その通りです。では、別の仕様として、以下のルールを考えます。
6歳未満 無料
6歳以上18歳以下 1000円
18歳以上60歳未満 1500円
60歳以上 無料
この仕様に、矛盾はあるでしょうか?

 回答は、以下の通りです。
 わたしからすると、2~5行目が仕様で、1・6行目が地の文であると解釈できているだけでもすごいと思いますが、回答も的確です。。

この仕様には、矛盾が含まれています。問題は、18歳の人が入園料金として1000円となってしまうことです。18歳の人は「6歳以上18歳以下」という条件に該当するため、前者の料金が適用されるべきです。しかし、仕様によると、18歳以上の人には「1500円」という料金が設定されているため、矛盾が生じています。この仕様では、料金の設定に関する条件に誤りがあるため、修正が必要となります。

 とはいえ、あまりにあからさまな矛盾かもしれません。仕様の矛盾というのは、もっと入り組んだビジネスルールの中に埋もれがちなので、そういう実験もそのうちやってみたいと思います。

状態遷移モデルの検討

 デブサミでも使った、「状態遷移が曖昧な仕様」から、状態遷移表を作ってもらいました。

サンプル仕様記述

また別の仕様として、あるSNSのユーザが、SNS内のグループに入るための仕様を考えます。
(1)ユーザの初期状態は、「メンバーではない」です。
(2)ユーザが「グループ参加希望」ボタンを押すと、ユーザの状態は「管理者承認待ち」になり、管理者に通知されます。
(3)管理者が通知を承認すると、ユーザの状態は「メンバー」になります。
(4)管理者が通知を却下すると、ユーザの状態は「メンバーではない」になります。

この仕様を、状態遷移表にしてください。

 ChatGPTの回答。

以下が、上記のSNSグループ参加の仕様に基づく状態遷移表です。
この状態遷移表により、ユーザがどのようなアクションをとった場合に、どのような状態遷移を経るかが明確になります。

現在の状態 アクション 次の状態
メンバーではない グループ参加希望ボタンを押す 管理者承認待ち
管理者承認待ち 管理者が承認する メンバー
管理者承認待ち 管理者が却下する メンバーではない
メンバー なし メンバー

 ちょっと期待していたフォーマットではなかったので、追加で

縦軸を「現在の状態」に、横軸を「アクション」にして状態遷移表を書いてください。

とお願い。しつこいですけど、この依頼を理解できるだけで、信じがたい能力だと思うんだよ。。

現在の状態 グループ参加希望ボタンを押す 管理者が承認する 管理者が却下する
メンバーではない 管理者承認待ち - -
管理者承認待ち - メンバー メンバーではない
メンバー - - -

この表を見ると、現在の状態によって、可能なアクションが限定されることが分かります。たとえば、「メンバーではない」状態からは、「グループ参加希望ボタンを押す」アクションが可能で、「管理者が承認する」や「管理者が却下する」アクションは不可能です。逆に、「管理者承認待ち」状態では、「グループ参加希望ボタンを押す」以外のアクションが可能で、「メンバー」状態に移行するか、「メンバーではない」状態に戻るかのいずれかになります。

 今回の質問の仕方では、「定義されていない遷移は、遷移が不可能である」という解釈をされたようです。
 なので、未定義の状態遷移について質問してみました。

「管理者承認待ち」状態で、ユーザが再度「グループ参加希望ボタンを押す」アクションを行った場合、どの状態に遷移するでしょうか?

 答えはこう。

「管理者承認待ち」状態で、ユーザが再度「グループ参加希望ボタンを押す」アクションを行った場合、状態は変化しません。既に「管理者承認待ち」状態にいるため、管理者に通知は再送信されません。ユーザは引き続き、管理者の承認待ちとなります。次に可能なアクションは、管理者の承認または却下になります。

 これは、仕様に基づいて答えているのではなく、ChatGPTの提案と言えると思います。
 「状態は変化しない」はともかく、「管理者に通知は再送信されない」という仕様でいいかどうかは、人間が考えて決めるのもいいでしょう。

 ということで、再度状態遷移表を書いてもらいます。

以下が、管理者承認待ち状態で再度「グループ参加希望ボタンを押す」アクションが行われた場合を含めた状態遷移表です。

現在の状態 アクション 次の状態
メンバーではない グループ参加希望ボタンを押す 管理者承認待ち
管理者承認待ち 管理者に承認される メンバー
管理者承認待ち 管理者に却下される メンバーではない
管理者承認待ち グループ参加希望ボタンを押す 管理者承認待ち (変化なし)
メンバー グループ脱退ボタンを押す メンバーではない

 !?!?

 突然現れたアクション「グループ脱退ボタンを押す」・・・!
 この状態遷移は、「メンバーではない」に戻れない、いわゆる「シナリオが閉じていない」仕様なのですが、なぜ突然そこに気づいた・・・?

 「メンバーでない」を遷移「先」とする遷移がないことから、その遷移を押す「グループ脱退ボタン」を想起したのでしょうか。怖すぎる・・・。
 ともあれこの実験でも、ChatGPTは「仕様に書かれたことに閉じず、提案をしてくれる」ことがわかりました。

所感

 QAエンジニアは日ごろ、自然言語で記述された仕様やモデルと向き合って、「さーて、どんな仕様で、どんなテストをすればいいかな?」って頭をひねっていると思います。
 ChatGPTは現在のところ、仕様の完全性・無矛盾性みたいなものを証明してくれるわけではない*1ですが、「与えた仕様に対し、開発チーム内のバイアスにとらわれない、仕様の文面だけに閉じない意見を出してくれる」ところが、思考のサポートになってよいなあと感じます。新鮮な観点を与えてくれる相棒になりそうです。

 一方裏を返すと、「人間によっては文面に書くまでもない」ところを忖度してくれるわけではないので、そういう部分を人間がサポートするとか、そういう関係になるのかなー。それともそんな役割も残されないかなー。
 いやあ、ぞっとワクワクしますね。

Robot

*1:インプット、つまり質問の仕方が悪いのかもしれないけれど