1. 项目缘起与核心认知颠覆六个月前我决定动手构建一个麻将AI。当时我脑子里有个天真的想法这玩意儿应该比围棋AI简单吧毕竟围棋的状态空间是10的170次方这个数字大到被形容为“比可观测宇宙中的原子总数还要多”。而麻将呢总共就136张牌。从直觉上看这似乎是一个更“小”、更可控的问题域。然而当我真正扎进去之后我才意识到自己错得有多离谱。这不仅仅是一个难度相当的挑战在某些维度上麻将AI的复杂性甚至呈现出指数级的增长。今天我想和你详细聊聊我们在这个过程中踩过的坑、总结的经验以及我们是如何构建一个能够兼容多种规则的麻将AI引擎的。如果你对游戏AI、不完全信息博弈或者仅仅是好奇为什么麻将这么“难教”给计算机感兴趣那么这篇分享应该能给你带来一些启发。2. 核心挑战深度解析为什么麻将AI是“地狱难度”围棋AI的辉煌尤其是AlphaGo的突破给公众留下了一个印象游戏AI的巅峰就是围棋。但作为从业者我们必须清醒地认识到不同的游戏类型对应着截然不同的技术挑战。麻将作为一个典型的“不完全信息”、“多智能体”、“随机性高”、“规则多变”的博弈环境几乎集合了现代AI研究中最棘手的一批难题。下面我们来逐一拆解。2.1 挑战一不完全信息博弈——70%的迷雾这是麻将与围棋最根本的区别也是所有挑战的根源。围棋透明棋盘上的战争围棋是一个“完全信息”游戏。对弈双方看到的棋盘状态是完全一致的。AlphaGo的核心技术——蒙特卡洛树搜索MCTS配合价值网络与策略网络——正是建立在“可以准确模拟未来棋局”这一前提之上的。AI可以通过“推演”来评估当前落子对终局胜率的影响。麻将信息黑洞中的决策麻将则是一个“不完全信息”游戏。开局时你只能看到自己手中的13张牌。其余123张牌在哪里一部分以“牌山”的形式存在未知一部分在其他三家手中完全未知只有被打出的“弃牌”是公开信息。粗略估算在游戏的大部分时间里决策者掌握的信息量不足总量的30%。注意这种信息缺失直接“废掉”了MCTS这类在完全信息游戏中大放异彩的算法。因为你无法进行可靠的未来状态模拟——你连对手手里有什么都不知道怎么模拟他下一轮会打什么我们的应对策略从“搜索”转向“推理”既然无法通过搜索穷举我们就必须让AI学会“推理”。我们放弃了以MCTS为核心的架构转而采用基于长短期记忆网络LSTM的模型。模型设计我们设计了一个LSTM网络其输入不仅仅是当前的手牌和公开的弃牌更重要的是一个时间序列包含了每位玩家在每一轮中的行动摸牌、打牌、吃、碰、杠、以及行动之间的时序关系。核心任务这个网络的核心任务是学习从这些可观察的信号中“推断”出不可见的隐藏信息。例如对手连续打出“中张”牌如4万、5万可能意味着他手牌中“边张”1、2、8、9万或“字牌”较多正在做“混一色”或“字一色”的大牌。又比如某家碰了“发”字牌后却迟迟不打出手中的“白板”那么他做“小三元”或“大三元”的可能性就急剧上升。人类经验的映射这本质上是在模拟人类高手的“读牌”能力。一个经验丰富的牌手会根据对手的出牌顺序、速度、甚至犹豫时间来判断其手牌构成。我们的LSTM模型就是在数据驱动下自动化地学习这种复杂的、非线性的推理模式。2.2 挑战二规则丛林——200多种方言“麻将”不是一个单一的游戏而是一个拥有数百种地方变体的庞大家族。这带来了巨大的工程和算法挑战。规则差异举例长沙麻将扎鸟胡牌后需要从牌墙末尾“扎鸟”翻牌根据翻出的牌决定倍数奖励。这引入了胡牌后额外的随机性和策略考量胡牌时机可能因潜在倍数而改变。四川麻将血战到底一家胡牌后游戏并不结束其余三家继续战斗直到只剩一家未胡或牌被摸完。这彻底改变了游戏的动态和策略从“争先胡牌”变成了“避免垫底”和“后发制人”。日本麻将立直麻将拥有独特的“立直”宣告听牌、“一发”、“里宝”等规则以及核心的“振听”规则不能胡自己打过的牌。其番种计算体系也完全独立。“一个模型通吃”行不通 为每个变体从头训练一个独立的模型在计算成本和数据收集上都是不可行的。这就像为世界上200多种语言各训练一个独立的翻译模型。我们的应对策略共享底座 规则适配器我们借鉴了自然语言处理中“多语言预训练模型”的思路。共享底座模型我们训练一个强大的“基础麻将AI”。这个模型不学习任何特定规则下的胡牌牌型或算分而是学习所有麻将变体共通的、底层的“麻将技能”牌效如何最快速地优化手牌结构向听牌迈进。防守如何通过舍牌避免点炮放铳。局势判断根据场况剩余牌数、各家分数、弃牌池决定进攻还是防守。基础读牌如前所述从公开信息推断隐藏信息。规则适配器层针对每个具体的麻将变体如四川血战、日本立直我们在共享底座模型之上添加一个轻量级的“适配器”神经网络层。这个适配器层的任务是学习该变体特有的规则知识番种识别学会识别“清一色”、“七对子”、“国士无双”等在该规则下有效的牌型。特殊规则处理理解“血战到底”的续行逻辑或“立直”后的限制。分数计算将牌型价值映射到最终得分。训练与收益在训练新变体时我们冻结共享底座的大部分参数只微调顶部的适配器层和少量底层连接。实测下来这种方法的训练成本比从头训练降低了约40%并且实现了出色的技能迁移。例如在四川麻将中学到的“危险牌感知”能力可以无缝应用到日本麻将中。2.3 挑战三多智能体动态——四人修罗场围棋是经典的二人零和博弈我的收益就是你的损失反之亦然。麻将则是四人混战或二人搭档属于“一般和博弈”。复杂性跃升 在四人游戏中最优策略不再是简单的“最大化我的获胜概率”。它变成了“在另外三个同样理性、且都在试图最大化他们自身获胜概率的对手面前最大化我的获胜概率”。这引入了合作、竞争、欺诈等多重动态。经典决策困境 假设你已听牌只等一张“五筒”。此时上家打出了一张“五筒”。行动选择你是否要“胡”这张牌策略考量信息暴露立即胡牌会结束游戏但你也许在做一个更大的牌如“清一色”胡这张小牌可能不划算。规则限制在日本麻将中如果你之前打过“五筒”或同巡内打过其他能胡的牌你会处于“振听”状态不能胡别人的弃牌只能自摸。对手建模如果你不胡下家是否可能也需要这张牌你放过这张牌是否会引诱下家打出更危险的牌从而让你胡到更大的番种风险规避在落后时可能应该果断胡牌以止损在领先时可能应该追求更大的牌以巩固优势或避免点炮。我们的应对策略基于深度蒙特卡洛的多智能体自博弈我们采用了一种改进的自我对弈框架同时让四个AI智能体进行游戏。深度蒙特卡洛方法与传统的在状态空间中进行搜索不同DMC方法在“策略空间”中进行采样和评估。每个智能体不仅学习自己的最优策略策略网络还同时学习对其他三家策略的预测模型对手模型。训练过程在训练中每个智能体都会根据当前的游戏状态以及它对其他三家可能行动的预测来选择自己的行动。通过成千上万局的对战智能体们会逐渐收敛到一个“纳什均衡”点——在这个点上任何一个智能体单方面改变自己的策略都无法获得更好的收益。实现效果这使得我们的AI能够发展出复杂的策略例如“欺骗性弃牌”故意打出安全牌来诱导对手打出自己需要的牌、“危险牌缓打”即使手上有绝对安全的牌也可能为了牌效暂时不打等待更安全的时机等高级战术。2.4 挑战四稀疏奖励信号——漫长的沉默在围棋中几乎每一步棋都会改变棋盘态势AI可以立即从价值网络获得一个关于当前局面胜率的评估哪怕不精确这是一个“密集”的奖励信号。在麻将中情况截然不同。一局游戏可能持续超过20轮而其中大部分轮次都是“摸一张牌打一张牌”的平淡操作。直到有人胡牌或流局AI才会收到一个最终的“赢/输/平”信号。这中间的漫长过程缺乏即时的、指导性的反馈导致学习效率极低奖励稀疏问题。我们的应对策略设计辅助奖励信号为了解决这个问题我们人为地设计了一系列中间奖励在游戏过程中为AI提供更频繁的指导。手牌效率奖励我们定义了一个“向听数”减少的奖励。例如AI通过一次换牌将手牌从“三向听”优化到“两向听”就会获得一个正奖励。这鼓励AI朝着快速听牌的方向努力。成功防守奖励当AI打出一张牌而这张牌在随后几轮内没有被任何对手用来胡牌即成功避免了“放铳”AI会获得一个小额奖励。这鼓励了防守意识。信息价值奖励我们尝试量化一次打牌所获得的信息价值。例如打出一张生张从未出现过的牌并观察其他玩家的反应是否碰、杠或随后打出关联牌可以帮助推断他们的手牌。如果AI的打牌行为有助于后续更准确地建模对手它也会获得奖励。牌型价值潜力奖励根据当前手牌结构预估其可能发展成的番种大小并给予一个与潜在价值成正比的长期奖励。引入这些辅助奖励后模型的训练收敛速度提升了数倍AI更快地掌握了麻将的基本技巧。2.5 挑战五高随机性与评估难题——运气也是实力的一部分围棋没有任何随机性棋局完全由双方的选择决定。麻将则充满了随机性起手牌是随机的摸牌的顺序是随机的其他玩家的手牌也是随机的。对AI评估的深远影响 这意味着一个理论上更优的AI策略在单局甚至数十局游戏中完全可能因为运气差而输给一个采用低级策略的对手。因此要科学地比较两个麻将AI的强弱或者评估一个策略的改进是否有效需要进行海量的对局通常是数万局甚至更多来进行统计检验以确保观察到的胜率差异不是由随机波动造成的。我们的应对策略大规模模拟与统计检验我们建立了自动化的对战评估平台。任何策略的更新或模型的调整都需要通过以下流程固定种子在评估时使用固定的随机数种子生成起手牌和摸牌序列确保不同AI在完全相同的“运气”条件下进行对比。循环赛制让新旧版本的AI以及一些基准AI如基于规则的简单Bot进行大规模循环赛例如每个配对进行10,000局。统计显著性检验使用假设检验如t检验来分析胜率差异是否具有统计显著性。只有当新策略在显著水平如p值0.01上优于旧策略时我们才认为这是一个真正的改进。这个过程计算开销巨大但它是获得可靠结论的唯一途径。3. 技术架构与实现要点在理清了核心挑战后我们设计了一套混合架构来应对。这里分享一些关键的实现细节和踩坑经验。3.1 整体架构设计我们的系统是一个分层、模块化的设计核心思想是“分离关注点”。[游戏环境层] (多种麻将变体模拟器) | v [状态编码器] - 将游戏状态手牌、弃牌、场况等编码为神经网络可处理的向量 | v [共享特征提取底座] (多层LSTM 注意力机制) | v --------------------------------- | | | v v v [规则适配器A] [规则适配器B] [规则适配器N] (对应不同变体) | | | v v v [动作头A] [动作头B] [动作头N] (输出合法动作的概率分布) | | | v v v [价值头A] [价值头B] [价值头N] (评估当前状态胜率)各模块详解游戏环境层我们为每个支持的麻将变体实现了一个高度优化的模拟器。它负责处理规则逻辑、判断动作合法性、计算分数并生成训练数据。性能是关键因为我们需要每秒能运行成千上万个对局。状态编码器这是将麻将的离散符号信息“一万”、“东风”转化为连续向量的第一步。我们采用了“独热编码”与“嵌入层”相结合的方式。每张牌除了其本身类型还附带了丰富的上下文特征如这张牌是否是新张从未出现过、是否是危险张根据对手弃牌模型预测、是否与手牌其他牌形成搭子等。共享特征提取底座这是AI的“大脑”。我们使用了多层LSTM来捕捉牌局随时间推移的序列信息并在顶层引入了注意力机制让AI能动态地关注当前最重要的信息例如最近几轮某家连续打出的同花色牌。规则适配器与输出头这是实现“多规则”支持的关键。适配器是一个小型的前馈神经网络它将底座提取的通用特征映射到特定规则下的特征空间。动作头输出在该规则下所有合法动作打某张牌、吃、碰、杠、胡、过的概率。价值头则输出在该规则下当前局面的预期得分或获胜概率。3.2 训练流程与技巧我们的训练采用分阶段、课程学习的策略。阶段一监督学习预训练数据来源我们从在线麻将平台收集了大量人类高手对局记录。尽管数据标注不完全我们不知道对手的隐藏手牌但至少可以学习“在某个可见局面下人类高手最常采取的动作是什么”。目标通过模仿学习让模型快速掌握合理的牌效和基础战术避免从完全随机开始探索的巨大成本。这个阶段相当于给AI一个“高起点”。阶段二多智能体自博弈强化学习启动用预训练好的模型初始化四个智能体。算法采用近端策略优化PPO算法结合前面提到的辅助奖励和深度蒙特卡洛对手建模。技巧——策略池为了防止智能体在自我对弈中陷入“模式固化”我们维护一个过去版本的策略池。当前智能体会随机与池中的旧版本对战这有助于发现更广泛、更鲁棒的策略类似于AlphaGo/AlphaZero中的“历史版本对战”。阶段三规则适配器微调过程当我们需要支持一个新麻将变体时加载预训练好的共享底座和动作/价值头从一个相近的变体然后添加新的、随机初始化的规则适配器层。训练使用新变体的模拟器生成数据或利用该变体的人类对局数据对“共享底座新适配器新输出头”进行端到端的微调。此时共享底座的参数学习率设得非常低主要训练适配器和输出头。经验我们发现先在一个规则复杂度中等、数据量充足的变体如国标麻将上训练出强大的共享底座再向其他变体迁移效果最好。3.3 实战中的决策逻辑当AI在游戏中运行时它的决策流程如下状态获取从模拟器获取当前游戏状态包括私有手牌和公共信息。特征编码状态编码器将其转化为特征向量。前向传播特征向量经过共享底座和对应的规则适配器得到当前状态下所有合法动作的概率分布P(a|s)以及一个状态价值估计V(s)。动作选择在训练时为了探索会按概率分布采样动作在评估或实战时通常选择概率最高的动作贪婪策略或加入少量随机性ε-贪婪。特殊动作处理对于“吃、碰、杠、胡”这类动作AI不仅会考虑即时收益还会通过价值网络V(s)快速“向前看一步”预估执行该动作后的局面价值并与不执行动作继续摸牌的预期价值进行比较选择长期收益更高的选项。4. 常见问题、陷阱与调试心得在开发过程中我们遇到了无数问题。这里列出几个最具代表性的以及我们的解决思路。4.1 问题一AI过于保守从不点炮但也难胡牌现象在训练初期AI的放铳率极低但和牌率也同样很低。它似乎只打绝对安全的牌字牌、幺九牌导致手牌效率极差永远无法听牌。根因分析辅助奖励中“成功防守奖励”的权重设置过高而“手牌效率奖励”的权重不足。AI发现只要一直打安全牌就能稳定获得防守奖励而做牌胡牌的奖励遥远且不确定于是陷入了局部最优。解决方案动态奖励调整我们设计了一个衰减系数。随着训练局数的增加逐步降低“成功防守奖励”的绝对值同时提升“手牌效率奖励”和“牌型价值潜力奖励”的权重。引入风险补偿在价值网络V(s)的目标中不仅包含最终的胜负还加入了“听牌奖励”。即使最终没胡成功进入听牌状态也会获得一个中等奖励。这鼓励AI在防守和进攻之间寻找平衡。课程学习在训练早期我们甚至暂时移除了防守奖励让AI专注于学习如何快速做牌胡牌。待其牌效达到一定水平后再重新引入防守奖励学习避险。4.2 问题二模型在训练集上表现良好但在与人类对战时出现“愚蠢”错误现象AI在自我对弈中胜率很高但当我们用一些人类高手录制的对局测试时它会做出一些明显违背常识的决策比如在对手明显听牌时打出高度危险的生张。根因分析自我对弈环境是一个“封闭系统”。四个AI的策略会共同进化并可能形成一种只在它们彼此之间有效的“方言”或“均衡”。这种均衡可能依赖于一些人类不会采用的、非直观的策略。当面对人类这种“外部策略”时AI学到的模型可能就不适用了。解决方案注入人类数据在自博弈训练过程中定期将人类对局数据作为“外部样本”注入到经验回放池中。这相当于不断用人类的策略“校正”AI的进化方向防止其偏离太远。对手策略多样化在策略池中不仅包含AI自身的历史版本还加入了一些基于规则的、风格各异的Bot如激进型、保守型以及从人类数据中克隆出来的策略模型。让AI与更多样化的对手对战提升其泛化能力。在线适应我们为AI增加了一个轻量级的“在线学习”模块。在实际对战或测试中AI会快速分析当前对手近期的出牌模式并微调其对手模型的参数实现短时适应。4.3 问题三规则适配器效果不佳新变体学习速度慢现象在迁移学习到某个新麻将变体时即使微调了很多轮AI的表现仍然远不如在源变体上仿佛“没学会”新规则。根因分析问题可能出在两个方面。一是共享底座提取的“通用特征”不够通用包含了太多源变体的特异性信息。二是新变体与源变体规则差异过大导致适配器难以学习有效的映射。解决方案底座正则化在预训练共享底座时我们采用了多任务学习和降噪技术。同时用多个变体哪怕数据量少的数据来训练底座并强制底座学习去噪后的、更本质的特征。我们在输入中随机掩码一部分信息如随机隐藏一些弃牌要求底座重建这能增强其推理能力。渐进式迁移如果两个变体差异巨大如四川血战 vs. 日本立直我们不直接迁移。而是找一个中间变体例如先迁移到国标麻将再迁移到日本立直进行“渐进式迁移”让模型逐步适应规则的变化。适配器结构搜索我们对适配器层的结构层数、神经元数量进行了简单的自动化搜索。发现对于规则差异大的变体一个更深、容量更大的适配器效果更好。4.4 性能优化陷阱陷阱盲目使用Transformer替换LSTM早期我们尝试用更流行的Transformer替换LSTM作为序列建模的核心。理论上Transformer的注意力机制更适合捕捉牌局中的长程依赖关系例如开局打出的第一张牌可能对终局有影响。结果在小规模实验中Transformer表现略好。但当扩展到完整规模时其计算开销尤其是推理时的开销远大于LSTM导致模拟对局速度大幅下降严重拖慢了训练周期。而LSTM在捕捉麻将牌局通常长度在20-40步的序列信息上已经足够有效。结论在工程实践中没有“最好”的模型只有“最合适”的模型。对于需要高频模拟的强化学习任务推理速度往往是比模型容量更重要的考量因素。我们最终选择了经过高度优化的LSTM实现并在其输出后加入了轻量级的注意力层在性能和效果之间取得了最佳平衡。5. 项目总结与未来展望构建这个多规则麻将AI引擎的过程是一次对不完全信息博弈、多智能体系统、迁移学习和强化学习的深度整合实践。最大的收获不是某个单一的算法突破而是深刻体会到真实世界的问题往往是多种复杂性的交织。围棋的挑战在于巨大的搜索空间而麻将的挑战在于同时处理信息缺失、多人互动、规则多样和随机运气。我们目前的引擎已经能够在中国、日本等多个主流规则下达到甚至超越业余高手的水平。但距离顶尖人类职业选手还有很长的路要走。人类牌手具备我们模型尚未完全掌握的“高阶心理博弈”和“对局风格针对性调整”能力。关于未来的方向我个人比较关注几点可解释性增强现在的AI像一个黑箱做出决策后很难向人类解释“为什么”。我们正在尝试用大型语言模型LLM来解读AI决策过程中的内部激活模式生成诸如“建议不打三万因为下家最近连续舍弃四万和五万很可能在听二万或三万的搭子这张牌点炮风险较高”的自然语言解释。这不仅能增加趣味性也是调试AI、发现其认知偏差的重要工具。更高效的元学习我们希望共享底座能更“智能”地学习新规则。理想状态是给定一个新变体的规则书哪怕是自然语言描述的AI能通过少量对局或模拟快速调整适配器形成有效策略。这需要模型具备更强的规则理解和推理能力。人机协作模式麻将不仅是竞技更是社交活动。我们正在探索AI作为“教练”或“实时分析助手”的模式。在玩家思考时AI可以实时分析场面提示当前手牌的几种最优发展路径及其风险收益帮助玩家学习和提高而不是仅仅作为一个对战的对手。这个项目让我明白游戏AI不仅是技术的试金石更是理解人类智能复杂性的一个绝佳窗口。在麻将这个看似简单的136张牌背后蕴含的决策深度和社会互动复杂度依然吸引着我们不断探索。如果你也在进行类似的不完全信息博弈或多智能体系统的研究我非常期待能与你在评论区或更深入的渠道交流心得。毕竟在攻克这类“复合型难题”的道路上同行者的经验分享往往比任何论文都来得宝贵。