3.6 把 Stockfish 当工具用
前面几节我们一直在“自己造引擎”。这一节换个务实视角:有些轮子不必自己造。国象有 Stockfish——世界最强、完全开源、免费的引擎。与其费力造一个还不如它的,不如直接把它当工具调用。这正是 ANIMA 文档里写的“用 Stockfish 作为 skill/tool 指挥下棋”,也是本课“开放信息接口”思想的又一次落地。
一、用 python-chess 调用 Stockfish
先认识一个协议:UCI(Universal Chess Interface)。几乎所有国象引擎都说这套“普通话”——你通过标准输入输出给它发 FEN 局面,它回你最佳着法和评分。好在 python-chess 把这套通信封装好了,调用 Stockfish 就几行:
import chess, chess.engine
engine = chess.engine.SimpleEngine.popen_uci("stockfish") # 启动 Stockfish 进程
board = chess.Board() # 初始局面
info = engine.analyse(board, chess.engine.Limit(depth=20)) # 让它想到 20 层
print("评分:", info["score"]) # 这个局面谁占优、领先多少(厘兵为单位)
print("最佳着法:", info["pv"][0]) # principal variation 的第一手 = 它推荐的走法
engine.quit()
就这样,你拥有了一个超人级的国象大脑——它的棋力远超我们前几节自己造的任何引擎,却几乎零成本。先装好 Stockfish 二进制(各平台都有现成包),popen_uci 指向它即可。
二、借这位“世界冠军”能做多少事
有了 Stockfish 这个工具,能做的远不止“让它替我走棋”:
- 当裁判 / 基准对手:前几节自己造的引擎到底多强?拉来和不同棋力档位的 Stockfish 对战,用 2.10 的 Elo 一测便知。它是最权威的“尺”。
- 做分析与复盘:给任意局面,让它指出最佳着法、标出谁的失误——这正是各大对弈平台“引擎分析”背后的东西。
- 出题与造数据:让它对海量局面打分,正好可以拿来当 3.5 训练 NNUE 的标注数据——强引擎教小引擎,闭环就接上了。
这呼应了第一章 1.1 提过的一个判断:国象的“AI 大脑”几乎是免费白送的(Stockfish),难的反而是别的(比如让机械臂把棋子抓起来摆对)。把强引擎当工具,是工程上最聪明的省力。
三、封装成统一“开放信息接口”,交给 ANIMA
最后照例——把 Stockfish 也包进我们那套统一接口。无论背后是自研 α-β、NNUE、还是 Stockfish,对外都长一个样:
class StockfishEngine(GameEngine):
def __init__(self):
self.engine = chess.engine.SimpleEngine.popen_uci("stockfish")
self.board = chess.Board()
def best_move(self):
return self.engine.play(self.board, chess.engine.Limit(time=0.1)).move
def info(self):
a = self.engine.analyse(self.board, chess.engine.Limit(depth=18))
return {"fen": self.board.fen(),
"evaluation": a["score"].relative.score(), # 局面评分
"best_move": a["pv"][0].uci(), # 最佳着法
"pv": [m.uci() for m in a["pv"]]} # 主变(接下来的最佳序列)
这就是“开放信息接口”这条暗线在国象上的收束:Stockfish 摇身一变,成了 Anima 可以调用的一项“国象技能”——问它 best_move() 它就出招,问它 info() 它就把评分、最佳着法、未来主变(principal variation)全告诉你。回想 ANIMA 文档里那句“后面下棋类似的逻辑,用 Stockfish 作为 skill/tool 来指挥”——到这里,它就从一句设想变成了能跑的代码。
四、小结与下一节
- UCI + python-chess:几行代码就能调用世界最强的免费引擎 Stockfish,拿到评分、最佳着法、主变。
- 借力:当裁判/基准、做分析复盘、给 NNUE 造标注数据——“AI 大脑近乎白送”。
- ANIMA 工具化:包进统一接口,Stockfish 即成一项可调用的“国象技能”,兑现 ANIMA 的设定。
下一节 3.7 残局库 Tablebases,我们看国象里一个“已解”的小角落——少子残局其实有标准答案,可以直接查表走出完美着法。