글자 크기

놓아보기 기능 개발기: AI 추천수를 직접 둬보다

KataGo가 “여기가 좋다”고 말한다.
A, B, C 세 가지 추천수가 바둑판 위에 뜬다.

근데 — 왜 좋은지 모르겠다.

승률이 올라간다고? 그래서? 그 다음엔 뭘 두는 건데?

AI 추천수를 ‘보는’ 것과 ‘이해하는’ 것 사이에는 간극이 있다. 그 간극을 메우려면 직접 둬봐야 한다. 추천수에 돌을 놓고, 그 뒤로 어떤 변화가 펼쳐지는지 따라가 봐야 한다.

그래서 “놓아보기” 기능을 만들었다.

PV, 변화도의 정체

KataGo 분석 결과에는 pv라는 필드가 있다. Principal Variation. 최선의 변화도.

{
  "move": "Q16",
  "winrate": 0.58,
  "pv": ["Q16", "R14", "O17", "P15", "N16", ...]
}

AI가 “Q16이 좋다”고 말할 때, 사실 그 안에는 “Q16 → R14 → O17 → …” 이렇게 쭉 이어지는 예상 진행이 들어 있다. 양쪽이 최선을 다했을 때 펼쳐질 미래.

이걸 바둑판 위에 그려주면 — 왜 그 수가 좋은지 보인다.

첫 번째 함정: 중복된 첫 수

구현은 간단해 보였다. PV 배열을 받아서 순서대로 돌을 놓으면 된다.

selected_pv = recommendations[0]  # A 추천수
first_move = selected_pv["move"]  # "Q16"
pv_sequence = selected_pv["pv"]   # ["Q16", "R14", "O17", ...]

그런데 첫 수가 두 번 놓였다.

Q16에 돌이 놓이고, 그 다음 R14… 가 아니라 또 Q16이 놓였다. PV 배열 자체에 첫 수가 포함되어 있었기 때문이다.

# KataGo PV는 첫 수를 포함하므로 제거
pv_sequence = raw_pv[1:] if raw_pv[0] == selected_pv["move"] else raw_pv

작은 버그지만, 돌 색깔이 뒤집어지면서 전체 변화도가 엉망이 됐다. 흑백이 바뀌면 바둑은 완전히 다른 게임이 된다.

두 번째 함정: 누구 차례인가

현재 6수까지 진행된 상태. 흑이 방금 뒀다. AI가 “백은 여기가 좋다”고 추천한다.

이 추천수를 놓아보기로 보여줄 때 — 첫 돌은 무슨 색이어야 할까?

처음엔 next_color를 썼다. “다음에 둘 색깔”이니까. 근데 틀렸다.

AI 추천수는 “방금 둔 쪽이 대신 뒀어야 할 수”다. 즉 move_info.color — 현재 수를 둔 색깔 — 를 써야 한다.

# 틀린 코드
pv_first_color = next_color  # 다음 차례

# 맞는 코드
pv_first_color = move_info.color  # 현재 수를 둔 색

이 버그를 찾는 데 한참 걸렸다. 변수명만 보면 next_color가 맞는 것 같았으니까. 결국 실제로 돌을 놓아보고, “어? 왜 백2가 흑2로 나오지?” 하면서 발견했다.

세 번째 도전: 한 수씩 음미하기

PV 전체를 한 번에 보여주니까 — 너무 빠르다.

10수짜리 변화도가 화면에 쫙 펼쳐지면, 어디서 어디로 흘러간 건지 따라가기 어렵다. 바둑 복기는 원래 한 수씩 짚어가며 하는 건데.

그래서 네비게이션을 추가했다.

⏮  ◀  ▶  ⏭
처음 이전 다음 끝

슬라이더도 넣었다. 5수 중 3수까지 보기. 드래그하면 해당 시점의 바둑판이 나온다.

구현하면서 Streamlit의 session_state와 또 싸웠다. 슬라이더 값이 바뀌면 상태가 초기화되고, 버튼을 누르면 키가 충돌하고. 결국 explore_key에 모든 변수를 다 넣었다.

explore_key = f"explore_{current_move}_{selected_idx}_{pv_step}"

현재 몇 수째인지, 어떤 추천수를 보는지, 슬라이더가 어디인지. 이 세 가지가 바뀌면 상태를 새로 초기화한다. 무식하지만 확실한 방법.

네 번째 확장: 직접 둬보기

PV만 보는 건 수동적이다. “AI가 이렇게 예상했구나”로 끝난다.

진짜 궁금한 건 — “내가 여기에 두면 어떻게 되지?”

그래서 직접 착수 기능을 추가했다. 바둑판을 클릭하면 거기에 돌이 놓인다. 그 상태에서 “AI 1수” 버튼을 누르면 상대 응수를 AI가 둬준다.

[바둑판 클릭] → 내 돌 착수
[AI 1수] → AI가 응수
[AI 참고도] → 이후 10수까지 자동 진행

이제 “만약 여기에 뒀다면?” 실험을 할 수 있다. AI 추천수를 무시하고 내 생각대로 둬본 다음, 그 결과를 확인한다.

놓아보기의 가치

복기할 때 가장 아쉬운 순간이 있다.

“여기서 저쪽에 뒀으면 어땠을까?”

프로 해설을 들어도, AI 분석을 봐도, 그 궁금증은 풀리지 않는다. 직접 둬보기 전까지는.

놓아보기 기능은 그 간극을 메운다. AI 추천수를 따라가 보고, 내 생각대로도 둬보고, 두 결과를 비교한다. 왜 AI가 그 수를 추천했는지, 내 수가 왜 안 좋은지, 둬보면 보인다.

강한 AI를 만들 필요는 없었다.
강한 AI를 ‘잘 보여주는’ 것이 필요했다.

남은 과제

아직 다듬을 게 있다.

  • 착수 취소 (Undo) 기능
  • 변화도 분기 저장
  • 터치 인터페이스 최적화

하나씩 해나가면 된다.
만들면서 배우는 거니까.


이 글은 늦깎이 바둑코치 시리즈의 열두 번째 글입니다.

댓글 달기

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