목업의 한계
첫 번째 버전을 만들 때, 나는 가짜 데이터를 썼다.
승률 변화? 랜덤.
전환점 감지? 하드코딩.
AI 추천수? 없음.
“일단 돌아가는 것”이 목표였으니까.
MVP라는 이름으로 스스로를 납득시켰다.
하지만 내 바둑을 분석한다면서 AI가 진짜로 보지 않는다는 건,
코치 앱이라는 이름이 무색한 일이었다.
KataGo를 선택한 이유
바둑 AI 하면 AlphaGo가 떠오르지만,
일반인이 쓸 수 있는 건 아니다.
오픈소스로 쓸 수 있는 강력한 엔진.
그게 KataGo다.
- 세계 최정상급 기력
- 분석 모드 지원 (승률, 추천수, 형세 판단)
- JSON으로 질의하고 JSON으로 응답받는 깔끔한 구조
Homebrew로 설치하면 5분이면 끝난다.
brew install katago
생각보다 쉬웠다.
진짜 어려운 건 그 다음이었다.
첫 번째 벽: 좌표계의 혼란
바둑 좌표는 간단해 보인다.
A1부터 T19까지. 가로 세로.
그런데 세 가지 좌표계가 섞여 있었다.
| 형식 | 예시 | 특징 |
|---|---|---|
| SGF | pd |
소문자, 좌상단 기준 |
| GTP | Q16 |
대문자, 좌하단 기준, I 생략 |
| 배열 | [3][15] |
0부터 시작, 행/열 |
SGF 파일을 파싱해서 KataGo에 보내고,
KataGo 응답을 다시 화면에 그리려면,
이 세 가지를 오가야 했다.
Q16이 배열의 어디인지.
pd를 GTP로 바꾸면 뭐가 되는지.
변환 함수를 만들고, 틀리고, 고치고.
일주일은 좌표에 쏟은 것 같다.
두 번째 벽: 분석 결과의 구조
KataGo에 기보를 보내면 각 수마다 분석 결과가 온다.
{
"turnNumber": 4,
"rootInfo": { "winrate": 0.52 },
"moveInfos": [
{ "move": "Q16", "winrate": 0.54 },
{ "move": "D16", "winrate": 0.53 }
]
}
처음엔 단순하게 생각했다.
“turnNumber 4면 4번째 수 분석이겠지.”
아니었다.
KataGo의 turn 0은 빈 바둑판이다.
turn 4는 4개의 수가 놓인 후의 상태.
그리고 moveInfos는 그 상태에서 “다음에 둘 추천수”다.
즉, turn 4의 추천수는 5번째 수를 위한 것이다.
이걸 깨닫기까지 꽤 오래 걸렸다.
흑5를 볼 때 백4 자리를 추천하는 버그가 났고,
그제야 “아, 인덱스가 하나 밀렸구나” 알았다.
세 번째 결정: 정확도 vs 속도
KataGo는 maxVisits 파라미터로 분석 깊이를 조절한다.
- 1000 visits: 프로 수준 정확도, 수당 2-3초
- 100 visits: 충분히 정확, 수당 0.2초
- 50 visits: 코칭용으로 적절, 빠름
300수짜리 기보를 분석한다고 치자.
1000 visits면 10분.
50 visits면 1분.
나는 50을 선택했다.
완벽한 분석보다 빠른 피드백이 중요했다.
어차피 아마추어인 내가 프로 수준 분석과 그 아래를 구분할 수 있을까.
그리고 드디어
기보를 올리고 “분석 시작”을 눌렀다.
1분 후.
진짜 AI가 내 바둑을 봤다.
승률 그래프가 그려졌다.
내가 무너진 지점이 보였다.
“여기서 이렇게 뒀어야 했다”는 추천수가 떴다.
목업이 아니었다.
KataGo가 정말로 내 수를 읽고, 판단하고, 대안을 제시한 것이다.
솔직히 좀 떨렸다.
20년 넘게 바둑을 뒀지만,
이렇게 냉정하게 복기당한 적은 없었다.
다음 과제
KataGo 연동은 끝났다.
하지만 아직 부족하다.
AI는 “여기가 좋다”고만 한다.
왜 좋은지는 설명하지 않는다.
추천수 A, B, C를 바둑판에 띄워도,
그걸 이해하는 건 결국 나의 몫이다.
다음 글에서는 이 추천수를 어떻게 시각화했는지,
바둑판 위에 어떻게 그렸는지 이야기해보려 한다.
KaiGo Coach 개발기는 계속됩니다.
늦깎이연구소
2026년 3월
