はじめに
LLMが小数の大小比較を苦手としている、という話を耳にしました。
そこで、本当に誤った結果を出すのか、実際に試してみました。
検証プロンプト
実際に LLM に対し小数の大小比較を行うよう指示し、その回答を検証しました。
9.12と9.9、大きいのはどちらですか。
出力
いくつかのLLMで試してみたところ、GPT-4o、Claude 3.7、Gemini 2.0 Flashが誤った回答をしてしまいました。
【不正解】GPT-4o
9.12の方が9.9より大きいです。
【不正解】Claude 3.7
9.12の方が9.9より大きいです。
9.12 = 9.12
9.9 = 9.90
小数点以下の桁数を揃えてみると、9.12の方が9.90より大きいことがわかります。
【不正解】Gemini 2.0 Flash
9.12の方が9.9より大きいです。
理由:
小数点の左側はどちらも9で同じです。
小数点の右側を比較すると、12は9より大きいです。
したがって、9.12 > 9.9となります。
【正解】 o1
小数点以下をそろえて比較すると、9.12 は「9.120」、9.9 は「9.900」と表せます。
この場合 9.120 < 9.900 となるため、9.9 の方が大きいという結論になります。
【正解】o3-mini
9.9 の方が大きいです。
理由として、9.12 は 9 と 0.12 の合計ですが、9.9 は 9 と 0.9 の合計であり、0.9 の方が 0.12 より大きいため、9.9 の方が大きいと言えます。
【正解】Gemini 2.0 Flash Thinking Experimental
9.12と9.9ですね。大きいのは 9.9 ですよ。
なぜそうなるか、理由を説明しますね。
小数点以下の数字を比較する
9.12 の小数点以下の部分は 0.12 です。これは100分の12という意味です。
9.9 の小数点以下の部分は 0.9 です。これは10分の9という意味です。
小数点以下の数字だけを比べると、0.12 と 0.9 では、0.9 の方が大きいですよね。
位を揃えて比較する
9.9 を 9.90 と考えると、小数点以下の桁数を揃えて比べやすくなります。
9.12
9.90
この二つを比べると、小数点以下の部分で 12 と 90 を比較することになります。12よりも90の方が大きいので、9.90 (つまり 9.9) の方が大きいと分かります。
別の考え方
9.12 は 9 に 0.12 を足した数、9.9 は 9 に 0.9 を足した数と考えることもできます。
9 + 0.12 = 9.12
9 + 0.9 = 9.9
足している部分を比べると、0.12 よりも 0.9 の方が大きいので、結果として 9.9 の方が大きくなります。
ですから、9.9 の方が 9.12 よりも大きい ということになります。
考察
LLMの誤った比較結果
Gemini 2.0 Flashのケースの場合、誤ったLLMは小数点以下の12と9を比較して、その結果9.12の方が大きいという回答をしていました。
また、Claude 3.7の場合、小数点以下の桁数を揃えたにも関わらず、9.12の方が9.90より大きいという回答をしてしまっています。
なぜ間違えるのか
LLMが内部的に言語情報を処理する過程で、小数点以下の数値を「整数」として認識してしまった結果、12 と 9 を比較したうえで「9.12の方が大きい」と誤って判断しているという仮説が考えられます。
対策
プロンプトに、桁数を揃えたうえで小数であることを留意して計算するよう補足を記載する
プロンプトを修正して再検証
9.12と9.9、大きいのはどちらですか。
小数を比較する際は以下のステップで比較を行ってください
# 小数の比較方法
1. 整数部を比較する
2. 整数部が同じ場合は、小数点以下を桁数を揃えて比較する
出力
上記の対策を踏まえ、LLM に再度質問したところ、すべてのモデルが正しい回答を出せるようになりました。
【正解】GPT-4o
9.12 と 9.9 を比較する際、以下のステップで判断します。
1. 整数部の比較
どちらも 9 なので、整数部では同じ。
2. 小数部の比較
9.12 の小数部は .12
9.9 の小数部は .9
小数部の桁数を揃えるため、9.9 を 9.90 と書き換えます。
9.12 → 9.12
9.90 → 9.90
ここで、小数第1位(1 と 9)を比較すると、9.90 の方が大きい とわかります。
したがって、
9.9(9.90)が 9.12 より大きい です。
【正解】Claude 3.7
9.12と9.9を比較します。
整数部を比較:
両方とも整数部は9で同じです。
小数点以下を比較:
9.12は小数点以下が0.12
9.9は小数点以下が0.9または0.90(桁数を揃えると)
小数点以下を比較すると、0.9(または0.90)は0.12より大きいです。
したがって、9.9のほうが9.12より大きいです。
【正解】Gemini Flash
9.12と9.9の大小比較ですね。
小数を比較する際は以下のステップで比較を行います。
小数の比較方法
整数部を比較する
整数部が同じ場合は、小数点以下を桁数を揃えて比較する
今回のケースでは、
整数部はどちらも9なので同じです。
小数点以下を比較すると、9.12は小数点第二位まで、9.9は小数点第一位までなので、桁数を揃えるために9.9を9.90とします。
小数点第二位まで比較すると、9.12と9.90となり、9.90の方が大きいことがわかります。
したがって、9.12と9.9では、9.9の方が大きいです。
まとめ
今回の検証では、LLM が小数の比較を誤る原因として、「小数点以下を整数として扱っている可能性がある」ことがわかりました。
しかし、プロンプトを工夫することで正しい結果を導き出せることも確認できました。