课程定位: 围棋打谱辅助系统系列课程的 Part 2。本章完成从棋盘检测到 AI 对弈的关键一环:通过 GTP 协议接入 KataGo 引擎,实现完整的"人落子 → AI 回应"闭环。
前置知识: Part 0 棋盘矫正、Part 1 规则引擎
预计阅读: 20 分钟
GTP 协议与 KataGo —— 通俗讲解
项目:go-board-cpp
日期:2026-05-14
1. 什么是 GTP
GTP = Go Text Protocol,围棋文本协议。一句话概括:
我们用标准化的文本命令和 AI 下棋软件"说话”,AI 用文本回复。(像用聊天窗口指挥 AI 落子)
1.1 类比理解
你和人下棋:
你:我下 D4
对方:(看棋盘) → 我下 Q16
你和 AI 下棋 (GTP):
你:genmove B ← "黑棋该下哪?"
AI:= Q16 ← "下 Q16"
你:play B D4 ← "黑棋下了 D4" (告知AI)
AI:= ← "知道了"
1.2 通信方式
GTP 引擎是一个子进程,程序通过它的标准输入(stdin)写命令,标准输出(stdout)读回复。
┌─────────────────┐ stdin (命令) ┌──────────────────┐
│ 程序 │ ─────────────────→ │ KataGo / GNU Go │
│ (GtpEngine) │ ←───────────────── │ (子进程) │
└─────────────────┘ stdout (回复) └──────────────────┘
就像打开了一个终端,一行一行地和 AI 对话。
1.3 命令与回复格式
命令:
命令名 [参数...]
回复:
= 结果 ← 成功
? 错误信息 ← 失败
(空行表示回复结束)
1.4 常用命令速查
| 命令 | 含义 | 示例 | 回复 |
|---|---|---|---|
name |
你叫什么? | name |
= KataGo |
version |
版本号? | version |
= 1.15 |
boardsize 19 |
设为 19 路棋盘 | boardsize 19 |
= |
clear_board |
清空棋盘 | clear_board |
= |
komi 6.5 |
贴目 6.5 | komi 6.5 |
= |
play B D4 |
黑棋下在 D4 | play B D4 |
= |
play W Q16 |
白棋下在 Q16 | play W Q16 |
= |
genmove B |
黑棋该下哪? | genmove B |
= D4 |
genmove W |
白棋该下哪? | genmove W |
= Q16 |
quit |
退出 | quit |
= |
1.5 坐标表示
GTP 用字母+数字表示棋盘位置:
A B C D E F G H J K L M N O P Q R S T ← 列 (跳过 I)
19 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
18 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
...
3 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
2 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
1 ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ● ●
D4 = 第4列(D) 第4行 = (row=3, col=3) ← 左上星位
Q16 = 第16列(Q) 第16行 = (row=15, col=15) ← 右下星位
转换公式:
GTP 列: A=0, B=1, C=2, D=3, ... (跳过 I, J=8, ... T=18)
GTP 行: "1"=row18, "19"=row0
→ row = 19 - 行号
→ col = 字母序数 (A=0, 跳过I)
1.6 完整对弈示例
程序 → boardsize 19
KataGo → =
程序 → clear_board
KataGo → =
程序 → komi 6.5
KataGo → =
程序 → play B D4 ← 告诉AI:用户下了 D4 (黑)
KataGo → =
程序 → genmove W ← 问AI:白棋该下哪?
KataGo → = Q16 ← AI回复:下 Q16
程序 → play W Q16 ← 告诉AI:按AI说的下了 Q16
KataGo → =
... (下一轮)
程序 → quit
KataGo → =
2. 什么是 KataGo
KataGo 是当前最强的开源围棋 AI 之一,基于深度神经网络 + 蒙特卡洛树搜索(MCTS)。
2.1 和 AlphaGo 的关系
| AlphaGo | KataGo | |
|---|---|---|
| 开发者 | DeepMind (Google) | 社区开源 (lightvector) |
| 是否开源 | ❌ 闭源 | ✅ MIT 开源 |
| 架构 | 策略网络+价值网络+MCTS | 单一神经网络+MCTS |
| 可商用 | ❌ | ✅ |
| 硬件需求 | TPU | CPU/GPU 均可 |
| 棋力 | 职业顶尖 | 职业顶尖 |
2.2 KataGo 的组成
KataGo 需要两个文件:
┌──────────────────────┐
│ katago.exe │ ← 可执行文件 (引擎本体)
│ │ 负责: GTP通信 + MCTS搜索 + 神经网络推理
├──────────────────────┤
│ model.bin.gz │ ← 神经网络权重文件
│ (或 .txt 配置文件) │ 负责: 判断局面好坏 + 推荐落子
└──────────────────────┘
2.3 KataGo 运行模式
KataGo 有两种 GTP 启动方式:
方式 A:分析模式 (analysis)
katago analysis -model model.bin.gz -config gtp.cfg
→ 持续运行,随时可查询(适合 GUI)
方式 B:纯 GTP 模式
katago gtp -model model.bin.gz -config gtp.cfg
→ 只接受 GTP 命令(我们用的方式)
2.4 KataGo 配置文件示例
# gtp.cfg
numSearchThreads = 4 # 搜索线程数
maxVisits = 500 # 每步最多搜索节点数
playoutDoublingAdvantage = 0 # 不调整
resignThreshold = 0.05 # 胜率 < 5% 则认输
3. 实现方案
3.1 GtpEngine 类设计
IGoEngine (抽象接口)
│
├── MockEngine (测试用, 随机落子) ← 已有
│
└── GtpEngine (真AI, 对接KataGo) ← 本次实现
│
├── QProcess (子进程管理)
├── 命令发送 (sendCommand)
├── 回复读取 (readResponse)
└── 坐标转换 (gtpToRowCol / rowColToGtp)
3.2 数据流
generateMove(boardState, BLACK)
│
▼
1. 同步局面 → GTP
clear_board
for each stone in boardState:
play B/W <gtp_coord>
│
▼
2. 请求AI
genmove B
│
▼
3. 解析回复
"= D4" → {row=3, col=3}
3.3 为什么用 QProcess
- Qt 的
QProcess封装了跨平台子进程管理 readyReadStandardOutput信号异步接收 AI 回复waitForReadyRead同步等待(适合请求-响应模式)- 自动处理进程生命周期(启动/崩溃/退出)
3.4 容错设计
| 情况 | 处理 |
|---|---|
| KataGo 启动失败 | initialize() 返回 false,回退 MockEngine |
| GTP 命令超时 (10s) | 返回 pass {-1, -1} |
GTP 返回错误 ? |
日志记录 + 返回 pass |
| KataGo 崩溃 | QProcess 信号检测,自动重连 |
| 坐标解析失败 | 尝试多种格式 |
4. 与其他引擎的对比
| 引擎 | 棋力 | 速度 | 开源 | GTP 支持 |
|---|---|---|---|---|
| KataGo | 职业顶尖 | 快 | ✅ MIT | ✅ 原生 |
| GNU Go | 业余高段 | 很快 | ✅ GPL | ✅ 原生 |
| Leela Zero | 职业顶尖 | 中 | ✅ GPL | ✅ 原生 |
| Pachi | 业余高段 | 很快 | ✅ GPL | ✅ 原生 |
| 商业引擎 | 职业顶尖 | 快 | ❌ | 多数支持 |
选 KataGo 的理由:
- MIT 协议,无商用限制
- 纯 CPU 也能跑到业余顶尖水平(4 线程 + 500 visits)
- 社区活跃,持续更新
- GTP 支持完善,启动简单(不需额外包装器)