课程定位: 围棋打谱辅助系统系列课程的 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 的理由

  1. MIT 协议,无商用限制
  2. 纯 CPU 也能跑到业余顶尖水平(4 线程 + 500 visits)
  3. 社区活跃,持续更新
  4. GTP 支持完善,启动简单(不需额外包装器)