엘든 링의 로우테크 AI: 상태 머신이 딥러닝을 이긴 이유

엘든 링의 로우테크 AI: 상태 머신이 딥러닝을 이긴 이유

elden-ringgame-aifromsoftwarebehavior-treefsm

데이터 소스:nega.tv + Lobsters + HN

타락한 징조 마르기트가 지팡이를 치켜들었다. 1.5초 동안 그대로 멈춰 있다.

당신은 이미 구르기 시작했다. 의식보다 엄지가 먼저 B 버튼을 눌렀다. 앞서 8번의 죽음이 한 가지를 가르쳐줬기 때문이다: 마르기트의 시작 동작에는 완전히 다른 두 가지 연계 패턴이 숨어 있고, 차이는 지팡이 끝의 떨림 폭뿐이다. 하지만 이번에는 구분할 틈이 없었다 — 지팡이 끝을 보기도 전에 굴렀다. 마르기트의 지연 베기가 당신의 구르기 무적 프레임이 끝나는 바로 그 순간에 정확히 꽂혔다. YOU DIED.

아홉 번째. 당신은 화면을 응시하며 이상한 점을 알아채기 시작한다: 죽으면 죽을수록 마르기트의 행동이 점점 더 “읽을 수 있게” 느껴진다. 약해져서가 아니다 — 보스의 데이터는 죽을 때마다 변하지 않는다 — 당신의 뇌가 마르기트의 동작 라이브러리를 규칙 집합으로 컴파일하고 있기 때문이다: 지팡이 끝이 앞으로 기울면 = 돌진 삼연격; 지팡이 끝이 위로 들리면 = 성스러운 망치 내려찍기; 한 몸통 이상 거리 = 비검 투척. 이 규칙들은 많지 않다. 각각은 선명하게 구분 가능하고, 각각은 확정된 대응 윈도우에 연결된다.

이것이 프롬소프트웨어 게임 AI의 가장 반직관적인 지점이다: 단순할수록, 더 영리하게 느껴진다.

AI가 아니라 PDA

2026년 6월, nega.tv에 발표된 기술 리버스 엔지니어링 글이 Hacker News와 Lobsters를 강타했다. 이 글의 내용은 예상 밖의 발견 하나로 요약된다: 프롬소프트웨어의 적 AI 시스템은 — 《데몬즈 소울》부터 《엘든 링》까지 — 내부 구조가 행동 트리(Behavior Tree)도, GOAP 플래너도 아니며, 딥러닝과는 단 한 푼의 관계도 없다. 본질적으로 이것은 푸시다운 오토마톤(Pushdown Automaton, PDA) 이며, Havok Script(이미 단종된, 게임용 Lua 변종)로 작성되었고, 데이터 구조는 대다수 AAA 게임의 AI 시스템보다 조잡하다.

프롬소프트웨어는 내부적으로 AI의 기본 단위를 ‘Goal’이라 부른다. 하나의 Goal은 불변 함수 테이블로, 세 가지 핵심 콜백을 포함한다: activate(최초 실행 혹은 자식 Goal이 소진된 후 재활성화), update(매 프레임 호출, Continue/Success/Failure 반환), interrupt(외부 이벤트에 응답). 각 Actor(게임 내 NPC 또는 보스)는 Goal 스택을 유지한다 — 단순한 유한 상태 머신이 아니라, 스택 구조를 가진 PDA다.

런타임 로직은 극도로 단순하다: 매 프레임 스택 최상단의 Goal을 갱신한다. 현재 Goal이 자식 행동을 전개해야 하면, 서브 Goal 더미를 스택에 푸시하고, 다음 프레임부터 자동으로 가장 위의 것이 실행된다. Goal이 완료되면 스택에서 팝(pop)된다. 어떤 Goal이 실패하면 자식 Goal 체인 전체가 함께 팝되고, 제어권은 부모 Goal로 돌아간다.

CoolBossBattle을 예로 들어보자. 보스의 activate 함수 안에는 가중치가 부여된 동작 후보군이 있다: 원거리일 때, 죽음의 광선 가중치 15, 점프 공격 가중치 65; 중거리일 때, 지면 내려찍기 가중치 5, 약공격 연계 가중치 60, 강공격 연계 가중치 35. 가중치는 동적이다 — 쿨타임이 안 끝난 기술은 가중치가 0으로 초기화되고, 보스의 체력이 낮을수록 고위험 기술의 가중치가 올라간다. 매 라운드 의사 결정은 한 번의 가중치 랜덤 선택 후 해당 공격 Goal을 스택에 푸시하는 것이다.

여기에는 ‘플래닝’이 없다. 보스는 당신이 3초 후 어디에 서 있을지 예측하지 않고, 세계 모델을 구축하지 않으며, 몬테카를로 트리 탐색을 하지 않는다. 그저 매 의사 결정 사이클마다 명확히 정의된 몇 가지 조건(거리, 쿨타임, 체력, 난수)에 따라 동작 테이블에서 한 장의 카드를 뽑을 뿐이다.

그런데 왜 이렇게 어려운가

이것이 바로 프롬소프트웨어 설계 철학의 가장 핵심적인 역설이다: 적의 행동을 예측 가능하게 만드는 것이 오히려 전투를 더 어렵게 만든다.

흔한 오해는 “어려움 = 영리함”이다. 하지만 당신이 진짜로 컨트롤러를 던지게 된 게임 순간들을 떠올려보면, 가장 좌절스러운 죽음은 보통 적이 너무 영리해서가 아니다 — 적이 무엇을 하는지 이해할 수 없기 때문이다. NPC의 행동이 랜덤하게 보이고, 일관성이 없고, “얍삽하게” 느껴지면, 플레이어는 “내가 더 잘해야 해”에서 “이 게임이 날 엿먹이려 든다”로 순간 전환한다. 학습 과정이 종료된다. 좌절이 모든 것을 장악한다.

프롬소프트웨어의 접근법은 정반대다. 각 보스의 동작 라이브러리는 닫혀 있다. 모든 기술의 시작 모션, 공격 판정 프레임, 후딜레이는 고정되어 있다. 보스는 당신의 플레이 스타일을 “학습”하지 않는다 — 같은 가중치 랜덤 풀에서 계속해서 기술을 뽑아낼 뿐이다. 하지만 바로 이것이 당신이 보스를 학습할 수 있음을 의미한다. 아홉 번째 죽음과 첫 번째 죽음의 차이는, 보스가 약해져서가 아니라 당신의 뇌가 결정론적 시스템에 대한 리버스 엔지니어링을 완료했기 때문이다.

Lobsters 사용자 icefox는 댓글에서 정직한 말을 던졌다: “적 AI보다 영리해지는 것, 그게 《엘든 링》에서 당신이 가진 얼마 안 되는 우위 중 하나다.” 이 말은 거꾸로 읽어야 더 정확하다: 프롬소프트웨어가 AI를 플레이어가 “지혜로 이길 수 있는” 것으로 설계해둔 것이, 이 시리즈의 전투 경험이 성립하는 전제다.

이 설계 철학의 공학적 표현은: 예측 가능성 = 플레이 가능성. 창발적 행동은 복잡한 의사 결정 알고리즘에서 나오는 것이 아니라, 단순한 규칙이 서로 다른 플레이어 행동 아래에서 조합 폭발을 일으키면서 발생한다. 지연 베기가 클래식이 된 이유는 고급 AI를 썼기 때문이 아니다 — Attack Goal의 애니메이션 재생 중에 추가 대기 프레임을 몇 개 끼워 넣었을 뿐이다. 하지만 플레이어의 관점에서 이 문장은 이렇게 번역된다: “너는 프레임을 세는 법을 배워야 한다.”

왜 AAA 게임들은 ML AI를 쫓다가 실패하는가

프롬소프트웨어의 이 방식을 현재 AAA 게임의 AI 트렌드 속에 놓고 보면, 대비가 너무 커서 웃음이 나올 정도다.

지난 10년간 게임 업계의 AI 서사 주제는 “NPC를 더 영리하게 만들자”였다. 행동 트리는 사실상 표준이 되었다 — Halo 2가 2004년에 최초로 BT를 전투 AI 관리에 대규모 도입했고, 이후 Halo 시리즈는 BT를 극한까지 밀어붙였다. GOAP(Goal Oriented Action Planning)은 2005년 《F.E.A.R.》에서 적들이 우회하고, 장애물을 넘어가고, “재장전 중이다”라고 외치는 모습 때문에 지금까지 신화처럼 회자된다. Utility AI는 《심즈》에서 복잡한 일상 시뮬레이션을 구동할 수 있음을 증명했다. 모든 솔루션이 프롬소프트웨어의 PDA보다 복잡하다 — BT는 시퀀스 노드, 선택 노드, 병렬 노드, 데코레이터 노드가 있고, GOAP는 A* 탐색으로 행동 공간을 뒤져야 하며, Utility AI는 모든 옵션에 점수를 매겨야 한다.

하지만 복잡성에는 과소평가된 대가가 있다: 통제력 상실. 디자이너가 범용 플래너에 의존해 행동 시퀀스를 자동 조합할수록, NPC가 특정 상황에서 무엇을 할지 예측하기가 더 어려워진다. GOAP의 고전적 문제는 “플래너가 가끔 문을 열기보다 사다리로 문을 부수기로 결정한다”는 것이다. 행동 트리의 확장은 보통 “트리가 너무 깊어 아무도 이해 못 함”이라는 저주를 동반한다 — 10여 년 전 Bungie의 Damian Isla가 GDC 발표에서 경고했듯: Halo 3의 BT 복잡도는 디자이너가 행동의 인과 사슬을 완전히 이해할 수 없는 수준에 도달했다.

프롬소프트웨어에게 이것은 문제가 되지 않는다 — 애초에 AI에게 ‘자가 플래닝’ 능력을 주지 않았기 때문이다. 각 보스의 행동은 디자이너가 프레임 단위로 편곡한 것이다. 애니메이터가 공격의 선딜레이 프레임 수와 판정 프레임 수를 결정한다. 전투 디자이너가 쿨타임과 가중치 분포를 결정한다. 플레이어가 느끼는 ‘영리함’은 이 세 겹의 수공예가 겹쳐진 후의 창발적 효과에서 비롯되며, 어떤 알고리즘이 자기 멋대로 판단한 결과가 아니다.

이것이 공학 철학의 분기점이다. 한쪽은 “AI에게 범용 지능 프레임워크를 주고, 알아서 결정하게 하자”, 다른 한쪽은 “디자이너에게 충분히 단순하고 충분히 조합 가능한 인프라를 주고, AI의 모든 결정을 수동으로 제어하게 하자”. 프롬소프트웨어는 후자에 베팅했고, 이겼다.

인터럽트 시스템: 숨겨진 난이도 조절기

Goal 스택과 가중치 랜덤 선택 외에도, 프롬소프트웨어의 AI 시스템에는 세 번째 다리가 있다: 인터럽트(Interrupt).

각 Goal은 인터럽트 콜백을 등록할 수 있다. 특정 이벤트가 발생하면 — 플레이어가 아이템을 사용했거나, 주문을 시전했거나, 보스 뒤쪽의 특정 공간 영역에 서 있을 때 — 인터럽트 이벤트는 Goal 스택을 따라 상향 버블링하며, 어떤 Goal의 interrupt 콜백이 true를 반환하여 “내가 이 이벤트를 처리했다”고 알릴 때까지 올라간다. 처리 로직에는: 현재 Goal 스택 비우기, 즉시 새로운 공격 Goal 푸시하기, 부모 Goal의 상태 수정하기 등이 포함된다.

이것이 바로 영혼체 벨 베어링 헌터가 당신이 물약을 마실 때 거의 반드시 돌진하는 이유다 — 인터럽트 시스템에 UseItem 이벤트 감지 시 + 85% 확률 → 현재 동작 취소 후 즉시 돌진이라는 한 줄이 적혀 있기 때문이다. 당신은 보스가 ‘입력 읽기’를 한다고 생각하지만, 실제로는 하드코딩된 이벤트 콜백에 응답하는 것뿐이다.

이 시스템의 영리함은: 디자이너가 보스의 플레이어 행동에 대한 반응 강도를 정밀하게 제어할 수 있으면서도, 이 로직을 기본 의사 결정 루프에 섞어 넣지 않아도 된다는 점이다. 보스의 일상 행동(중거리 → 기술 테이블에서 무작위 추출)과 응급 행동(물약 마시는 중 → 바로 끊어버리기)은 두 개의 독립된 논리 채널이다.

HN 댓글란에서 누군가 물었다: 이 시스템이 Soulsborne 보스전보다 더 복잡한 시나리오를 처리할 수 있을까? nega.tv 저자의 답변은 “상당히 멀리 갈 수 있다”였다. 이유는 간단하다: PDA 프레임워크의 복잡도는 Goal의 수와 질에 관계될 뿐, 프레임워크 자체와는 무관하다. 마을 안의 모든 NPC가 각자의 일상 스케줄과 소셜 네트워크를 가진 오픈 월드를 만들고 싶은가? 수천 개의 Goal과 복잡한 편성 시스템이 필요할 것이다. 하지만 잊을 수 없는 보스전 하나를 만들고 싶은가? Goal 열몇 개, Havok Script 200줄이면 충분하다.

본질로의 회귀: 로우테크가 승리한 이유

처음으로 돌아가자: 왜 프롬소프트웨어의 상태 머신이 대다수 AAA 게임의 AI보다 나은가?

답은 기술 안에 있지 않다. 설계 철학 안에 있다. 프롬소프트웨어는 AI를 ‘지능 시뮬레이션’ 도구로 개발한 적이 없다 — 그들은 AI를 전투 설계의 전달 매체로 써왔다. 보스의 행동은 디자이너가 플레이어에게 쓰는 언어이며, 모든 기술, 모든 경직 탈출 윈도우, 모든 “한 대 더 때려도 된다”는 암시는 전부 의도된 것이다. AI가 너무 복잡해지고 너무 예측 불가능해지면, 이 언어는 단절된다. 플레이어는 더 이상 ‘전투를 배우는 것’이 아니라 ‘랜덤값을 견디는 것’이 된다.

더 실질적인 공학적 이점도 있다. PDA의 실행 효율은 BT보다 훨씬 높다 — 매 프레임 보통 스택 최상단의 Goal 하나만 갱신하면 되며, 루트 노드부터 트리 전체를 다시 순회할 필요가 없다. 프롬소프트웨어의 Goal 시스템은 제어 흐름을 명령형 코드에 작성하고, 데이터 모델은 극도로 간소화되어 — 각 Actor 위에는 부동소수점 배열 하나가 있고, Goal이 인덱스로 읽고 쓴다. 블랙보드도, 이벤트 버스도, 복잡한 조건/시퀀스/셀렉터 노드 트리도 없다. 저자는 글 업데이트에서 특별히 강조했다: 대부분의 AAA 게임에서는 “수만 개 노드의 행동 트리와, 제어 흐름과 동작을 구현하는 수백 개의 독립 노드”를 볼 수 있는 반면, 프롬소프트웨어의 단일 보스 행동은 보통 “상당히 작다”.

물론, 이것이 PDA가 대가 없는 만병통치약이라는 뜻은 아니다. Havok Script로 AI를 작성한다는 것은 비주얼 행동 편집 도구와 사실상 작별한다는 뜻이다 — 디자이너가 코드를 써야 한다. 인터럽트 시스템의 디버깅 난이도는 Goal 스택 깊이에 따라 기하급수적으로 상승한다. 범용 플래너가 없다는 것은 각 보스의 행동이 전부 수공예 커스터마이징이며, 재사용할 수 없다는 뜻이다 — 하지만 프롬소프트웨어에게 이것은 버그가 아니라 기능이다.

한 기술 선택의 정확성은, 궁극적으로 그것이 얼마나 진보했는가가 아니라 그것이 해결하려는 문제와 얼마나 일치하는가에 달려 있다. 프롬소프트웨어가 해결하려는 문제는 ‘더 영리한 AI 만들기’가 아니라, ‘더 읽기 쉽고, 더 배우기 쉽고, 더 공정한 적 만들기’였다. PDA를 쓰고 GOAP를 안 쓰며, 상태 머신을 쓰고 딥러닝을 안 쓴 것은, 그들이 뒤떨어져서가 아니다 — 그들이 원하는 것이, 바로 로우테크가 줄 수 있는 것이었기 때문이다.

이 글의 소재는 공개 정보와 커뮤니티 논의에서 가져왔습니다. 이 주제에 대해 더 깊이 있는 일차 경험이 있다면 글의 부족한 점을 지적해 주시기 바랍니다.