TypeSafe AI の Jev が話題になっていたので、使い方を知るために Playground で少し触ってみました。題材は好きな麻雀の何切る問題です。
Jev は「System One Model」と呼ばれていて、考え込まずに直感的に即答するタイプのモデルです。入力した状態(State)と質問(Questions)に対して、選択肢ごとの確率付きで答えを返します。何切る問題は「14枚から1枚選ぶ」問題なので、牌ごとの確率が出るこの形式と相性が良さそうだと考えました。
使った問題
AIの答えが合っているかを判断しやすいように、正解がほぼ決まっている問題を選びました。
今回は、大体の人が九萬を切ると思います。九萬を切ればカン二索待ちの聴牌になり、二索で和了すれば一二三の三色が確定します。
- ルール
- 4人打ち、赤ドラあり、喰いタンありのまぁ普通のやつ。
- 東3局
- 北家12巡目
- 持ち点
- 全員25000点
本当はドラや捨て牌の情報もあったほうが良いです。ただ、入力が煩雑になるのと、まずは試してみるだけのつもりだったので、細かい条件は入れていません。
Claude Code で画像から入力を作る
Jev は画像を読めません。牌の状況をテキストに起こすのは面倒だったので、条件と画像を Claude Code に渡して、State と Questions を作ってもらいました。
最終的に使った入力はこれです。
State
日本式リーチ麻雀(4人打ち、赤ドラあり、喰いタンあり)の何切る問題。
局面: 東3局0本場、供託なし、自分は北家、12巡目。
持ち点: 全員25000点
ドラ: 情報なし
手牌(13枚): 一萬、二萬、三萬、赤五萬、六萬、七萬、九萬、一筒、二筒、三筒、一索、三索、九索
ツモ: 九索
副露: なし(自分・他家とも)
リーチ: 他家のリーチなし
河: 情報なし(特に危険な他家はいない前提)
残りツモ: 約6回
目的: 平均順位の最小化(和了率と打点のバランスを重視)
Questions
{
"discard": {
"type": "choice",
"instructions": "手牌とツモを合わせた14枚から1枚切る。平均順位を最小化する観点で、和了率と打点のバランスが最も良くなる打牌はどれか。",
"criteria": {
"一萬": "一萬を切る",
"二萬": "二萬を切る",
"三萬": "三萬を切る",
"赤五萬": "赤五萬を切る",
"六萬": "六萬を切る",
"七萬": "七萬を切る",
"九萬": "九萬を切る",
"一筒": "一筒を切る",
"二筒": "二筒を切る",
"三筒": "三筒を切る",
"一索": "一索を切る",
"三索": "三索を切る",
"九索": "九索を切る"
}
}
}
日本語での結果
{
"model": "jev-1.13.0",
"answers": {
"discard": {
"type": "choice",
"choice": "九萬",
"confidence": 0.15,
"probabilities": {
"一萬": 0.02,
"三索": 0.19,
"二筒": 0.01,
"三筒": 0.02,
"一索": 0.17,
"七萬": 0.04,
"一筒": 0.02,
"九索": 0.19,
"二萬": 0.01,
"六萬": 0.04,
"九萬": 0.21,
"赤五萬": 0.05,
"三萬": 0.03
},
"stats": {}
}
},
"usage": {
"input_tokens": 805,
"output_tokens": 126
},
"request_id": "playground_xxxx",
"evaluation_time_ms": 71.11000199984119
}
英語でも試した結果
ドキュメントに英語のほうが精度が高いとあったので、同じ内容を英語にして試しました。
英語版の State と Questions
State
A "what to discard" problem in Japanese Riichi Mahjong (4-player, one red five per suit, open tanyao allowed).
Situation: East 3, 0 honba, no riichi sticks. I am the North seat. Turn 12.
Scores: everyone has 25000
Dora: no information
Hand (13 tiles): 1-man, 2-man, 3-man, red 5-man, 6-man, 7-man, 9-man, 1-pin, 2-pin, 3-pin, 1-sou, 3-sou, 9-sou
Drawn tile: 9-sou
Melds: none (for me and for the opponents)
Riichi: no opponent has declared riichi
Discards: no information (assume no opponent is especially dangerous)
Remaining draws: about 6
Goal: minimize average placement (balance winning probability and hand value)
Questions
{
"discard": {
"type": "choice",
"instructions": "Discard one tile from the 14 tiles (hand plus drawn tile). To minimize average placement, which discard gives the best balance of winning probability and hand value?",
"criteria": {
"1m": "Discard 1-man",
"2m": "Discard 2-man",
"3m": "Discard 3-man",
"red_5m": "Discard the red 5-man",
"6m": "Discard 6-man",
"7m": "Discard 7-man",
"9m": "Discard 9-man",
"1p": "Discard 1-pin",
"2p": "Discard 2-pin",
"3p": "Discard 3-pin",
"1s": "Discard 1-sou",
"3s": "Discard 3-sou",
"9s": "Discard 9-sou"
}
}
}
{
"model": "jev-1.13.0",
"answers": {
"discard": {
"type": "choice",
"choice": "9s",
"confidence": 0.41,
"probabilities": {
"6m": 0.03,
"3m": 0.03,
"7m": 0.03,
"1s": 0.09,
"1m": 0.03,
"2m": 0.01,
"9s": 0.45,
"3s": 0.07,
"3p": 0.01,
"2p": 0.01,
"red_5m": 0.08,
"1p": 0.02,
"9m": 0.14
},
"stats": {}
}
},
"usage": {
"input_tokens": 740,
"output_tokens": 124
},
"request_id": "playground_xxxx",
"evaluation_time_ms": 62.06931800011262
}
試してみて
九萬になるだろうと思っていましたが、日本語ではかろうじて九萬、英語では九索という結果になりました。
| 1位 | 九萬の確率 | confidence | |
|---|---|---|---|
| 日本語 | 九萬(0.21) | 0.21 | 0.15 |
| 英語 | 九索(0.45) | 0.14 | 0.41 |
日本語は正解していますが、九萬(0.21)・九索(0.19)・三索(0.19)・一索(0.17)がほぼ横並びで、迷った末にたまたま九萬になったような分布です。英語は逆に、九索をある程度自信を持って選んでいます。九索を切ると雀頭がなくなり聴牌も逃すので、麻雀としては明らかな悪手です。
なんでこうなったのかは、仮説を立ててみるとこんな感じかと思っています。
- 言語
- ドキュメント上は英語のほうが精度が高いはずですが、麻雀は日本語の用語や解説が多いので、日本語のほうが有利だった?
- 情報の渡し方
- 「九萬を切ると聴牌」と分かるには牌の組み合わせを数える必要があるので、直感で即答する Jev には難しいのかも。
- シャンテン数や受け入れ枚数もStateに入れるべきだったかも
- 局面・手牌・ツモ・目的など項目が多いので、Stateも文字列ではなくオブジェクト(JSON)で渡すべきだったかも。ドキュメントでも、ほとんどの場合は項目ごとに名前が付いて関係が分かりやすいオブジェクトが推奨されていました。
- 「九萬を切ると聴牌」と分かるには牌の組み合わせを数える必要があるので、直感で即答する Jev には難しいのかも。
1問しか試していないので、これだけで Jev が麻雀に弱いとは言えません。とはいえ、手牌をテキストにするだけで70ミリ秒ほどで牌ごとの確率が返ってくるのは手軽です。迷ったときにちょっと聞いてみる使い方は面白そうです。
この記事としてはここまでですが、次は計算済みの情報(シャンテン数や受け入れ枚数)なども入れつつ、まずは答えがはっきりしている問題で期待どおりの結果が出るか試してみようと思っています。



