← 공략 모음으로 돌아가기

체스 AI가 한 수에 40초까지 걸리던 이유

개발 일지: 느렸던 원인, 고친 방법, 그리고 고친 계산기를 검증한 방법

요약

오목보드 체스의 어려움 AI는 2026년 9월까지 한 수를 두는 데 평균 5초, 길게는 40초 가까이 걸렸습니다. 지금은 평균 0.6초, 가장 오래 걸려도 1.3초입니다(2026년 10월 18일, 782수 측정). 무엇이 느렸고 어떻게 고쳤는지, 그리고 고친 계산기가 규칙을 틀리지 않는지 어떻게 확인했는지 정리합니다.

얼마나 느렸나

AI끼리 대국을 시켜 한 수 계산 시간을 쟀습니다(2026년 9월 24일, 노트북 CPU와 Node.js 기준. 기존 어려움은 6판 기준).

버전평균최대
기존 어려움 (3수 탐색)5.2초39.9초
기존 보통 (2수 탐색)0.8초5.3초

휴대폰은 이보다 몇 배 느립니다. AI 차례가 되면 화면이 멈춘 것처럼 보이는 상태였습니다.

원인: 규칙 라이브러리를 탐색에 쓴 것

체스 규칙 판정에는 chess.js(0.10.3)라는 라이브러리를 씁니다. 사람이 둔 수가 합법인지, 체크메이트인지 판단하는 데는 충분히 빠릅니다. 문제는 AI가 수를 고를 때도 같은 라이브러리로 판을 수천에서 수만 번 펼쳐 봤다는 점입니다.

이 라이브러리는 둘 수 있는 수 목록을 만들 때마다, 수마다 기보 표기(Nf3, Qxe5+ 같은 것)를 만들고 그 표기에 붙일 체크·체크메이트 여부까지 확인합니다. 체크메이트를 확인하려면 다시 둘 수 있는 수를 전부 만들어 봐야 하니, 탐색 한 번에 같은 계산이 수십만 번 반복됐습니다. 기존 AI는 판 평가에 "둘 수 있는 수의 개수"까지 넣어서, 판 하나를 평가할 때마다 수 목록을 또 만들었습니다.

첫 시도는 오히려 더 느려졌다

기존 어려움 AI에는 약점이 하나 더 있었습니다. 3수째에서 계산을 그냥 끊기 때문에, 기물을 주고받는 교환이 진행 중인 상태로 판단을 내려 기물을 공짜로 내주곤 했습니다. 체스 프로그램에서 수평선 효과라고 부르는 문제입니다.

그래서 먼저 "잡는 수가 남아 있으면 이어서 계산하는" 기능을 같은 라이브러리 위에 붙였는데, 한 중반 국면에서 한 수 계산이 65초(65,740ms) 걸렸습니다. 느린 부품 위에 계산을 더 얹은 셈이었습니다. 강하게 만들려면 먼저 빠르게 만들어야 했습니다.

해결: AI 전용 계산기를 따로 만든다

역할을 나눴습니다. "어디에 둘지" 계산은 새로 만든 가벼운 계산기(chess-ai.js)가 하고, 실제 착수와 규칙 판정(3회 반복, 50수 규칙 등)은 지금처럼 chess.js가 합니다.

  • 판 표현: 0x88 방식을 씁니다. 128칸 배열에 판을 담아, 기물이 판 밖으로 나갔는지를 비트 연산 한 번으로 걸러내는 고전적인 방법입니다.
  • 합법 수만, 표기 없이: 둘 수 있는 수만 만들고 기보 표기는 만들지 않습니다.
  • 깊이는 시간에 맞춰: 어려움은 3수 앞은 항상 읽고, 4수 앞은 1초 안에 끝날 때만 씁니다. 기기가 느리면 3수로, 빠르면 4수로 둡니다.
  • 교환은 끝까지: 계산이 끝나는 지점에서 기물 교환이 진행 중이면 잡는 수가 없을 때까지(최대 8수) 이어서 계산합니다. 수평선 효과를 막는 장치입니다.
  • 이기고 있으면 반복하지 않기: 새 계산기는 같은 국면이 반복되는지 모르기 때문에, 이기고 있을 때 3회 반복 무승부가 되는 수는 chess.js로 확인해서 건너뜁니다.

새 계산기가 규칙을 틀리지 않는지 확인한 방법

계산기가 합법 수를 하나라도 빠뜨리거나 잘못 만들면 AI가 반칙을 두게 됩니다. 두 가지로 확인했습니다.

1. perft: 체스 프로그램들이 쓰는 검증법입니다. 정해진 국면에서 정해진 수만큼 둘 수 있는 모든 경우의 수를 세어, 널리 알려진 기준값과 비교합니다. 한 칸이라도 틀리면 숫자가 달라집니다.

국면깊이기준값결과
시작 국면4수197,281일치
Kiwipete (캐슬링·앙파상·핀이 섞인 검증용 국면)3수97,862일치

2. 규칙 라이브러리와 대조: 무작위로 둔 대국에서 나온 국면 43,614개마다 새 계산기와 chess.js가 센 합법 수 개수를 비교했습니다. 하나도 다르지 않았습니다.

결과

고친 직후(2026년 9월 24일) AI끼리 둔 결과입니다.

대결결과
새 어려움 vs 기존 어려움8판 7승 1무
새 어려움 vs 새 보통20판 19승 1무

같은 날 새 어려움의 한 수 계산은 평균 0.6초, 최대 1.04초였습니다. 2026년 10월 18일에 대결마다 20판씩 다시 쟀을 때는 새 어려움이 새 보통을 20판 모두 이겼고, 한 수 계산은 평균 0.6초, 최대 1.3초였습니다. 전체 결과는 AI 난이도 실측 기록에 있습니다.

대가도 있었습니다. 새 계산기는 판을 기물 점수와 위치 점수로만 평가합니다. "둘 수 있는 수의 개수" 항목을 뺐더니, 새 보통은 기존 보통과 20판을 둬서 1승 15무 4패로 조금 약해졌습니다. 대신 기존 보통이 가끔 5초 넘게 멈추던 일은 없어졌습니다.

아직 남은 약점

평가 기준이 단순해서 킹 주변의 안전이나 겹친 폰·고립된 폰 같은 폰 구조를 따로 따지지 않습니다. 킹을 향한 느린 공격이나 폰 구조의 약점을 오래 파고드는 운영에 약하고, 네 수보다 멀리서 완성되는 전술은 보지 못합니다. 어려움 AI를 이기고 싶다면 이 방향을 노려 보세요. 기본 전술은 체스 공략에 정리해 두었습니다.

직접 확인하기

체스 바로 하기 →