Maia 3:一个用 2.5 亿局人类棋谱训练的开源象棋引擎,Elo 1800 且能本地跑

2026-05-26 27 预计阅读时间:1 分钟
来源:oschina.net AI 摘要 原文链接

免责声明:本文为 AI 摘要整理,建议结合原文阅读。摘要可能省略上下文、版本差异或边界条件,不作为官方说明。

预计阅读时间:10 分钟

传统象棋引擎追求的是"更强"——Stockfish 的 Elo 破 3500,远超任何人类冠军。但如果你是一个 1500 分的业余棋手,跟 Stockfish 下棋就像跟一台不会犯错的机器对练:它从不失误,你永远看不到"人类会怎么走这步"。Maia 3 走了另一条路——它不是要赢你,而是要像你一样下棋

Maia Chess 团队刚发布的 Maia 3,基于 Llama 架构、在 2.5 亿局人类对局上训练,Elo 约 1800,比上一代提升近 300 分。完全免费、开源、可本地部署。这对想研究"人类棋风建模"或需要一个不那么碾压的练习对手的开发者来说,是个值得动手试试的工具。

从研究项目到可部署引擎

Maia 项目起源于多伦多大学与微软研究院的联合研究,核心问题是:能不能让 AI 学会人类的下棋风格,而不是只追求最优解?早期版本 Maia 1 用 Leela Chess Zero 的架构,在 Lichess 的 9 个 Elo 区间分别训练了 9 个模型(从 1100 到 1900),每个模型都能模拟对应水平人类的走法分布。

Maia 3 的变化在于:

  • 架构换成了 Llama——从专用象棋网络转向通用语言模型架构,用文本化的棋局序列作为输入,这让模型能更灵活地捕捉人类走法的"语境"(比如同一个局面在不同 Elo 段的倾向差异)。
  • 数据量从千万级跳到 2.5 亿局——覆盖 Lichess 平台更广的人类对局样本。
  • 单一模型覆盖多水平段——不再需要 9 个独立模型,一个 Maia 3 就能在 1800 附近给出合理的人类走法预测。

Elo 1800 意味着它大致模拟一个中高级业余棋手——比初学者强不少,但远不及专业选手。这个定位恰好是 Lichess 上最活跃的用户群体。

为什么"像人类下棋"比"下得最强"更难

Stockfish 的训练目标是确定性最优:给定局面,找胜率最高的走法。这个目标清晰,搜索树 + 评估函数就能搞定。

Maia 的目标却是概率分布:给定局面,预测"一个 1800 分的人类最可能走什么",其次可能走什么。这要求模型学会人类的偏见——人类会忽略某些战术、会偏好某些阵型、会在时间压力下犯错。这些"错误"不是噪声,而是模型要精确捕捉的信号。

2.5 亿局数据提供了足够的统计支撑。举个直觉性的例子:同一个卡尔森也不会每次都走同一步,但 1800 分的群体在某个局面下的走法分布是稳定的——60% 走 e5,25% 走 d5,15% 走其他。Maia 3 要学的就是这个分布。

本地部署与实战:用 Python 跑 Maia 3

Maia 3 开源发布在 GitHub,支持本地推理。以下是一个完整的上手流程,从安装到实际对局。

环境准备

# 克隆仓库
git clone https://github.com/cssmaia/maia-chess.git
cd maia-chess

# 安装依赖(建议用 conda 或 venv)
python -m venv maia_env
source maia_env/bin/activate
pip install -r requirements.txt
pip install python-chess  # 用于棋局交互

加载模型并获取走法推荐

import chess
import chess.pgn
from maia_chess import MaiaModel  # 假设仓库提供此接口

# 加载 Maia 3 模型(首次运行会下载权重,约数 GB)
model = MaiaModel.load("maia-3")

# 创建一个棋局
board = chess.Board()

# 获取 Maia 3 对当前局面的走法预测
# 返回的是走法概率分布,而非单一最优走法
predictions = model.predict_moves(board)

# 打印前 5 个最可能的走法及其概率
for move, prob in predictions.top_k(5):
    print(f"走法: {move.uci()}, 概率: {prob:.2%}")

# 示例输出(开局位置):
# 走法: e2e4, 概率: 38.50%
# 走法: d2d4, 概率: 28.20%
# 赝法: g1f3, 概率: 12.10%
# 走法: c2c4, 概率: 8.40%
# 走法: b1c3, 概率: 4.30%

用 Maia 3 当对手下完整一局

import chess

board = chess.Board()
model = MaiaModel.load("maia-3")

# 你执白,Maia 执黑
while not board.is_game_over():
    if board.turn == chess.WHITE:
        # 人类走法——这里用输入模拟,实际可接入 GUI
        legal_moves = list(board.legal_moves)
        print(f"当前局面: {board.fen()}")
        print(f"合法走法: {[m.uci() for m in legal_moves[:10]]}")
        human_move = input("你的走法(UCI格式,如 e2e4): ")
        board.push_uci(human_move)
    else:
        # Maia 3 走法——从预测分布中采样,而非取最高概率
        # 采样让它更像人类:人类不会每次都走"最可能"的那步
        maia_move = model.sample_move(board)
        print(f"Maia 走了: {maia_move.uci()}")
        board.push(maia_move)

print(f"对局结束: {board.result()}")

关键细节:sample_move 从预测分布中采样,而不是取 argmax。这很重要——如果你总是取概率最高的走法,Maia 就变成了一个确定性引擎,失去了"人类偶尔会选次优走法"的特征。

接入 Lichess API 做批量分析

如果你想用 Maia 3 分析自己的历史对局,找出"人类常见走法 vs 我的走法"的偏差:

import chess.pgn
import io

# 你的某局 PGN 记录
pgn_text = """
[Event "Casual Game"]
[White "You"]
[Black "Opponent"]
1. e4 e5 2. Nf3 Nc6 3. Bb5 a6 4. Ba4 Nf6 5. O-O Be7 6. Re1 b5 7. Bb3 d6 8. c3 O-O
"""

game = chess.pgn.read_game(io.StringIO(pgn_text))
board = game.board()

deviations = []  # 记录你的走法与 Maia 预测的差异

for move in game.mainline_moves():
    if board.turn == chess.WHITE:  # 假设你执白
        predictions = model.predict_moves(board)
        your_move_prob = predictions.get_prob(move)
        top_move = predictions.top_k(1)[0]
        deviations.append({
            "fen": board.fen(),
            "your_move": move.uci(),
            "your_prob": your_move_prob,
            "maia_top_move": top_move[0].uci(),
            "maia_top_prob": top_move[1],
        })
    board.push(move)

# 找出你偏离"人类主流"最多的几步
deviations.sort(key=lambda d: d["your_prob"])
for d in deviations[:3]:
    print(f"局面 {d['fen'][:30]}...")
    print(f"  你走了 {d['your_move']} (Maia预测概率 {d['your_prob']:.2%})")
    print(f"  人类最常走 {d['maia_top_move']} (概率 {d['maia_top_prob']:.2%})")

这种分析是 Stockfish 做不到的——Stockfish 会告诉你"你这步偏离了最优",Maia 会告诉你"你这步偏离了人类主流"。后者对业余棋手的训练更有参考价值。

限制与选择指南

维度 Maia 3 Stockfish
Elo ~1800 >3500
走法风格 模拟人类分布 确定性最优
是否犯错 会,且犯错模式像人类 几乎不会
硬件需求 需要 GPU 跑 Llama 推理 CPU 即可,极快
适用场景 模拟对练、棋风分析 战术训练、开局库验证

几个实际限制需要注意:

  • 推理速度:Llama 架构的推理比专用象棋网络慢。在消费级 GPU(如 RTX 3060)上,单步预测大约需要 0.5-2 秒,不适合需要快速响应的在线对局平台。如果速度是硬需求,Maia 1 的 Leela 架构版本更快。
  • Elo 固定在 1800 左右:如果你是 1200 分的初学者,Maia 3 还是偏强;如果你是 2200 分的俱乐部选手,它又偏弱。团队未来可能会发布多 Elo 段的变体,但目前只有这一个。
  • 长局稳定性:语言模型在超长序列上可能出现注意力衰减,进入残局后预测质量可能下降。遇到这类情况,可以结合 Stockfish 做残局验证。

上手建议:先在本地跑通 predict_moves,用你自己的 Lichess 历史 PGN 做偏差分析,这是最快感受到 Maia 价值的方式。如果你想做在线对局,考虑搭配一个轻量 WebSocket 服务把推理封装成 API,前端用 python-chess 的 Board 渲染即可。


相关推荐