传统象棋引擎追求的是"更强"——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 渲染即可。