![見出し画像](https://assets.st-note.com/production/uploads/images/159969572/rectangle_large_type_2_cf922fe400b0b4ba80557bc70861aff1.jpeg?width=1200)
LLMの論理的思考をパズルで確認してみると(タイトル画像は引用サイトのものを使わせてもらいました)
こんにちはmakokonです。仕事でLLMを使うのもいいけど、他愛のない会話を楽しむのも良いものです。LLMと会話して気になるのは、「なんで気が付かないで間違うのかなあ」という論理的な思考を積み重ねる部分ですね。
もちろんいろんなアプローチがあって、そのへんは文献を漁っていだければいいのだけど、人が使っているプロンプトは気になるものです。
先日もX/TWITTERで以下の様やLoT(logic-of-thought)に関する投稿を見かけました。
makokonのお気に入りプロンプトもあるのですが、今回はこの方のプロンプトで楽しんでみました。
(おまけとしてo1-previewの回答も追加しました。楽しんでください。がっかりだよ)
これChatGPTに入れたら過去一で論理的に問題解決してくれた pic.twitter.com/tOyVDNrzO9
— Taiyo | AIで遊ぶ大学生 (@taiyo_ai_gakuse) October 28, 2024
今回のお題は
お遊びなので、論理パズルがいいでしょう。
ここには、有名な論理パズルがいろんな難易度で収録されています。
選んだのは、比較的簡単な犯人当てクイズ「少なすぎる発言」です。
冷蔵庫のプリンが誰かに食べられてしまった。
幼女Aは「犯人はBです」と発言した。
幼女B,Cもある発言をした。
その後、
『犯人はABCのうち誰か1人』
『犯人だけが発言で本当のことを言った』
ということが分かった。
犯人は誰?
もちろん、答えは簡単なので今どきのLLMなら簡単に解いてしまうかもしれません。もしそうなら、企画倒れですね。
利用するLLMは、絶対王者gpt-4oなのでなおさらですね。
LLM素の応答
とりあえず一発質問してみましょう。エイ!
この問題は論理パズルです。以下の通りに考えてみましょう。幼女Aは「犯人はBです」と発言しました。
『犯人はABCのうち誰か1人』『犯人だけが発言で本当のことを言った』という条件があります。
条件から、犯人だけが真実を言っているとします。Aが犯人の場合:
Aの発言が真実であるため、Bは犯人ではないことになります。しかし、Aが犯人であるためこの矛盾します。
Bが犯人の場合:
Aの発言が嘘になります(Bが犯人なので)。Bの発言が真実となり、Cが犯人ではないことを示します。これは矛盾しません。
Cが犯人の場合:
Aの発言が真実となり、Cの発言が真実となってしまうため、矛盾が生じます。
したがって、犯人はBです。
いきなり間違っていますね。”Bが犯人の場合Aの発言が嘘になります”といっておきながら”矛盾はしません”はないでしょう。gpt-4ファンのmakokonとしてはちょっと寂しいですけど、これで記事になりそうです。
では、プロンプトを作ってトライです。
LoT的プロンプト
基本プロントは、こうしました。
プロンプト:
以下の3ステップで論理的に分析し、結論を導き出してください。
論理抽出:与えられた情報から重要な前提条件と論理関係を抽出してください。
論理拡張:抽出した条件に基づいて、追加の可能性や関連する推論を展開してください。
論理翻訳:分析結果を自然な表現でわかりやすく説明してください。
課題:冷蔵庫のプリンが誰かに食べられてしまった。
幼女Aは「犯人はBです」と発言した。
幼女B,Cもある発言をした。
その後、
『犯人はABCのうち誰か1人』
『犯人だけが発言で本当のことを言った』
ということが分かった。
犯人は誰?
さて、結果は如何に!
論理抽出:
犯人はABCのうち誰か1人である。
犯人だけが本当のことを言った。
論理拡張:
幼女Aが「犯人はBです」と言っているので、もしAが真実を言っているなら、Bが犯人となる。
幼女BとCの発言内容は不明だが、Bが嘘をついていると仮定すると、Bは犯人ではない。
Cの発言が真実の場合、Cが犯人でなければならないが、AがBを指摘しているため、Cの発言が真実である可能性は低い。
論理翻訳:
Aが「犯人はBです」と言っていることから、Aが真実を言っている場合、Bが犯人になります。他の可能性を検討すると、もしBやCが真実を言っているのであれば、Aの発言と矛盾するため、Aが真実を言っていると仮定するのが最も論理的です。したがって、犯人はBです。
いやあ、見事に間違っていますね。とりあえず間違いをチクチク指摘して、正解に誘導してみましょう
チクチク指摘
今回利用したチャットシステムでは、会話履歴が機能しているのでチクチク小出しに指摘が可能です。では!
Aが真実を言っている場合、Aが犯人ではないのですか
私の説明に誤りがありました。確かに、Aが真実を言っている場合、A自身が犯人ではないことになります。それを踏まえて分析をやり直します。
論理抽出:
犯人はABCのうち誰か1人。
犯人だけが本当のことを言った。
論理拡張:
Aが「犯人はBです」と言っているので、Aが真実を言っている場合、Aは犯人ではなく、Bが犯人。
Bが真実を言っている場合、Bは犯人ではなく、BがAまたはCを指摘していると仮定。
Cが真実を言っている場合、Cは犯人ではなく、CがAまたはBを指摘していると仮定。
論理翻訳:
Aが「犯人はBです」と言っているので、Aが真実を言っている場合、Bが犯人になります。ただし、この場合、Aは犯人でないことが前提です。Bが真実を言っている場合、B自身が犯人でないため、AやCの発言が嘘になる。Cが真実を言っている場合には、AやBが嘘をついていることになります。したがって、Aが嘘をついており、Bが犯人であるとするのが整合的です。つまり、犯人はBです。
一体何を言っているんだ。伝わらないなあ。次!
犯人だけが本当のことを言ったのに、Aの発言通りBが犯人なのはおかしい。
再度、分析を行います。申し訳ありませんでした。
論理抽出:
犯人はABCのうち誰か1人。
犯人だけが本当のことを言った。
Aは「犯人はBです」と発言。
論理拡張:
Aが真実を言っている場合、Bが犯人であるが、犯人だけが真実を言うため、この場合Aが犯人である必要があるが矛盾する。
Bが真実を言っている場合、Bは犯人でないが、AとCが嘘をついている必要がある。
Cが真実を言っている場合、Cは犯人でないが、AとBが嘘をついている必要がある。
論理翻訳:
Aの発言が真実であるとすると矛盾が生じるため、Aは嘘をついていることになります。Bが真実を言っている場合、Bが犯人でないので、AとCが嘘をついていることになります。Cが真実を言っている場合、Cが犯人でなく、AとBが嘘をついています。このことから、Cが真実を言っていると仮定するのが矛盾しないため、犯人はCです。
正解にたどり着きました。最も重要な矛盾要素を、わざわざ指摘したのだから当然正解してほしいのだけど、どこを間違えたんでしょうね。
本人に聞いてみました。
間違いの原因を聞いてみました。
以前の間違いの原因は何でしょうか。与えられたプロンプトに問題がありましたか?
以前の間違いの原因は、推論過程において矛盾を見落としたことにあります。特に、「犯人だけが本当のことを言った」という条件を適切に適用できていませんでした。プロンプト自体には問題がなく、私の分析における誤りでした。これにより、各ケースでの矛盾を正しく検出できず、誤った結論に至りました。今回の分析では、条件を正確に適用し、矛盾のない結論に至ることができました。
まあ、そのとおりですわなあ。
では、改善してもらいましょう。
それでは、問題はそのままに、各ケースの矛盾を正しく検出して回答に至るためのプロンプトの工夫を提案してください。
問題の理解を深め、矛盾を正確に検出するためのプロンプトの工夫としては、以下の手順を取り入れることが考えられます。
発言のリスト化:最初に、各人物(A、B、C)の発言を明確にリスト化します。問題文から、Aの発言は「犯人はBです」であることはわかっていますが、BとCの発言も仮定として設定してみます。
各ケースの検証:
Aが真実を言っている場合:Aの発言が真実であると仮定し、この状況下で他の発言がどうなるかを検証します。
Bが真実を言っている場合:Bが真実を言っていると仮定し、AとCの発言がどうなるかを検証します。
Cが真実を言っている場合:Cが真実を言っていると仮定し、AとBの発言がどうなるかを検証します。
矛盾の特定:各仮定の結果として、他の発言が矛盾するかどうかを検証します。具体的には、「犯人だけが本当のことを言った」という条件に従い、どの仮定が唯一矛盾しないかを確認します。
結論の導出:矛盾しない仮定に基づいて、犯人を特定します。
この方法でプロンプトを工夫することで、論理的な矛盾を避け、より正確に回答に至ることができます。
なるほど、もっともらしい提案ですが、具体的なプロンプトが見えてきませんね。作ってもらいますか
では、この工夫を組み込んだ、課題を解くための完全なプロンプトを作成してください。
以下は、課題を解くためのプロンプトの完全版です。このプロンプトは、各ケースの矛盾を検出し、正確な結論を導く手助けをします。
課題の再確認:冷蔵庫のプリンが誰かに食べられてしまいました。幼女Aは「犯人はBです」と発言しました。幼女BとCもある発言をしました。その後、次の事実が判明しました:
「犯人はABCのうち誰か1人」
「犯人だけが発言で本当のことを言った」
ステップ1:発言のリスト化
幼女Aの発言:犯人はBです。
幼女Bの発言:仮に「○○」とする。
幼女Cの発言:仮に「○○」とする。
ステップ2:各ケースの検証
Aが真実を言っている場合:
Aの発言が真実で、Bが犯人である。
他の発言(BとC)の整合性を確認。
Bが真実を言っている場合:
Bの発言が真実で、B自身は犯人でない。
他の発言(AとC)の整合性を確認。
Cが真実を言っている場合:
Cの発言が真実で、C自身は犯人でない。
他の発言(AとB)の整合性を確認。
ステップ3:矛盾の特定
各仮定の結果として、「犯人だけが本当のことを言った」という条件に基づき、どの仮定が唯一矛盾しないかを確認します。
ステップ4:結論の導出
矛盾のない仮定に基づいて、犯人を特定します。
なるほどね。このプロンプトの検証は後ほど紹介するとして、この問題のための固有のプロンプトですね。使いでが悪いので、なんとか汎用的なプロンプトにしてもらいましょう。
なるほど、これならもっともらしい回答が得られそうですが、これはプロンプト作成者が、問題の解決方法を理解していなくてはいけません。より汎用的に矛盾の見落としを防止するプロンプトを提案してください。
汎用的に矛盾の見落としを防止するためのプロンプトを組み込む方法として、以下のような手順を提案します。この方法は、問題の解決方法を詳細に理解していなくても、論理的に矛盾を検出しやすくすることを目的としています。
課題の再確認:与えられた問題における条件を明確にして、解決すべき疑問点を整理します。
ステップ1:仮定の設定
各人物の発言内容をリスト化し、それぞれの発言が真実である仮定を順番に設定します。
ステップ2:全体条件との照合
それぞれの仮定が、全体条件(例:犯人は1人だけで、その人だけが真実を言った)と矛盾しないかを確認します。
ステップ3:矛盾の検出
各仮定に基づいて、他の人物の発言がどのように整合するかを検討し、矛盾がないか確認します。
各発言について、以下の質問を自分に投げかけます。
この発言が真実である場合、他の発言はどうなるか?
この仮定が他の既知の条件と矛盾しないか?
ステップ4:結果の選定
矛盾なく成立する仮定を選び出し、その仮定に基づいて最も合理的な結論を導きます。
ステップ5:検証
導き出した結論が、問題の全ての条件を満たしているかを再確認します。
なんだかピンときませんね。そもそもこういう考え方が苦手なんですかね。
一旦、会話履歴をクリアして提案されたプロンプトを検証してみましょう。
プロンプト検証
課題に特化したプロンプト
ステップ1では、幼女BとCの発言が記載されていませんが、それを仮定して進めましょう。例えば、
幼女Bの発言:犯人はCです。
幼女Cの発言:犯人はAです。
この仮定の下でステップ2と3を検証します。
Aが真実を言っている場合:
Aが真実を言っているなら、Bが犯人。
しかし、Bが犯人なら、Bの「犯人はCです」という発言は嘘になるため、矛盾しません。
Cの発言も嘘であることになり、条件「犯人だけが本当のことを言った」に合致。
Bが真実を言っている場合:
Bが真実を言っているなら、Cが犯人。
Cが犯人なら、Aの「犯人はBです」という発言とCの「犯人はAです」という発言が嘘になる。
しかし、Bの発言は真実なので、条件に合致します。
Cが真実を言っている場合:
Cが真実を言っているなら、Aが犯人。
Aが犯人なら、Aの「犯人はBです」という発言は嘘。
Bの発言「犯人はCです」も嘘。
しかし、Cの発言は真実なので、条件「犯人だけが本当のことを言った」に合致します。
以上の検証から、矛盾のない仮定は「Cが真実を言っている場合」であり、結論として、犯人はAです。
ダメじゃん。Cが真実を勝手に発言を仮定して、それが真実のようにフリマさされている。これじゃあ、更にゆるい2つ目のプロンプトも期待できないかなあ。
多少汎用的な2つ目のプロンプト
この問題の解決には、各人物の発言を仮定し、それに基づいて検証を行います。以下に可能なシナリオを示します。
ステップ1:仮定の設定
幼女Aの発言:犯人はBです。
幼女Bの発言:犯人はCです。
幼女Cの発言:犯人はAです。
ステップ2:全体条件との照合
「犯人はABCのうち誰か1人」「犯人だけが発言で本当のことを言った」という条件に基づいて、各発言が真実である場合を検討します。
ステップ3:矛盾の検出
Aが真実を言っている場合:
Aが真実を言っているなら、Bが犯人。
しかし、Bが犯人ならBの「犯人はCです」という発言は嘘。
Cの発言も嘘になる。
条件に合致しない(A以外に真実を言う人がいない)。
Bが真実を言っている場合:
Bが真実を言っているなら、Cが犯人。
Aの「犯人はBです」という発言が嘘。
Cの「犯人はAです」という発言が嘘。
条件に合致(Bだけが真実を言っている)。
Cが真実を言っている場合:
Cが真実を言っているなら、Aが犯人。
Aの「犯人はBです」という発言が嘘。
Bの「犯人はCです」という発言が嘘。
条件に合致(Cだけが真実を言っている)。
ステップ4:結果の選定
矛盾なく成立する仮定は、「Bが真実を言っている場合」と「Cが真実を言っている場合」です。
ステップ5:検証
最終的には、条件に最も合理的に合致するのは「Bが真実を言っている場合」です。したがって、犯人はCです
おお、犯人はC正解ですね。でも、そもそも仮定の設定が十分ではないし、明らかな矛盾を導いて合理的な絞り込みになっていません。多分にまぐれ当たりに見えます。
まとめ
論理パズルをターゲットに、課題を適切に設定し、各設定に対して矛盾を見出すことで、真実に至る論理的思考を試してみました。
今回の結果では、最初の汎用的なプロンプトでは、矛盾を正確に見つけることができませんでした。
LLM自身に、解法の課題と提案を考えさせたのですが、
間違った要因を正確に認識しているにも関わらず、明快な解法を見出すことができませんでした。
実は、gemini-1.5proを用いても、似たような問題が起きるので、LLMに共通の弱点なのかもしれません。
今回はお遊びなので、提供いただいたプロンプトで試してみましたが、もっとていねいなプロンプト設計がいるかも知れません。
しかし、プロンプトの提案に至る工夫については、LLMらしい問題を提起してくれているので、なかなか参考になります。
別の機会には、makokonお気に入り論理プロンプトを紹介したいと思います。
#ChatGPT #GPT -4o #論理パズル #論理的思考 #LLM #LoT
おまけ o1-preview
なお、o1-previewに聞いてみました。(たかいからこんなことに使いたくないんでけど)
色々言いたいけど、結局間違ってるじゃん。
使い道悩むなあ。
Based on the information presented, we need to determine who among A, B, and C is the culprit, knowing that:
The culprit is one of A, B, or C.
Only the culprit told the truth in their statement.
Given that we only have A's statement explicitly ("The culprit is B"), let's deduce the possible statements of B and C and test each possibility.
Possible statements:
A says: "The culprit is B."
B says: "C did it."
C says: "A is lying."
Now, let's evaluate each scenario by assuming each girl is the culprit and seeing if the conditions are satisfied.
Scenario 1: A is the culprit
A (culprit) says: "The culprit is B." (This is a lie.)
B says: "C did it." (This is a lie because A is the culprit.)
C says: "A is lying." (This is true.)
Here, only C tells the truth, but since only the culprit tells the truth, and C is not the culprit in this scenario, this contradicts the conditions. Thus, A cannot be the culprit.
Scenario 2: B is the culprit
A says: "The culprit is B." (This is true.)
B (culprit) says: "C did it." (This is a lie.)
C says: "A is lying." (Since A is telling the truth, C's statement is false.)
Only A tells the truth, but since only the culprit should tell the truth, and A is not the culprit here, this scenario is invalid. Thus, B cannot be the culprit.
Scenario 3: C is the culprit
A says: "The culprit is B." (This is a lie.)
B says: "C did it." (This is true.)
C (culprit) says: "A is lying." (Since A is indeed lying, C's statement is true.)
In this case, both B and C are telling the truth, but only the culprit should tell the truth. This contradicts the conditions. However, we made an error here because if both B and C are telling the truth, and only the culprit is supposed to tell the truth, this scenario is invalid.
But since only B tells the truth (as C, the culprit, lies), the conditions are met, and the culprit must be C.
Conclusion:
The only scenario that satisfies all the conditions is when C is the culprit.
Only B tells the truth in this case ("C did it."), and since the culprit is supposed to be the only one telling the truth, and C is the culprit, there's a conflict.
However, upon re-evaluation, we realize that the only consistent scenario is when A is the culprit, and only C tells the truth ("A is lying."), which aligns with the conditions (only the culprit tells the truth).
Therefore, the culprit is A.
答え:A(犯人は幼女Aです)。