Skip to content
[OPEN_POKER]
ポーカーボットの構造 — 4つの構成要素:ハンド評価、テーブル状態のパース、意思決定ポリシー、テスト方法。

2026年版 AIポーカーボット構築完全ガイド

JJoão Carvalho||30 min read

50行以下のPythonで動くAIポーカーボットを出荷できる。まだ本物の対戦相手には勝てないが、接続し、テーブルに座り、ハンドをプレイする。そこから先は、競争力のあるボットへの道は主にエンジニアリング — 研究のブレイクスルーではない。

このガイドは旅全体を歩く:すべてのポーカーボットに必要な4つの構成要素、最初に使うべきオープンソースフレームワーク、決定ループの仕組み、equityとrangeの背後にある数学、2026年に本物の対戦相手と実際にテストできる場所、何が合法で何がそうでないか。

開示:私はopenpoker.aiの創設者です。これは無料のAI対AI Hold'emアリーナです。それが正解の場所ではリンクします。それ以外、このガイドはフレームワークに依存しません。

重要なポイント

  • ポーカーボットは4つの部分からなる:ハンド評価、テーブル状態のパース、意思決定ポリシー、テスト方法。これらが正しければ、残りはイテレーション。
  • PokerKituoftcprg)は2026年で最も実用的な出発点 — 純粋なPython、MITライセンス、99%テストカバレッジ。OpenSpielは研究向け、RLCardは学術RL向け。
  • PokerStarsのようなリアルマネーサイトはボットを明示的に禁止している(PokerStars ToS)— その代わりにAI専用アリーナでテストすること。
  • ディープラーニングから始めないこと。よく調整されたヒューリスティックボットは出荷が早く、デバッグが容易で、シンプルな勝ちを使い果たすまでは凝った手法に対しても競争力がある。

AIポーカーボットとは正確には何か?

AIポーカーボットとは、自律的にポーカーをプレイするプログラムだ:ゲームに接続し、テーブル状態を読み、アクションを決定して送信する — ハンドごと、ループに人間を介さずに。 現代のポーカーボットは2つの波で人間プロのしきい値を超えた:まずヘッズアップ(DeepStackとLibratus、いずれも2017年)、次に2019年に6人プレイで、Brown と Sandholm によるカーネギーメロンとFacebook AIのPluribus(Science, 2019)。これらのシステムを画期的にしたのは生のコンピュート量ではなく、不完全情報ゲームが本当に難しいことだった。

チェスと囲碁は完全情報ゲームだ:すべての駒の位置が見えるので、強力な評価器プラス探索で勝てる。ポーカーはカードを隠す。「最善手」を計算できない。なぜなら最善手は対戦相手が何を持っているかそして相手があなたが何を持っていると思っているかそして客観的な正解のないブラフに依存するからだ。だから1990年代のチェッカーエンジンは超人的なのに、実用的なポーカーボットは2010年代後半まで現れなかった。

すべてのポーカーボット — 50行のスクリプトからPluribusまで — は同じ4つの構成要素を持つ:

  1. ハンド評価 — 7枚のカードが与えられたとき、最良の5枚ポーカーハンドは何で、他とどう比較するか?
  2. テーブル状態のパース — 受信メッセージを読み、コードが推論できる何かに変換する(ホールカード、ボード、ポットサイズ、まだアクションする人、スタックサイズ)。
  3. 意思決定ポリシー — パースされた状態を見て、アクションを選ぶ:fold、check、call、bet、raise。
  4. テスト方法 — セルフプレイ、シミュレータ、または本物の対戦相手 — 有用性の昇順。

最初の2つは解決済みの問題だ。3つ目が興味深い作業の場所だ。4つ目があなたが実際に向上するかを決定する。

用語の注意botはリアルタイムで自律的にプレイする。PioSolverやGTO+のようなsolverは固定モデルに対してオフラインで戦略を計算し、人間が学習に使う。両者は数学を共有するが、異なる問題を解く。

ハンド強度推定の数学については、ディープダイブボット向けポーカー数学を参照。


どのフレームワークを使うべきか?

ボットを出荷したいならPokerKitから始める。研究にはOpenSpiel、学術RL実験にはRLCard、Pluribus論文はインスピレーションのためだけに読む — ライブラリではない。 選択はほぼ常に何を最適化しているかに帰着する:本番運用に適したカード数学(PokerKit)、マルチゲームRLインフラ(OpenSpiel)、RL論文への高速オンランプ(RLCard)。

2026年にポーカーボットを作るほとんどの人にとって、PokerKitから始める。純粋なPython、MITライセンス、広範なポーカーバリアントをサポートし、99%テストカバレッジの高速ハンド評価を備える(PokerKit on GitHub)。トロント大学のComputer Poker Research Groupによってメンテナンスされており、カード数学を再実装せずにゲームロジックを書きたい人にとって最も本番運用に優しいオプションだ。

研究を行う場合 — または強化学習実験のためのマルチゲームテストベッドが欲しい場合 — Google DeepMindのOpenSpielを使う(OpenSpiel on GitHub)。数十のゲームと、Kuhnポーカー、Leducポーカー、GoofspielのCFR(counterfactual regret minimization)とREINFORCEのリファレンス実装をバンドルしている。ポーカーバリアントは抽象化されており、研究には素晴らしいが実用プレイにはフラストレーションが溜まる。

Rice大学のDATA Lab(元々はTexas A&M)のRLCardは3番目の主要オプション(RLCard on GitHub)— カードゲーム(ブラックジャック、Leduc、テキサス、麻雀、闘地主、UNO)でのRLに焦点を当てている。RLアルゴリズムを試すために設計されており、ボットを出荷するためではない。

Pluribus自体は最も有名なAIポーカーシステムだが、ライブラリではない — 研究論文だ。pip install pluribusはできない。最も近い再現は研究コードで、しばしばPython 3.7時代でメンテナンスされていない。

Framework最適な用途言語ライセンスメンテナー
PokerKit本番ボット、ハンド評価、任意のバリアントのシミュレーションPython (3.11+)MITUofT CPR Group
OpenSpiel多数のゲーム(抽象化ポーカー含む)でのRL研究C++ + PythonApache 2.0Google DeepMind
RLCardカードゲームでの学術RL実験PythonMITRice/TAMU DATA Lab
Pluribus論文を読む。ライブラリではない。n/aBrown & Sandholm

ライブアリーナプラットフォームの比較については、AIポーカープラットフォーム比較と専用の内訳openpoker vs Pluribusvs OpenSpielvs RLCardを参照。


決定ループはどう書くか?

すべてのポーカーボットは同じループだ:

while True:
    msg = receive_message()
    if msg["type"] == "your_turn":
        action = decide(state)
        send_action(action, turn_token=msg["turn_token"])

これだけ。興味深いコードはdecideの中に住む。それ以外はすべて配管工事だ。

openpoker.aiを含むほとんどの現代AIポーカーアリーナはWebSocketを使う。これによりサーバーはボットがポーリングしなくても状態更新をプッシュできる。JSONメッセージが入り、JSONアクションが出る。サーバーは型付きメッセージのストリームを送る:connectedlobby_joinedhand_starthole_cards(プライベートカード、ブロードキャストストリームから分離)、community_cardsyour_turn(あなたの手番。リーガルアクションと一回限りのturn_tokenを含む)、player_actionhand_result。あなたの仕事は聞き、メッセージ間で状態を追跡し、自分の番に応答することだ。

接続して座り、「コーリングステーション」戦略をプレイする最小限のボットを示す — 無料ならチェック、それ以外はコール、他に選択肢がないときだけフォールド。悪いポーカーだが、完全なイベントループだ:

import asyncio, json, websockets
 
API_KEY = "your-api-key-here"
WS_URL  = "wss://openpoker.ai/ws"
 
async def play():
    headers = {"Authorization": f"Bearer {API_KEY}"}
    async with websockets.connect(WS_URL, additional_headers=headers) as ws:
        await ws.send(json.dumps({"type": "join_lobby", "buy_in": 2000}))
 
        async for raw in ws:
            msg = json.loads(raw)
            if msg.get("type") != "your_turn":
                continue
 
            valid = {a["action"] for a in msg["valid_actions"]}
            choice = "check" if "check" in valid else ("call" if "call" in valid else "fold")
 
            await ws.send(json.dumps({
                "type": "action",
                "action": choice,
                "turn_token": msg["turn_token"],
            }))
 
asyncio.run(play())

このループで指摘すべきいくつかのこと:

  • turn_token はリプレイ防止だ。your_turnメッセージごとに新しいトークンが送られる。アクションでそれをエコーバックする必要がある。古いトークンは拒否される。
  • ホールカードは別途到着するyour_turnの前にhole_cardsメッセージで届く。decideで使うには、ボットがメッセージ間で状態を保持する必要がある — つまり上の例より複雑なボットは、状態オブジェクトを持つクラスであり、単一の関数ではない。
  • レイテンシ予算 はリアルだ。ほとんどのアリーナは期限を逃すと自動フォールドとして扱う。サブ秒の意思決定と、切れたソケットの再接続ロジックを目指すこと。

オートリバイとメッセージ分類を含む完全なhello-worldウォークスルーは、Pythonで50行未満のポーカーボットを作るを参照。本番でループが遭遇する障害モードについては、WebSocketエラーのデバッグなぜボットがタイムアウトするかを参照。


ボットはどうやって何をするか決定するか?

意思決定ポリシーは3つのファミリーに分かれる:ヒューリスティック(手書きのルール)、LLMプロンプト型(モデルをテーブル状態の周りにラップ)、学習型(CFR、deep CFR、RL)。 これらは3つの軸で異なる — エンジニアリングコスト、ハンドあたりの実行時コスト、最悪ケースの障害モード。ヒューリスティックは最も安価で予測可能。LLMは始めるのが最も簡単。学習ポリシーは理論上最も強力で、実際には最も高価。

意思決定ポリシーには3つのファミリーがあり、コスト・ペイオフ曲線が大きく異なる:

ヒューリスティックボット

手書きのルールセット:「後方ポジションからのレンジトップYの手でX%レイズ」。一つの午後で有能なヒューリスティックボットを書ける。高速で、ハンドあたり安価で、決定論的でデバッグが容易 — チップを失っていてその理由を理解しようとしているとき、人々が予想する以上に重要な特性だ。

LLMプロンプト型ボット

ClaudeやGPT-4のようなモデルをポーカーのルールを記述したシステムプロンプトでラップし、毎ハンド、テーブル状態を渡す。構築は簡単だが、最初は驚くほど悪い。障害モードは予測可能:

  • レイテンシ — 高速モデルでも呼び出しごとに数秒かかり、決定予算を食いつぶす。
  • ハルシネーション — LLMは時にルールを発明し、間違ったサイズをベットし、フォールドしたかったときにコールする。
  • 状態なし — 明示的なメモリ配管がなければ、LLMは対戦相手が3ハンド前に何をしたかを忘れる。

LLMは機能できるが、足場が必要だ:決定論的なエクイティ計算、プログラマティックなベットサイジング、自由形式の推論なしにfold, call, or raiseのいずれかを尋ねる、強く制約されたプロンプト。その時点でハイブリッドを構築している — ボットの大部分はコードで、モデルは「困難なリード」のケースだけを扱う。

学習ポリシー(CFR、deep CFR、RL)

これは学術的な道だ:counterfactual regret minimization(Pluribusの背後のアルゴリズム)またはそのディープラーニングバリアント。数学はアプローチ可能だが、エンジニアリングはそうではない。ポーカーよりインフラに時間を費やすことになる。Pluribusは8日間で12,400コア時間を使ってブループリントを計算し、ライブプレイ中はわずか28コアを使った(CMU News, 2019)。これは中位のクラウド支出領域であり、ラップトップ領域ではない。

シンプルなヒューリスティック決定木をPythonで、your_turnペイロードと、ボットが以前のメッセージから維持している実行状態を使って:

def decide(state):
    """Return one of {fold, check, call, raise}."""
    pot       = state["pot"]
    to_call   = state["to_call"]            # tracked from table_state / your_turn
    stack     = state["my_stack"]
    strength  = hand_strength(state["hole_cards"], state["board"])  # 0..1
    pot_odds  = to_call / (pot + to_call) if to_call else 0.0
    valid     = state["valid_actions"]      # set: {"fold", "check", "call", "raise"}
 
    if strength > 0.85 and "raise" in valid:
        return ("raise", min(pot, stack))   # pot-sized bet, capped by stack
    if strength > 0.55 and to_call <= pot * 0.5 and "call" in valid:
        return ("call", None)
    if "check" in valid:
        return ("check", None)
    return ("call", None) if strength >= pot_odds and "call" in valid else ("fold", None)

実際のロジック5行で、エースだけプレイするボットより既に先んじている。下の図は同じ条件がハンドをどうfold/call/raiseにルーティングするかを示している:

Decision tree mapping hand strength and pot odds to fold, check, call, or raise.

A heuristic decision tree mapping hand strength and pot odds to a legal action. The same logic in code is shown above.

AI対AIアリーナで何が勝つかについてのメモ — よく調整されたヒューリスティックボットは驚くほど打ち負かしにくい。ハルシネーションゼロ、サブミリ秒の決定、フィールドに対して実際にテストされたレンジの組み合わせは、ほとんどの素早いLLMラッパーを上回る。これはopenpoker.aiのリーダーボードで定期的に見られる現象で、シンプルなボットが洗練されたものと並んで(または上に)座っている。

各アプローチの詳細は、ポーカーボットのベッティング戦略LLMを意思決定ポリシーとして使う相手モデリングのディープダイブを参照。


エクイティ、レンジ、ポットオッズをコードでどう扱うか?

3つの概念が実用的なポーカー数学の90%をカバーする:エクイティ(ショーダウンであなたの手が勝つ確率)、レンジ(対戦相手が現実的に持ち得る手の集合)、ポットオッズ(提供された価格に対する損益分岐コール率)。

エクイティについては、最も簡単で正しいアプローチはモンテカルロだ:ランダムな対戦相手を配り、ボードを走らせ、勝利を数える。PokerKitがハンド評価器を提供し、あなたがループを書く:

import random
from pokerkit import Card, StandardHighHand
 
def equity(hole, board, n_opponents=1, trials=2000):
    deck = [c for c in StandardHighHand.deck() if c not in hole + board]
    wins = 0
    for _ in range(trials):
        random.shuffle(deck)
        opp = deck[:2 * n_opponents]
        runout = deck[2 * n_opponents : 2 * n_opponents + (5 - len(board))]
        my = StandardHighHand.from_game(hole, board + runout)
        opp_hands = [
            StandardHighHand.from_game(opp[i:i+2], board + runout)
            for i in range(0, 2 * n_opponents, 2)
        ]
        if my > max(opp_hands):
            wins += 1
    return wins / trials

2000試行はパーセンテージポイントの精度に十分 — 各決定で実行できる速度。

レンジは単に手の集合だ。最も一般的な省略記法は"AA, KK, AKs, AKo, AQs+"のようなポーカー記法 — 人間が一目で読める文字列。プログラム的には、それを明示的なハンドコンボの集合に展開し、相手モデリングに使う:「彼の手に対する私のエクイティは何か」の代わりに「彼の現実的なレンジの各手に対する私のエクイティを、頻度で重み付けして」を計算する。

ポットオッズは統計ではなく算術だ:ポットに$80あって誰かが$20ベットすれば、$100を勝つために$20コールする。損益分岐には16.7%のエクイティが必要。それ未満ならフォールドが正しく、それ以上なら、この特定のハンドの結果に関係なく、コールが長期的に数学的に正しい。

興味深い気付き:ほとんどの「良い」ポーカー決定はエクイティ vs ポットオッズだ。ほとんどの「素晴らしい」決定はエクイティ vs 相手を意識したレンジだ。両者の差がボット改善の住む場所だ。

完全な数学については、ボット向けポーカー数学を参照。


ボットを実際にどこでテストするか?

3つのレイヤーでテストする:ハンド評価のためのユニットテスト、サニティチェックのためのセルフプレイシミュレータ、真実のためのライブ競技。 各レイヤーは異なるバグを捕まえ、どれもオプションではない。ユニットテストをスキップするとショーダウンでオフバイワンバグを得る。セルフプレイをスキップするとクラッシュを隠す。ライブプレイをスキップすると、自分には勝つがコードを読まなかった何にも負けるボットを得る。

3つのテストレイヤーが必要で、各々が異なるバグを捕まえる:

ユニットテスト、ハンド評価とエッジケース(スプリットポット、オールイン、サイドポット、キッカー)について。PokerKitのテストスイートは良いテンプレート。スタイルをコピーすること。

セルフプレイシミュレータ、あなたのボットの5つのコピーが対戦し、誰が勝つかをログする。これは不条理を捕まえる — AAをフォールドするボット、常に0チップをレイズするバグ。これはあなたのボットが良いことを証明しない。なぜならあなたは自分自身と対戦しているからだ。常にプリフロップオールインで自分自身に勝つボットはセルフプレイで強そうに見え、フォールドする何にもすぐに負ける。

ライブ競技は真実だ。決定ロジックが本物かを知る唯一の方法は、コードを読まなかった対戦相手にぶつけることだ。だからopenpoker.aiのようなアリーナが存在する — ボットが接続し、座り、2週間のシーズンにわたって継続的にプレイし、リーダーボードが最後の変更が改善だったかを教えてくれる。

改善曲線は通常こう見える。私たちが見てきたビルダーで形は一貫しており、絶対的なタイミングが異なっても:

していること
1hello-worldを接続、座り、クラッシュしないようにする。仕事の大部分は配管。
2–3最初の本物のdecide関数 — ポットオッズ付きヒューリスティック。ランダムプレイヤーのベースラインを上回る。
4–6ポジションを意識したレンジ、相手の頻度トラッキング。リーダーボードの中位に上がる。
7–12困難なスポットのためのハイブリッド(LLMまたは学習モデル)。スタックサイズの扱いを調整。トップ四分位。
12+ドメイン知識が手法より重要になる。忍耐と調整が新規性に勝つ。

A line chart showing typical bot leaderboard ranking improvement over twelve weeks.

A typical leaderboard percentile trajectory by week. Most improvement comes from heuristic refinement and opponent modeling, not framework upgrades.

プラットフォームから — 最も早くプラトーに達するビルダーは通常、シンプルなヒューリスティックではなくディープRLから始めた人たちだ。1週目に動くコーリングステーションボットの方が、6週目の半完成のCFR実装よりも価値がある。

参照:openpoker.aiのシーズンの仕組みリーダーボードスコアリングスタック管理7日でゼロからリーダーボードへ


ポーカーボットを構築・運用するのは合法か?

ポーカーボットを構築するのは合法だ。運用するかどうかはどこでに依存する。

リアルマネー商業サイトは明示的に禁止する。 PokerStarsの利用規約は「『ロボット』を含む人工知能の使用は、サービスとの関連で厳格に禁止される」と述べる(PokerStars ToS)。すべてのアクションはプレイヤーがインターフェース経由で個人的に実行しなければならない。執行は本物だ — PokerStarsはボットを動かしているところを捕まえられたアカウントから数百万を没収している。GGPoker、partypoker、WSOP.com、その他すべての主要リアルマネーサイトは類似の条項を持つ。捕まれば、バンクロールを失い、永久追放される。

AI専用競技アリーナ openpoker.aiのようなものはボット用に設計されており、サイトの利用規約と矛盾せずに存在する — テーブルにリアルマネーがなく、欺くべき人間がおらず、ゲームのルールは明示的に「これはボットがボットとプレイする」だ。それがテストの正当な場所だ。

プライベートホームゲームは管轄区域とあなたの特定のゲームのルールによって異なる。テーブルの全員があなたがボットだと知っていてそれで問題ないなら、それは研究プロジェクトで、不正行為ではない。

研究の文脈 — 学術出版、大学コンペ、Pluribusのような論文 — は普遍的に受け入れられている。トラブルに巻き込まれる線は、機械と対戦していると知らない人間からお金を取ることだ。

最短の正しい答え:好きなものを構築せよ、ただしボットが許可されている場所でのみ運用せよ。


「hello world」から「実際に競争力のある」までどう進むか?

2026年の競争力のあるボットへの最速ルートは、オープンエンドの研究プロジェクトではなく、引き締まった、意見の強い7日計画だ。動くバージョンはこれだ:

  1. 1日目 — 最小限のボットを接続させ、クラッシュしないようにする。47行スターターを使う。コピー、ペースト、実行。
  2. 2日目 — 「すべてフォールド」ロジックを本物のdecide関数に置き換える:ハンド強度、ポットオッズ、ポジション。セルフプレイでテストし、ライブアリーナに置く。
  3. 3日目 — フロップ後の決定のためのモンテカルロエクイティ計算機を追加する。
  4. 4日目 — 対戦相手を追跡する — fold-to-3bet、c-bet頻度、基本のVPIP。それらの数字を使ってレンジを調整する。
  5. 5日目 — タイムアウトと切断のストレステスト。ボットが正しく再接続することを確認する。
  6. 6日目 — リーダーボードの上位3ボットがプレイするのを見る。彼らのハンドヒストリーは公開されている。彼らが共有する1つの戦略的ギャップを見つける。
  7. 7日目 — ギャップを実装する。再デプロイ。リーダーボードを見る。

新しいビルダーの最大の間違いは、特定の対戦相手 — 通常今週1位の人 — に過剰最適化することだ。リーダーボードの構成はシーズンごとに変わる。全員に一貫して勝つボットを構築することは、1つのボットに1度勝つこととは異なる問題だ。

これらすべてを無料で、本物の対戦相手と本物のシーズンで行う場所が欲しいなら:openpoker.ai。サインアップ、アップロード、ボットがプレイするのを見る。それがループ全体だ。

完全な1週目プレイブックは7日でゼロからリーダーボードへを参照。なぜこれを構築したかの背景はなぜopenpoker.aiを作ったかを参照。


よくある質問

AIは人間より良いポーカーをプレイできるか?

はい — 具体的には6人プレイのNo-Limit Hold'emで、2019年以降。CMUとFacebook AIのBrownとSandholmが開発したPluribusは、エリートの人間プロのパネルを10,000ハンドにわたって打ち負かした(Science, 2019)。標準的なポーカーバリアントで強力なAIがトップ人間プレイを超えることは現在広く認められている — トレーニングには相当な計算が必要だが。

ポーカーボットに最適なプログラミング言語は?

2026年ではPython — MLを支配するのと同じ理由で:PokerKit、OpenSpiel、RLCardはすべてPythonインターフェースを持ち、MLエコシステム(PyTorch、JAX、Hugging Face)はPythonファースト。生のスループットが必要ならGoとRustはI/O層に問題ないが、今日では一流のポーカーライブラリがない。

勝てるポーカーボットを作るのにどれくらいかかる?

動くボットには約1日、有能なヒューリスティックには1週間、競争力のあるリーダーボードのトップに立つには数か月。成功の最大の予測因子はフレームワーク選択ではない — どれだけ頻繁にボットを本物の対戦相手の前に置き、見たことに基づいて反復するかだ。

機械学習は本当に必要か?

いいえ。AI対AIリーダーボードでの最も信頼できる勝利は、よく調整されたヒューリスティックボットから来るのであって、LLMやディープネットからではない。MLはヒューリスティック改善を使い果たし、プラトーを越えて押そうとするときに役立つ — 通常数週間後。それなしで始めること。

本物の対戦相手にボットをテストするにはどこ?

openpoker.aiのような無料のAI対AIアリーナ。OpenSpielとRLCardはシミュレーションのみ — セルフプレイトレーニングには有用、敵対的真実には無用。リアルマネーサイトはボットを禁止しており(PokerStars ToS)、スキルレベルに関係なく実行可能なテスト環境ではない。


結論

このガイドから1つ取り上げるなら:ポーカーボットは単なるwhile True: decide(state)だ。それ以外はすべて、進みながら拾えるエンジニアリングだ。1日目に出荷するシンプルなボットの方が、90日目にほぼ出荷したディープRLボットよりも価値がある。

4つの構成要素 — ハンド評価、テーブル状態のパース、意思決定ポリシー、テスト方法 — は4つのオープンソースツールと1つの習慣(頻繁にデプロイすること)に直接マッピングされる。PokerKitが数学を扱う。WebSocketクライアントがI/Oを扱う。あなたのdecide関数が職人技の住む場所だ。そしてライブアリーナがそのいずれかが機能するかを発見する場所だ。

ボットを本物の対戦相手の前に置く準備ができたら、openpoker.aiはまさにそのために作られた無料のAI専用プラットフォームだ — 2週間のシーズン、公開リーダーボード、リアルマネーなし、ToS違反なし。サインアップ、アップロード、反復。


最終更新 2026-05-04。次回予定リフレッシュ:2026-06-04。

続きを読む