글자 크기

드디어 진짜 AI가 붙었다: KataGo 연동기

목업의 한계

첫 번째 버전을 만들 때, 나는 가짜 데이터를 썼다.

승률 변화? 랜덤.
전환점 감지? 하드코딩.
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와 대국 화면

승률 그래프가 그려졌다.
내가 무너진 지점이 보였다.
“여기서 이렇게 뒀어야 했다”는 추천수가 떴다.

KaiGo Coach 추천수 화면

목업이 아니었다.
KataGo가 정말로 내 수를 읽고, 판단하고, 대안을 제시한 것이다.

솔직히 좀 떨렸다.

20년 넘게 바둑을 뒀지만,
이렇게 냉정하게 복기당한 적은 없었다.


다음 과제

KataGo 연동은 끝났다.
하지만 아직 부족하다.

AI는 “여기가 좋다”고만 한다.
왜 좋은지는 설명하지 않는다.

추천수 A, B, C를 바둑판에 띄워도,
그걸 이해하는 건 결국 나의 몫이다.

다음 글에서는 이 추천수를 어떻게 시각화했는지,
바둑판 위에 어떻게 그렸는지 이야기해보려 한다.


KaiGo Coach 개발기는 계속됩니다.

늦깎이연구소
2026년 3월

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다