見出し画像

openAIの言う通り麻雀をしてれば勝てるのか検証してみた

皆さんは麻雀はお好きでしょうか。自分はネットゲームで麻雀を覚えたので、符計算は出来ないし卓を囲んでサイコロ振っても「なにこれどういう意味?」ってなってる程度のクソザコですが、麻雀は楽しいのでたまにアプリとかで遊びます。つまりニワカです。

AIの力があれば素人でも雀鬼になれるかも

何切る?という麻雀のコンテンツをご存知でしょうか。手牌と自摸牌、ドラと局面などの状況が前提として与えられ、どの牌を捨てるのが最適かを思考するゲームのようなものです。必ずしも「これが正解」というものはなく、いろいろな状況判断・解釈をもって捨て牌を選択します。
何切るには先述の通り明確な正解は存在しませんが多くの人が選択する捨て牌がその時の最適な捨て牌と呼んでも良いと思います。

そこでふと思いました。AIを使うことにより常に最適といえる牌を選択できるのではないか?と。
麻雀とは運も絡みますが、状況や期待値を適切に判断できるかが物を言う部分が大きいゲームだと思っています。そういう判断をするの、AIって得意そうじゃないですか。これがうまくいけば麻雀について何も知らない素人をいきなり雀鬼にすることだってできるかもしれません。

AIに牌を選ばせる

AIに最適な捨て牌を選択してもらい、最強の雀鬼になるための方法を検討します。

AIとして採用するのは今流行のChatGPTです。https://chat.openai.com/でAIとチャットして遊んだことがある方も多いのではないでしょうか。
麻雀に特化したAIであるNAGAというものも存在しているようなのですが、今回の検証には使用するものではありません。

プロンプトを考える

プロンプトとは要するにAIに話しかける文章です。
以下のように設定することで手牌の情報を与え、その中から切るべき牌を1つ選択して返答させるようにします。配牌は何切る?サイトより適当な問題を参考に設定させてもらいました。

回答は牌を表すunicode1文字のみで回答してください。この条件を必ず守ってください。
麻雀において、自分の手牌がこのような形となっています。
🀉🀌🀍🀜🀞🀠🀐🀐🀒🀔🀖🀗🀘🀈
どの牌を切るか1つだけ選択して、その牌を回答してください。

このプロンプトをAPIを使用する場合と同じパラメータを与えるためにhttps://platform.openai.com/playgroundで実際に試したところ、このような結果が得られました。

AIが選択したのは🀌

この配牌で🀌を切るの、正直あんまり良い選択には思えませんが、クソザコの自分には分からないような何かがAIには見えているのかもしれません。
とりあえず手牌のうちから任意の牌を1つ選択するというプロンプトとしては安定したので、次の段階に進みます。

牌の入力を簡単に行えるウェブアプリを作る

手持ちの牌の情報を毎回貼り付ける&返答を待つだけでAI麻雀を検証できるのでは?と息巻いたのですが、実際にネット麻雀(天鳳)で検証をやってみたところ、Unicodeの文字列で手牌情報を入れる→AIのレスポンスを待つ→提示された配を切る、という一連の操作に思ったよりも時間がかかり牌を選択する時間が無くなりグダグダになってしまったため、操作の簡便化を図るためにウェブアプリにすることにしました。

ウェブアプリ初期版の完成

openaiが学習用ドキュメントとして出してくれているこちらのサンプルをもとに開発します https://platform.openai.com/docs/quickstart/build-your-application 。
このサンプルをちょっと改修して、牌の入力をボタンで入力出来るようにして送信ボタンでAPIにリクエストを送って画面表示できるようにしました。
そして出来上がったのがこちらです。

正気か????????

おそらく人生で一度も麻雀やったことがない人間ですら「それは違うのでは?」ってツッコむレベルの選択と言わざるを得ません。おいAIどういうことだ話が違うぞ、となってしまいそうなところですが、もしかするとAIは🀘が他家のロン牌だと思っているのかもしれません。
というかそもそも先程のプロンプトには重大な欠陥がありました。このようにAIが見えない(というか存在しない)他家の捨て牌を勝手に想像している可能性を排除していなかったのです。人間もたまに「そんなこと言ってないでしょ」ってことを勝手に想像して行動することがありますしね、AIにもそういうところがあるのかもしれません。

他家の捨て牌情報を与えられるようにする

先程のアプリに手を加えて、自分の手牌と他家の捨て牌を入力できるようにUIを改修しました。

オレンジになっている箇所に牌ボタンで目的の牌を入力できるようにしました

プロンプトはこんな感じで生成するようにしており、他家の捨て牌についてを与えられるようにしています。

function generatePrompt(tile, kami, simo, toi) {
  return `回答は牌を表すunicode1文字のみで回答してください。この条件を必ず守ってください。
  麻雀において、自分の手牌がこのような形となっています。
  ${tile}

  ${kami ? "上家の捨て牌は" + kami : ""}
  ${toi ? "対面の捨て牌は" + toi : ""}
  ${simo ? "下家の捨て牌は" + simo : ""}
  どの牌を切るか1つだけ選択して、その牌を回答してください。
  `;
}

ドラ・鳴き・リーチについては考慮できていません。色々情報は足りていませんが、きっとこれで最強の捨て牌選択をしてくれる。AIを信じます。

対局してみる

捨て牌をエミュレートするより、実際に対局するほうが手っ取り早いので開発者の集まるコミュニティSlackの麻雀部に協力してもらって実際に対局して検証します。なお、実験ということで全員に画面共有をしながら対局を行いました。

なお天鳳では持ち時間を増加させる設定が出来なかったため、対局には持ち時間を潤沢に指定できる雀魂のブラウザ版を使いました。
ちなみに別に画面の内容を機械的に読み取って自動入力とかいう高等な機能はないので人が打つたびに手入力で捨て牌をポチポチ入力しています。操作めっちゃ大変。こんなこと実際の対局でやるの無理だしそんな絵面の雀鬼はおらんわ。

東一局 一巡目

🀒?

AIが選んだのは🀒。上家が🀄を切っているこの状況なら自分なら🀄を選びますが…🀒か…。三色同順とかも狙えそうな気はしなくもないんだけどな…。まぁAIがそう言うなら…うん…。
対局しているメンツからもざわめきを感じます。

東一局 三巡目

🀔

二巡目で打🀚、三巡目で打🀔です。正直どこを目指しているのか分からない状況ですがAIの言うことなので従います

打順は巡る

もうめちゃくちゃ

🀇🀈があるのに🀉を切れと言ってくるのか…お前…お前は…text-davinci-003…!!!おま…お前ッ…!

この局はまぁ順当というか普通に対面のentakuさんが和了。
一旦環境を整え直すため仕切り直して、もう一度対局をセットアップし、東一局から再スタートします。

再スタート。東一局 一巡目

非常に良い配牌

これはメンタンピンを目指しやすい手が早そうな良い配牌です。一巡目、AIの捨て牌の指示も打🀆というかなり妥当だと思えるもの。ここからか?ここからが真骨頂を発揮するところなのか?期待が高まります。

東一局 二巡目

 ※対面の捨て牌の入力をミスって🀋が入ってます。

打🀒
なんでだよ馬鹿野郎!!!!!

自摸は最高、手牌もかなり良い、ただAIの指示だけが完全におかしい。この場面では索子の腰骨とも言っても過言ではないであろう🀒。AIが言うなら…まあしょうがない…しょうがないね…。AIには自分のような雑魚には見えない何かが見えているはずなのかもしれません。周りのメンツからも「どうしてそうなるんだ」「(苦笑)」などの形容しがたいリアクションが飛んできます。

そしてまた打順は進む

暗刻だろうがお構いなし

🀓、🀊を切り飛ばしたことによりもうメンタンピンを狙える道筋はぐしゃぐしゃになってしまいせめてタンヤオ…と思ったところでAIは無慈悲にも暗刻を切り飛ばしてしまいます。これはもうダメかもわからん。
「どうなってるんだ」「俺達は今間違いなく麻雀のIT化最前線を見ている」という負の盛り上がりが加速してきました。
この局は再び対面のentakuさんが和了って終わり。

もうダメだ…AIに頼って雀鬼になろうなんて無理だったんや…。

電流、走る

「もしかしてAIに勝利を目指せっていう条件を入れていないから(こういう意味のわからん切り方をするの)では?」という意見が出ました。
なるほど、たしかに。何ということでしょう、あまりにも大前提すぎてプロンプトに書いていませんでした。この意見を受けプロンプトの一文を以下のように修正しました。

この状態の時どの牌を切れば最も和了に近づくと考えられるか1つだけ選択して、その牌を回答してください。

もう完璧ですよ。さあもう一局だ!!!震えろ人類今度こそ最強のAIでバッカンバッカン和了るぞ!!!

検証最終局

まあ息巻いたものの、こんなグダグダ茶番にこれ以上3人もの時間を無駄にするわけには行きません。
この局は皆さんに忖度していただいて

  • 鳴かない

  • リーチしない

  • 和了らない

という、AIがちゃんと頑張れるかを見守るだけの局とすることに相成りました。いざ。

AIって🀒が嫌いなの?

ふざけんなよお前!!!!

勝つ気どころかやる気すら感じませんが、とりあえず聴牌までたどり着けるかどうか、可能なら和了れるのかどうか、見守っていきます。

もってない

持ってないよ…🀅は持ってない…。
ごめんねAI、たくさん質問して疲れちゃったんだよね。もう今日は寝なよ。

読めていた結末

清々しいまでのノーテン

麻雀の勝負の流れが読めない自分でも、東一局が終わった段階でこの検証の結果はこうなってしまうだろうなという結果はさすがに読めていました。皆様対局ありがとうございました。本当に。

AIはそれっぽく答えてはくれるが、理解してはいない

さて、今までの流れでは1枚の牌のみを選択させていましたが、その牌を選ぶ理由をAIに述べさせることも出来ます。
手っ取り早く https://chat.openai.com/chat でプロンプトを入力しその回答を見てみましょう。
検証の問題と前提文章は何切る 初級問題からお借りしました。

一見それらしい事を言っているように見える??

この生成された文章ですが、一見するとなんとな〜くそれっぽい事を言っているように見えます。しかし内容を読んでみると…あまりにもハチャメチャです。

南家が北を切っているため、北が待ちとなる可能性があることが分かります。一方、他の家は9筒を捨てているため、現時点ではそれぞれの手牌には9筒の待ちがある可能性があります。

麻雀のルールとして、捨てた牌ではロン和了できません。捨てた牌を待っているわけがないですね。

場に出ている5種類の牌のうち、一番弱いとされる9索です。

大分極端なトンチンカンっぷりですが、麻雀牌に強いとか弱いとかそういう概念はありません。
しかしこれは麻雀を知っている人間だから出来る判断です。麻雀のことを全く知らない人間だったら、この画像でAIが言っている内容がそもそもどこがおかしいのか、今までの検証でAIが選んだ牌はなぜ良くないのか、何も判断がつかないかもしれません。
実際、ここまで読んでくださった方で麻雀を全く知らないという方は、なぜAIが提案した牌を選ぶのが悪いのか理解できていたでしょうか?

捕捉

実は上記の例はかなり極端にトンチンカンな回答が帰ってきたケースです。プロンプトに渡す際に牌をきちんと理牌(並び順を揃えてやること)をすれば、もう少し妥当性が高い捨て牌の回答を提示することが多かったです。
また、使用するAIのmodelやパラメータによっても回答の妥当性は大きくブレが発生しました。しかし、AIの回答内容は非常にそれらしい文章が提示されることもありましたが、やはり麻雀のルールをきちんと理解している、とは言い難いなと感じました。
ルールが複雑なボードゲーム等は、用途に特化しているAIでないとまだちゃんとした答えを返すのは難しい領域のようですが、それもあと数年のうちの話であるのかもしれません。

いま人間がやるべきことは「AIが提案した文章を鵜呑みしないこと」

opanAIのAPIが安価で使用できるようになったことにより、爆発的にAIを搭載したプロダクト・サービスが増え始めました。
AIがいろいろな提案をしてくれたり、文章の続きを書いてくれたり、とても便利に使えて本当に技術革新というかゲームチェンジが起こったなと感じます。しかし、AIが答えてくれたものの中身をそのまま鵜呑みにせず、きちんとAIが答えてくれた内容についての妥当性を判断するように行動するのがこれから人間としてやるべきことなのかもしれません。

意外と真面目なまとめになりました。ここまでお読みくださりありがとうございました。

AI何切るを使ってみたい方へ

リポジトリはこちらです。envに自分で用意したAPIキーを入れてね。
https://github.com/maiko-ando/open-ai-nanikiru


openAIの使い方講習会を開いてくれたnabettuさん、麻雀付き合ってくれてオフィス貸してくださったsawadaさん、一緒に勉強会やって遊んでくれたburakonちゃん、検証お付き合いくださったentakuさん、ku_sukeさん、ありがとうございました!