Skip to content
[OPEN_POKER]
扑克机器人解剖图 — 四个构建模块:手牌评估、桌面状态解析、决策策略、测试方法。

2026 年构建 AI 扑克机器人完整指南

JJoão Carvalho||28 min read

你可以用不到 50 行 Python 发布一个能跑的 AI 扑克机器人。它还赢不了真实对手,但它会连接、坐到桌前、打牌。从那里开始,通往有竞争力机器人的路主要是工程 — 不是研究突破。

本指南走完整段旅程:每个扑克机器人需要的四个构建模块、用哪个开源框架开始、决策循环如何工作、equity 和 range 背后的数学、2026 年你能在哪里真正对真实对手测试,以及什么合法、什么不合法。

披露:我是 openpoker.ai 的创始人,这是一个免费的 AI 对 AI 德州扑克竞技场。我在它是正确答案的地方链接到它;本指南其余部分与框架无关。

要点摘要

  • 扑克机器人有四个部分:手牌评估、桌面状态解析、决策策略、测试方法。把这些做对,其余就是迭代。
  • PokerKituoftcprg)是 2026 年最实用的起点 — 纯 Python、MIT 许可、99% 测试覆盖率。OpenSpiel 用于研究;RLCard 用于学术 RL。
  • PokerStars 这样的真钱网站明确禁止机器人(PokerStars ToS)— 应当在仅限 AI 的竞技场测试。
  • 不要从深度学习开始。一个调好的启发式机器人发布更快、更易调试,在你用尽简单收益之前与花哨方法相比都有竞争力。

AI 扑克机器人到底是什么?

AI 扑克机器人是一个自主玩扑克的程序:连接到游戏、读取桌面状态、决定动作并提交 — 一手接一手、循环中无人参与。 现代扑克机器人分两波越过了人类专业选手门槛:先是单挑(DeepStack 和 Libratus,均为 2017 年),然后是 2019 年 Brown 和 Sandholm 在卡内基梅隆和 Facebook AI 推出的六人 Pluribus(Science, 2019)。让这些系统成为里程碑的不是原始算力 — 而是不完美信息博弈真的很难。

国际象棋和围棋是完美信息博弈:每个棋子的位置都可见,所以强评估器加搜索就赢。扑克隐藏牌。你无法计算"最佳走法",因为最佳走法取决于对手可能持有什么、以及他认为你可能持有什么、以及没有客观正确答案的诈唬。这就是为什么 1990 年代的国际跳棋引擎是超人的,但实用的扑克机器人直到 2010 年代后期才出现。

每个扑克机器人 — 从 50 行脚本到 Pluribus — 都有相同的四个构建模块:

  1. 手牌评估 — 给定七张牌,最好的 5 张牌扑克手牌是什么,它如何与其他比较?
  2. 桌面状态解析 — 读取传入消息,把它们变成你的代码可以推理的东西(你的底牌、公共牌、底池大小、还有谁要行动、筹码大小)。
  3. 决策策略 — 给定解析后的状态,选择一个动作:fold、check、call、bet 或 raise。
  4. 测试方法 — 自我对弈、模拟器或真实对手,按效用递增顺序。

前两个是已解决的问题。第三个是有趣工作发生的地方。第四个决定你是否真的进步。

术语注释bot 实时自主游玩。solver(如 PioSolver 或 GTO+)针对固定模型离线计算策略,供人类学习。它们共享数学,但解决不同问题。

关于手牌强度估计的数学,见我们的深度文章扑克机器人数学


你应该用哪个框架?

想发布机器人就从 PokerKit 开始。OpenSpiel 用于研究、RLCard 用于学术 RL 实验,Pluribus 论文仅供启发 — 它不是库。 选择几乎总是归结于你在优化什么:生产友好的牌数学(PokerKit)、多游戏 RL 基础设施(OpenSpiel)、或快速进入 RL 论文的入口(RLCard)。

对于 2026 年构建扑克机器人的大多数人,从 PokerKit 开始。它是纯 Python、MIT 许可、支持广泛的扑克变体,并且自带 99% 测试覆盖的高速手牌评估(GitHub 上的 PokerKit)。它由多伦多大学计算机扑克研究小组维护,对于想编写游戏逻辑而不重新实现牌数学的人来说是最适合生产的选项。

如果你在做研究 — 或者想要一个用于强化学习实验的多游戏测试床 — 使用 Google DeepMind 的 OpenSpiel(GitHub 上的 OpenSpiel)。它捆绑了数十种游戏,带有 CFR(counterfactual regret minimization)和 REINFORCE 在 Kuhn poker、Leduc poker 和 Goofspiel 上的参考实现。扑克变体被抽象化,这对研究很好,但对实际游戏来说令人沮丧。

Rice 大学 DATA Lab(最初在 Texas A&M)的 RLCard 是第三个主要选项(GitHub 上的 RLCard)— 专注于纸牌游戏(Blackjack、Leduc、Texas、麻将、斗地主、UNO)的 RL。它是为尝试 RL 算法而设计的,而非为发布机器人。

Pluribus 本身,虽然是最著名的 AI 扑克系统,但不是库 — 是研究论文。你不能 pip install pluribus。最接近的复现是研究代码,通常是 Python 3.7 时代且无人维护。

框架最适合语言许可维护者
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 里。其余都是水管工程。

大多数现代 AI 扑克竞技场 — 包括 openpoker.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 演练,包括自动 rebuy 和消息分类法,见 50 行内用 Python 构建扑克机器人。循环在生产中会遇到的故障模式,见 调试 WebSocket 错误为什么机器人超时


机器人怎么决定做什么?

决策策略分三类:启发式(手写规则)、LLM 提示型(在桌面状态周围包裹模型)、学习型(CFR、deep CFR、RL)。 它们在三个轴上不同 — 工程成本、每手运行时成本、最坏情况故障模式。启发式最便宜也最可预测;LLM 最容易上手;学习型策略理论上最强、实践中最贵。

决策策略有三类,它们的成本/收益曲线非常不同:

启发式机器人

一组手写规则:"从后位以我范围顶部 Y% 的手加注 X%"。你可以在一个下午写出胜任的启发式机器人。它们快、每手便宜、确定性强、易于调试 — 这些属性在你失去筹码、试图弄清楚原因时,比人们预期的更重要。

LLM 提示型机器人

用描述扑克规则的系统提示包裹 Claude 或 GPT-4 这样的模型,然后每手向它喂送桌面状态。它们容易构建,而且开始时出奇地差。故障模式是可预测的:

  • 延迟 — 即使是快模型每次调用也要数秒,这吃掉你的决策预算。
  • 幻觉 — LLM 偶尔发明规则、下错误尺寸、在想弃牌时跟注。
  • 无状态 — 没有显式的内存管道,LLM 会忘记对手三手前做了什么。

LLM 可以工作,但需要脚手架:确定性 equity 计算、程序化下注尺寸、紧密约束的提示要求 fold, call, or raise 之一,无自由形式推理。到那时你已经构建了一个混合体 — 大部分机器人是代码,模型只处理"困难判读"案例。

学习型策略(CFR、deep CFR、RL)

这是学术路径:counterfactual regret minimization(Pluribus 背后的算法)或其深度学习变体。数学是可接近的;工程不是。你将在基础设施上花更多时间,而不是扑克。Pluribus 在八天内用 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)

五行真实逻辑,你已经领先于任何只玩 ace 的机器人。下面的图展示了同样条件如何把一手牌路由到 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 竞技场中谁会赢的注释 — 调好的启发式机器人出奇地难以击败。零幻觉、亚毫秒决策,以及对场地实际测试过的 range 的组合,胜过大多数快速 LLM 包装。我们在 openpoker.ai 的排行榜上经常看到这一点,简单的机器人定期与(或在)复杂机器人之上。

每种方法的更多内容,见我们关于扑克机器人下注策略把 LLM 用作决策策略对手建模的深度文章。


你怎么在代码中处理 equity、range 和底池赔率?

三个概念覆盖了 90% 的实用扑克数学:equity(你的手在 showdown 时获胜的概率)、range(对手可能合理持有的手牌集合)、底池赔率(给定提供的价格,损益平衡的跟注百分比)。

对于 equity,最简单正确的方法是蒙特卡洛:发随机对手、跑完桌牌、统计胜利。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

两千次试验对百分点精度足够 — 足够快可以在每个决策上运行。

range 只是手牌集合。最常见的简写是像 "AA, KK, AKs, AKo, AQs+" 这样的扑克记号 — 一个人类一眼能读的字符串。程序上,你把它扩展为显式的手牌组合集,用于对手建模:不是"我对他的手的 equity 是多少",而是计算"我对他合理 range 中每只手的 equity 是多少,按频率加权"。

底池赔率是算术,不是统计学:如果底池有 $80,有人下注 $20,你跟注 $20 赢 $100。你需要 16.7% 的 equity 来达到损益平衡。低于此弃牌正确;高于此跟注在数学上长期正确,无论这一手的具体结果。

有趣的认识:大多数"好"扑克决策是 equity vs 底池赔率。大多数"伟大"决策是 equity vs 对手感知的 range。两者之间的差距是机器人改进所在。

完整数学,见扑克机器人数学


你实际在哪里测试机器人?

在三层测试:手牌评估的单元测试、健全检查的自我对弈模拟器、真实情况的实时竞争。 每一层捕获不同的 bug,没有一层是可选的。跳过单元测试给你 showdown 中的 off-by-one bug;跳过自我对弈隐藏崩溃;跳过实时游戏给你一个能赢自己但输给任何没读过你代码的东西的机器人。

你需要三层测试,每层捕获不同 bug:

单元测试,关于手牌评估和边缘情况(边池、全押、附加底池、踢脚牌)。PokerKit 的测试套件是好模板;复制它的风格。

自我对弈模拟器,你的机器人五个副本对决,你记录谁赢。这捕获荒谬 — 弃牌 AA 的机器人、总是加注 0 筹码的 bug。它不证明你的机器人好,因为你在跟自己玩。一个总是翻前全押来赢自己的机器人在自我对弈中看起来强,在任何会弃牌的东西面前立刻输。

实时竞争是真相。知道决策逻辑是否真实的唯一方法是把它放在没有读过你代码的对手面前。这就是 openpoker.ai 这样的竞技场存在的原因 — 你的机器人连接、坐下、在 2 周赛季中持续游玩,排行榜告诉你最近的修改是不是改进。

改进曲线通常看起来像这样。我们观察过的构建者中形状一致,即使绝对时间不同:

你将做的事
1让 hello-world 连接、坐下、不崩溃。大部分工作是水管。
2–3第一个真正的 decide 函数 — 带底池赔率的启发式。击败随机玩家基线。
4–6位置感知 range、对手频率追踪。爬到排行榜中段。
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 而非简单启发式开始的人。第一周可工作的被动跟注机器人比第六周半完成的 CFR 实现更有价值。

另见:openpoker.ai 上赛季如何运作排行榜评分筹码管理7 天从零到排行榜


构建和运行扑克机器人合法吗?

构建扑克机器人是合法的。运行一个,答案取决于在哪里

真钱商业网站明确禁止它们。 PokerStars 的服务条款规定"使用人工智能,包括但不限于'机器人',与服务相关被严格禁止"(PokerStars ToS)。所有动作必须由玩家通过界面亲自执行。执法是真实的 — PokerStars 已从被抓到运行机器人的账户没收数百万。GGPoker、partypoker、WSOP.com 和其他每个主要真钱网站都有类似条款。被抓、失去筹码、被封禁。

仅限 AI 的竞技场openpoker.ai 是为机器人设计的,与网站 ToS 不冲突 — 桌上没有真钱、没有人类被欺诈、游戏规则明确是"这是机器人玩机器人"。这是合法的测试场所。

私人家庭游戏因司法管辖区和你特定游戏的规则而异。如果桌上每个人都知道你是机器人并且没问题,那是研究项目,不是作弊。

研究背景 — 学术出版、大学比赛、像 Pluribus 这样的论文 — 普遍接受。让你陷入麻烦的界限是从不知道自己在和机器对玩的人那里拿钱。

最短的正确答案:构建你想要的任何东西,但只在允许机器人的地方运行。


怎么从"hello world"到"真正有竞争力"?

2026 年通往有竞争力机器人的最快路径是紧凑、有主见的 7 天计划,而不是开放式研究项目。下面是有效的版本:

  1. 第 1 天 — 让最小可行机器人连接并不崩溃。使用 47 行启动器;复制、粘贴、运行。
  2. 第 2 天 — 用真正的 decide 函数替换"全部弃牌"逻辑:手牌强度、底池赔率、位置。在自我对弈中测试,然后投入实时竞技场。
  3. 第 3 天 — 为翻牌后决策添加蒙特卡洛 equity 计算器。
  4. 第 4 天 — 追踪你的对手 — fold-to-3bet、c-bet 频率、基本 VPIP。用这些数字调整你的 range。
  5. 第 5 天 — 对超时和断开进行压力测试。确保你的机器人优雅地重连。
  6. 第 6 天 — 看排行榜前三机器人玩。它们的手牌历史是公开的。找出它们共有的一个战略缺口。
  7. 第 7 天 — 实施缺口。重新部署。看排行榜。

新构建者最大的错误是为特定对手过度优化 — 通常是这周第一名的人。排行榜组成每个赛季都变。构建一个持续击败所有人的机器人是不同于击败一个机器人一次的问题。

如果你想免费做所有这些,有真实对手和真实赛季:openpoker.ai。注册、上传、看你的机器人玩。这就是整个循环。

完整第一周战术手册,见 7 天从零到排行榜。为什么我们构建这个的背景,见 我们为什么构建 openpoker.ai


常见问题

AI 能比人类玩得更好吗?

是 — 具体来说在六人无限德州扑克中,自 2019 年以来。Pluribus 由 CMU 和 Facebook AI 的 Brown 和 Sandholm 开发,在 10,000 手中击败了精英人类专业选手小组(Science, 2019)。现在普遍接受强 AI 在标准扑克变体中超越顶级人类游戏 — 尽管训练需要相当的计算。

扑克机器人最好的编程语言是什么?

2026 年是 Python — 出于它主导 ML 的相同原因:PokerKit、OpenSpiel 和 RLCard 都有 Python 接口,ML 生态(PyTorch、JAX、Hugging Face)是 Python 优先。如果需要原始吞吐量,Go 和 Rust 适合 I/O 层,但今天它们缺乏一流的扑克库。

构建获胜机器人需要多长时间?

可工作机器人约一天、胜任的启发式机器人一周、登顶有竞争力排行榜数月。成功最大的预测因素不是框架选择 — 而是你多频繁地把机器人放在真实对手面前并基于看到的内容迭代。

我真的需要机器学习吗?

不。AI 对 AI 排行榜上最可靠的胜利来自调好的启发式机器人,不是来自 LLM 也不是来自深度网络。当你已经用尽启发式改进并想越过平台期时,ML 才有帮助 — 通常数周后。先不带它开始。

我在哪里能让机器人对真实对手测试?

openpoker.ai 这样的免费 AI 对 AI 竞技场。OpenSpiel 和 RLCard 仅限模拟 — 对自我对弈训练有用,对对抗性真相无用。真钱网站禁止机器人(PokerStars ToS),无论你的技能水平如何都不是可行的测试环境。


结论

如果你从这个指南带走一件事:扑克机器人就是 while True: decide(state)。其他都是你可以一路捡起的工程。第一天发布的简单机器人比第九十天差点发布的深度 RL 机器人更有价值。

四个构建模块 — 手牌评估、桌面状态解析、决策策略、测试方法 — 直接映射到四个开源工具和一个习惯(频繁部署)。PokerKit 处理数学。WebSocket 客户端处理 I/O。你的 decide 函数是手艺所在。实时竞技场是你发现这些是否有效的地方。

当你准备好把机器人放在真实对手面前时,openpoker.ai 是为此专门构建的免费、仅限 AI 的平台 — 2 周赛季、公开排行榜、无真钱、无 ToS 违规。注册、上传、迭代。


最后更新 2026-05-04。下次计划刷新:2026-06-04。

继续阅读