LLM은 바둑을 둘 수 있을까?

  • AI
  • 바둑
  • Skills

형세 판단에서 ‘수담하는 AI’까지의 사고실험#

문득 이런 생각이 들었다.

LLM에게 바둑을 두게 할 수 있을까?

나는 바둑이라는 행위 자체는 알고 있지만, 바둑을 실제로 둘 줄 아는 사람은 아니다. 자세한 규칙도 모르고, 형세를 판단하는 방법이나 어떤 상황에서 어떤 수를 두어야 하는지도 아직 잘 모른다.

그래서 처음 떠오른 질문도 아주 단순했다.

바둑을 두려면 우선 지금 판이 어떻게 흘러가고 있는지를 알아야 하지 않을까?

그렇다면 첫 번째 질문은 이것이었다.

LLM은 바둑의 형국이나 형세를 파악할 수 있을까?


우선 현재 판을 알아야 한다#

처음에는 LLM이 바둑판을 보고 바로 형세를 판단하는 것은 어려울 것이라고 생각했다.

하지만 조금 다르게 생각해보니 꼭 LLM이 모든 것을 직접 계산할 필요는 없었다.

알파고 이전에도 바둑 프로그램은 존재했다. 물론 지금의 바둑 AI와 비교하면 수준 차이가 컸겠지만, 판 위에 놓인 흑돌과 백돌의 상태를 분석하고 어느 쪽이 유리한지 추정하는 기능은 이미 존재했다.

그렇다면 LLM 역시 비슷한 방식으로 접근할 수 있지 않을까?

예를 들어 LLM이 바둑판을 보고 돌의 위치를 인식한 뒤, 형세 계산은 전용 바둑 엔진에 맡기는 것이다.

구조를 단순화하면 다음과 같다.

바둑판 인식 → 바둑 엔진 분석 → 계산 결과 → LLM의 해석

바둑 엔진이

  • 현재 흑과 백 중 어느 쪽이 유리한지
  • 예상 집 차이가 어느 정도인지
  • 약한 돌이 어디에 있는지
  • 후보수가 무엇인지
  • 각 후보수에 따른 승률 변화가 어떤지

같은 정보를 계산한다면, LLM은 그 결과를 받아 사람이 이해할 수 있는 말로 바꿀 수 있다.

예를 들어 단순히

흑 승률 63%

이라고 출력하는 대신,

흑이 조금 유리합니다. 단순히 현재 확보한 집의 차이보다는 백의 좌변 돌이 아직 완전히 안정되지 않았다는 점이 더 중요합니다.

라고 설명하는 식이다.

이 지점에서 첫 번째 생각이 정리되었다.

LLM이 바둑 형세를 직접 계산하지 못하더라도, 계산을 수행할 수 있는 도구를 사용할 수 있다면 형세를 파악하는 시스템을 만들 수 있다.

그런데 형세를 알 수 있다면 자연스럽게 다음 질문이 생긴다.

그렇다면 다음 수를 둘 수도 있지 않을까?


다음 수를 고르는 것은 단순히 좌표 하나를 선택하는 일일까?#

처음에는 이 문제를 단순하게 생각했다.

현재 형세를 알고 있다면 좋은 위치를 찾아 돌을 놓으면 되는 것 아닐까?

하지만 생각할수록 착수는 단순한 위치 선택 이상의 일이었다.

바둑에서는 어떤 수를 두는 행위를 단순히 좌표로만 표현하지 않는다.

붙인다. 막는다. 잇는다. 끊는다. 젖힌다. 몰아간다. 다진다.

이런 말들이 존재한다.

각각의 말에는 단순한 돌의 위치보다 더 많은 정보가 들어 있다.

왜 그곳에 두는지에 대한 목적과 행동의 성격이다.

여기에서 최근 LLM을 사용하면서 알게 된 Skills라는 개념이 연결되었다.

LLM에게 무작정

다음 수를 둬.

라고 하는 것이 아니라, 바둑에서 사고하고 행동할 때 사용할 수 있는 개념과 방법을 Skill 형태로 제공하면 어떨까?

예를 들어 현재 상황을 분석한 결과가 다음과 같다고 하자.

백의 좌변 대마가 아직 완전히 안정되지 않았다.

그렇다면 LLM은 바로 좌표 하나를 선택하는 대신 먼저 전략적인 질문을 할 수 있다.

백을 직접 잡으러 갈 것인가?

백이 쉽게 살아가지 못하도록 방해할 것인가?

백을 공격하면서 다른 쪽의 흑 집을 키울 것인가?

아니면 흑이 이미 충분히 유리하므로 복잡한 전투를 피하고 다른 큰 곳을 차지할 것인가?

이렇게 생각하고 나면 필요한 행동 역시 달라진다.

공격해야 한다면 붙이기, 막기, 끊기, 몰기 같은 Skill을 검토할 수 있고, 자신의 영역을 안정시키려 한다면 잇기, 다지기, 두터움 만들기 같은 다른 행동을 선택할 수 있다.

즉 처음 생각했던

판면 → 착수

사이에 여러 개의 사고 단계가 생긴다.

판면 → 형세 판단 → 목적 설정 → Skill 선택 → 후보수 생성 → 검증 → 착수

이 구조가 꽤 흥미롭게 느껴졌다.


바둑을 ‘어디에 둘까?’가 아니라 ‘무엇을 할까?’로 생각한다#

이 구조에서 중요한 점은 착점 자체보다 행동의 목적을 먼저 생각하게 한다는 것이다.

19×19 바둑판에는 361개의 교차점이 있다.

아무런 맥락 없이 LLM에게 이 가운데 하나를 고르라고 하는 것과,

백의 약한 돌을 공격하면서 우변의 흑 세력을 키워라.

라고 목적을 부여하는 것은 전혀 다른 문제다.

두 번째 방식에서는 탐색해야 할 공간이 훨씬 줄어든다.

예를 들어 LLM의 사고가 이런 식으로 진행될 수 있다.

백 좌변이 약하다. 그런데 잡으려고 무리하면 오히려 흑이 위험해질 수 있다. 백을 중앙 쪽으로 몰면서 우변 흑을 키우는 것이 더 좋겠다. 그렇다면 백의 탈출 방향을 제한하는 수가 필요하다.

그 이후에야 구체적인 후보 착점을 찾는다.

A는 직접 공격하는 수다.

B는 백의 탈출 방향을 제한하면서 흑의 세력을 키우는 수다.

C는 백을 그대로 두고 다른 큰 곳을 차지하는 수다.

그리고 이 후보들을 다시 바둑 엔진으로 계산해볼 수 있다.

만약 B의 결과가 가장 안정적이라면 최종적으로 B를 선택한다.

이렇게 되면 LLM은 단순히 바둑 엔진의 최선수를 받아 전달하는 존재가 아니다.

현재 상황을 해석하고, 목적을 세우고, 그 목적에 필요한 행동을 선택하고, 계산 도구를 사용해 자신의 판단을 검증하는 역할을 수행한다.

여기에서 내가 처음 품었던 질문도 조금 달라졌다.

처음에는

LLM이 바둑을 잘 둘 수 있을까?

라고 생각했다.

하지만 이제 질문은 다음에 가까워졌다.

LLM에게 바둑에서 생각하는 방법을 제공할 수 있을까?


바둑 엔진은 수를 계산하고, LLM은 그 수의 의미를 다룬다#

물론 Skill만 가지고 바둑을 둘 수는 없다.

LLM이

여기를 막는 것이 좋겠다.

라고 생각했는데 실제로 몇 수 뒤 돌이 잡혀버릴 수도 있다.

구체적인 수읽기는 여전히 바둑 전용 엔진이 훨씬 강하다.

그래서 역할을 나누는 편이 자연스럽다.

LLM은

형세를 이해하고 → 전략을 세우고 → 필요한 Skill을 선택하고 → 후보수를 만든다.

바둑 엔진은

그 후보가 실제로 성립하는지 계산하고 → 전술적인 오류를 찾고 → 승률이나 집 차이를 평가한다.

그리고 LLM은 다시 그 결과를 받아 전략을 수정하거나 최종적인 수를 선택한다.

이를 다시 정리하면 다음과 같다.

상황 이해 → 목적 설정 → 바둑 Skill → 후보수 → 엔진 검증 → 착수

그런데 여기까지 생각하자 처음의 사고실험과는 조금 다른 가능성이 보이기 시작했다.

바둑 프로그램이 단순히 좋은 수를 두는 데서 끝나지 않아도 되는 것이다.


왜 그곳에 두었는지를 말할 수 있다면#

기존 바둑 프로그램의 가장 중요한 목적은 강한 수를 찾는 것이다.

알파고 이후의 바둑 AI는 이미 인간 최고 수준을 넘어섰다.

하지만 바둑을 배우려는 사람에게 가장 필요한 것이 항상 가장 강한 수만은 아니다.

처음 배우는 사람이라면 오히려 이런 것이 궁금하다.

왜 거기에 뒀어?

나는 이쪽이 더 커 보이는데 왜 저쪽을 둔 거야?

저 돌을 잡으러 가면 안 돼?

지금은 집을 만들어야 하는 것 아닌가?

이 질문에서 LLM이 가진 장점이 드러난다.

LLM은 자연어로 자신의 판단을 설명할 수 있다.

예를 들어 흑이 한 수를 둔 뒤 다음과 같이 말할 수 있다.

이 수는 백을 잡으려는 수가 아닙니다. 좌변의 백돌이 아직 약하기 때문에 백이 중앙으로 움직이도록 압박하면서 우변의 흑 모양을 자연스럽게 키우려는 목적입니다. 현재 흑이 조금 앞서 있기 때문에 무리하게 잡으러 갈 필요도 없습니다.

그리고 사용자는 다시 자신의 생각을 말할 수 있다.

나는 백을 잡으러 가는 게 더 좋아 보였는데?

그러면 LLM은 그 생각을 하나의 후보 전략으로 받아들인다.

직접 잡으러 가는 수도 생각할 수 있습니다. 다만 그 진행에서는 백에게 반격할 기회가 생기고 흑도 위험해질 가능성이 있습니다. 그래서 저는 백을 살려주더라도 공격 과정에서 다른 이득을 얻는 쪽을 선택했습니다.

이제 바둑판 위에서는 단순한 승부만 일어나는 것이 아니다.

한 수와 한 수 사이에 대화가 생긴다.


‘수담’을 하는 AI#

바둑을 표현하는 말 가운데 ‘수담(手談)’이라는 표현이 있다.

손으로 나누는 대화라는 뜻이다.

이 표현을 떠올리자 이번 사고실험의 방향이 좀 더 선명해졌다.

기존 바둑 AI가 인간보다 훨씬 강한 수를 둘 수 있다면, LLM을 결합한 바둑 AI에서는 다른 목표를 세울 수도 있다.

강한 상대가 아니라, 자신의 생각을 이야기해주는 상대를 만드는 것이다.

사용자가 한 수를 둔다.

AI는 그 수를 보고 묻는다.

이 수는 왼쪽 돌을 살리려는 의도였나요?

사용자가 대답한다.

아니, 오른쪽 집을 크게 만들고 싶었어.

AI가 다시 판을 살펴본다.

그렇다면 의도는 이해됩니다. 다만 지금은 오른쪽 집보다 이 돌을 먼저 살리는 것이 더 급해 보입니다. 오른쪽은 나중에도 둘 수 있지만 이 돌은 지금 움직이지 않으면 공격받을 가능성이 있기 때문입니다.

그리고 자신의 다음 수를 둔다.

그래서 저는 여기에 두겠습니다. 당신의 약한 돌을 공격하면서 동시에 제 바깥쪽을 두껍게 만들려는 수입니다.

이런 식이라면 AI와 바둑을 두는 경험은 단순히 컴퓨터를 상대로 승패를 겨루는 것과 꽤 달라질 수 있다.

한 수마다 상대의 의도를 묻고,

자신이 생각한 이유를 말하고,

서로 다른 판단을 비교한다.

내가 만들고 싶은 것은 점차 이런 모습에 가까워졌다.

대화형 바둑 상대이면서 동시에 사고 과정을 함께 따라가는 교습기.


단, 설명이 ‘나중에 만들어낸 이야기’가 되어서는 안 된다#

여기에는 한 가지 중요한 문제가 있다.

LLM은 그럴듯한 설명을 만드는 데 능숙하다.

바둑 엔진이 어떤 수를 최선수로 반환한 뒤 LLM에게

왜 이 수가 좋은지 설명해.

라고만 한다면, 실제로 그 수가 선택된 이유와는 관계없는 훌륭한 이야기를 만들어낼 수도 있다.

교육용 시스템이라면 이것은 문제가 된다.

사용자는 AI가 왜 그 수를 선택했는지를 알고 싶은 것이지, 선택이 끝난 뒤 만들어낸 해설을 듣고 싶은 것이 아니기 때문이다.

이 지점에서 앞서 생각했던 Skill과 사고 단계가 다시 중요해진다.

실제 수를 결정하기 전에

형세 분석 → 전략 선택 → Skill 선택 → 후보수 생성 → 엔진 검증

과정을 거치고, 이 과정에서 만들어진 정보를 기록한다.

그리고 착수 이후의 설명 역시 이 기록을 바탕으로 만든다.

그러면

왜 이곳에 두었어?

라는 질문에 대한 답은 단순한 사후 해설이 아니라 실제로 그 수를 선택하면서 사용했던 판단의 요약이 될 수 있다.

완전히 인간의 내면적인 사고와 동일하다고 할 수는 없겠지만, 적어도 시스템이 선택에 사용한 근거와 설명 사이의 거리를 줄일 수 있다.


그런데 나는 바둑을 둘 줄 모른다#

여기까지 생각한 뒤 한 가지 재미있는 점을 발견했다.

나는 이 프로그램을 만들고 싶지만, 정작 바둑을 제대로 둘 줄 모른다.

처음에는 이것이 큰 문제라고 생각할 수도 있다.

하지만 오히려 반대로 생각해보기로 했다.

내가 바둑을 배우는 순서대로 프로그램도 바둑을 배우게 하면 어떨까?

처음에는 가장 기본적인 규칙부터 시작한다.

흑과 백이 번갈아 둔다.

이미 돌이 있는 곳에는 다시 놓을 수 없다.

돌은 어떤 조건에서 잡히는가?

단수란 무엇인가?

자충은 무엇인가?

패는 무엇인가?

내가 이 규칙들을 배우면 프로그램에도 하나씩 구현한다.

처음의 프로그램은 바둑을 잘 둘 필요가 없다.

우선 합법적인 수를 둘 수 있으면 된다.

그다음 내가 단수를 배우면 프로그램에도 단수를 찾는 기능을 만든다.

상대 돌을 잡을 수 있는 곳을 탐색하고,

내 돌이 위험하면 살리는 후보를 찾는다.

그다음 잇기끊기를 배우면 그것을 새로운 Skill로 추가한다.

더 나중에는 약한 돌, 두터움, 세력, 공격, 삭감 같은 개념을 배울 수도 있다.

그리고 어느 순간 이런 것을 알게 될 수도 있다.

바둑에서는 ‘큰 곳’과 ‘급한 곳’이 다르다.

그 순간 내가 배우는 것은 바둑 개념 하나이지만 프로그램의 입장에서는 새로운 의사결정 구조가 된다.

기존에는 단순히 가장 큰 곳을 찾았다면,

이제는 먼저

지금 즉시 대응해야 하는 급한 곳이 있는가?

를 판단해야 한다.

있다면 급한 곳을 먼저 처리하고,

없다면 큰 곳을 선택한다.

그렇게 그래프가 하나 더 생긴다.

이 지점에서 이번 프로젝트의 또 다른 의미가 보였다.

내가 바둑의 개념 하나를 배우는 것이 프로그램에는 알고리즘 하나를 추가하는 일이 된다.


바둑을 배우면서 알고리즘도 배운다#

나는 개발을 전문적으로 공부해온 사람도 아니다.

그래서 프로그램의 알고리즘이나 구조를 바라보는 방법 역시 아직 배워가는 과정에 있다.

최근에는 ‘그래프 엔지니어링’이라는 개념에도 관심을 가지기 시작했다.

이번 바둑 사고실험은 이런 시스템적인 사고를 직접 연습하기에도 좋은 소재처럼 보인다.

처음에는 단순했다.

판면 → 착수

그런데 질문을 하나씩 추가하자 구조가 달라졌다.

판면

→ 현재 위험한 돌이 있는가?

→ 현재 형세는 어떠한가?

→ 상대와 나의 약점은 어디인가?

→ 지금 가장 중요한 목적은 무엇인가?

→ 그 목적에 필요한 바둑 Skill은 무엇인가?

→ 어떤 후보수를 만들 수 있는가?

→ 실제 수읽기에서도 성립하는가?

→ 가장 적절한 수는 무엇인가?

→ 왜 그 수를 선택했는가?

하나의 결과가 여러 판단 노드와 연결되기 시작한다.

나는 이 구조를 직접 만들면서 LLM에게 도구를 제공한다는 것이 무엇인지, Skill을 설계한다는 것이 무엇인지, 판단을 여러 단계로 나눈다는 것이 무엇인지도 함께 배울 수 있을 것 같다.


목표는 가장 강한 바둑 AI가 아니다#

이 프로젝트에서 중요한 것은 목표를 잘 정하는 일일 것이다.

목표를

강한 바둑 AI를 만든다

라고 한다면 금세 이미 존재하는 강력한 바둑 엔진들과 경쟁해야 한다.

그리고 결국 이런 결론에 도달할 가능성이 높다.

기존의 강한 엔진을 그냥 사용하면 되는 것 아닌가?

실제로 계산 능력에서는 그것이 맞을 것이다.

내가 새롭게 만들고 싶은 것은 바둑 엔진 자체가 아니다.

목표는 조금 다르다.

사람과 한 수씩 바둑을 두면서 자신의 착수 의도를 설명하고, 사용자의 생각을 물으며, 서로의 판단을 비교할 수 있는 AI를 만든다.

바둑 엔진은 기력을 제공한다.

LLM은 언어와 판단을 연결한다.

Skills는 바둑에서 사용하는 개념과 행동의 문법을 제공한다.

그리고 사용자는 단순히 AI가 둔 수를 따라가는 것이 아니라 그 판단 과정에 참여한다.

한 수를 두고,

왜 그렇게 두었는지 말하고,

상대의 생각을 듣고,

다시 다음 수를 생각한다.

그렇게 본다면 이 프로젝트의 목표는 강한 바둑 기사를 만드는 것이 아니라 어쩌면 정말로 수담할 수 있는 상대를 만드는 것에 가까울지도 모른다.


이 프로젝트를 만들면서 내가 배우고 싶은 것#

처음의 질문은 단순했다.

LLM은 바둑을 둘 수 있을까?

그 질문을 따라가다 보니 여러 질문이 이어졌다.

형세를 판단할 수 있을까?

직접 계산하지 못한다면 도구를 사용하면 되지 않을까?

형세를 알았다면 다음 행동의 목적도 생각할 수 있지 않을까?

바둑의 수법을 Skill로 제공하면 추론을 도울 수 있지 않을까?

후보수는 바둑 엔진으로 다시 검증하면 되지 않을까?

그렇다면 그 판단의 이유를 사람에게 설명할 수도 있지 않을까?

여기까지 오자 처음과는 다른 목표가 생겼다.

나는 이 프로젝트를 통해 두 가지를 함께 배우고 싶다.

하나는 바둑이다.

규칙부터 시작해서 돌을 보는 방법과 형세를 판단하는 방법, 공격과 수비, 그리고 한 수에 담긴 의도를 조금씩 이해하고 싶다.

다른 하나는 AI 시스템을 만드는 방법이다.

LLM과 도구를 어떻게 연결하는지,

Skills가 어떤 역할을 하는지,

하나의 판단을 어떤 단계로 나누어야 하는지,

그리고 그 판단들이 어떻게 하나의 그래프로 연결되는지를 직접 만들어보며 이해하고 싶다.

그래서 이 프로젝트에서는 내가 바둑을 배우는 과정과 프로그램이 성장하는 과정이 서로 분리되지 않을 것이다.

내가 단수를 배우면 프로그램도 단수를 배우고,

내가 큰 곳과 급한 곳의 차이를 이해하면 프로그램의 판단 구조도 하나 더 복잡해진다.

그리고 언젠가 내가 바둑판 앞에서 AI와 이런 대화를 할 수 있다면 좋겠다.

“왜 거기에 뒀어?”

“당신의 왼쪽 돌을 잡으려는 것은 아닙니다. 그 돌을 공격하는 동안 오른쪽의 제 모양을 키우고 싶었습니다.”

“나는 오히려 왼쪽 돌을 포기하고 다른 곳을 두려고 했는데.”

“그 선택도 가능합니다. 그렇다면 다음에는 그 진행을 함께 비교해봅시다.”

처음에는 그저 LLM이 바둑을 둘 수 있을지가 궁금했다.

지금은 조금 다른 것이 궁금하다.

LLM과 정말로 바둑에 대한 대화를 나누면서 한 판을 둘 수 있을까?

이 사고실험은 그 질문에서부터 시작해보려고 한다.