Discord e스포츠 봇을 위한 AI 라인업 최적화 도구 구축하기 (마케팅 용어가 아닌 실제 알고리즘)
요약
e스포츠 팀의 Discord 봇을 위한 라인업 최적화 도구 구축 과정을 다룹니다. LLM의 통계적 생성 방식 대신, 제약 충족 문제(Constraint Satisfaction Problem)를 해결하기 위한 고전적 최적화 알고리즘을 적용하여 효율적인 팀 구성을 구현하는 방법을 설명합니다.
핵심 포인트
- 라인업 구성은 제약이 있는 할당 문제(Constrained Assignment Problem)로 정의됨
- LLM의 추측 대신 명시적 규칙 기반의 탐색 및 최적화 방식 채택
- 플레이어 역할, 가용성, 로스터 상태를 고려한 목적 함수 설계
- 비정형 텍스트 추출과 조합 최적화의 차이점 명시
모든 e스포츠 팀의 캡틴은 적어도 한 번쯤은 이 작업을 수동으로 해본 적이 있습니다. Discord를 열고, "목요일 8시 이후에 플레이 가능합니다"라는 수십 개의 메시지를 훑어보고, 누가 Tank(탱커)를 플레이하는지 또는 DPS(딜러)를 플레이하는지와 대조하며, DPS 중 한 명이 사실은 교체 선수(sub)라는 사실을 기억해내고, 오늘 밤 실제로 스크림(scrim)을 진행할 수 있는 선발 5인조를 구성하려고 노력하는 것입니다. 이 과정은 15분이 걸리고, 약간의 실수를 하게 되며, 다음 날 똑같은 일을 반복하게 됩니다.
저는 경쟁 게임 팀을 위한 무료 Discord 봇인 Supatimer를 개발했으며, "내 라인업을 생성해줘"는 가장 많이 요청된 단일 기능이었습니다. 이 포스트는 라인업 최적화 도구(lineup optimizer)가 실제로 어떻게 작동하는지, 왜 이것이 진정한 AI인지(마케팅적인 의미가 아니라), 그리고 대규모 언어 모델(LLM)이 어디에 적합하고 어디에는 절대 적합하지 않은지에 대해 다룹니다.
이 산업에서 "AI"는 많은 일을 하고 있습니다
시장에 나와 있는 Discord 봇의 절반은 ChatGPT가 출시된 주에 자신들의 랜딩 페이지에 "AI"라는 문구를 붙였습니다. 보통 이는 어딘가에 LLM(Large Language Model)으로 프록시(proxy)되는 챗봇 명령어가 있다는 것을 의미합니다. 그것도 괜찮지만, 저녁 7시 45분에 8시에 스크림이 예정되어 있을 때 팀에 필요한 것은 아닙니다.
구분할 가치가 있는 AI의 두 가지 정직한 정의가 있습니다:
- 탐색 및 최적화 (Search and optimization) - 고전적인 분야입니다. 제약 충족(Constraint satisfaction), 조합 최적화(combinatorial optimization), 계획(planning). 이것은 "이러한 규칙과 자원이 주어졌을 때, 가장 적절한 유효한 배치를 찾아라"를 해결하는 AI의 부분입니다.
- 머신러닝 / LLM (Machine learning / LLMs) - 통계적인 분야입니다. 패턴 인식(Pattern recognition), 생성(generation), 비정형 텍스트로부터의 추출(extraction from unstructured text).
라인업 문제는 명백히 첫 번째 종류의 문제입니다. 그래서 저는 그것을 먼저 구축했습니다.
라인업 문제, 정확한 정의
게임 맥락을 제거하면 라인업은 제약이 있는 할당 문제(constrained assignment problem)입니다:
- N명의 플레이어가 있으며, 각 플레이어는 수행 가능한 역할 (roles) 세트(탱커 (Tank), 딜러 (DPS), 서포터 (Support), 인게임 리더 (IGL) 등)를 가집니다.
- 각 플레이어는 특정 시간대에 대한 가용성 (availability) 신호(가용, 아마도 가능, 불가능)를 가집니다.
- 각 플레이어는 로스터 상태 (roster status)(주전 (starter), 후보 (substitute), 트라이얼 (trial))를 가집니다.
- 게임은 **필요한 조합 (required composition)**을 정의합니다: Overwatch 2는 1 탱커, 2 딜러, 2 서포터를 원합니다. Valorant는 유연한 역할을 가진 5명을 원합니다. CS2는 5명을 원합니다.
- 당신은 역할 커버리지와 가용성 신뢰도를 최대화하면서, 후보보다는 주전을, '아마도 가능'보다는 확실한 '가용'을 선호하는 라인업을 원합니다.
이는 목적 함수 (objective function)가 추가된 전형적인 제약 충족 문제 (constraint satisfaction problem)입니다. 당신은 모델에게 추측을 요구하는 것이 아닙니다. 가능한 할당 (feasible assignments)을 열거하고 명시적인 점수에 따라 순위를 매기는 것입니다.
최적화 도구(optimizer)의 작동 방식
핵심 루프는 화려하지 않으며, 바로 그 점이 핵심입니다:
1. 대상 시간대에 대해 플레이어 풀을 "가용" + "아마도 가능"으로 필터링합니다.
2. 필요한 조합을 충족하는 후보 할당을 생성합니다
(모든 필수 역할 슬롯이 해당 역할을 수행할 수 있는 플레이어로 채워짐).
...
710명의 로스터 중 56명의 슬롯을 뽑는 경우, 후보 공간은 1초도 안 되는 짧은 시간 내에 전수 조사 (enumerate exhaustively)할 수 있을 만큼 충분히 작습니다. 휴리스틱 (heuristic) 추측이나 "모델이 이것이 좋다고 생각합니다"와 같은 모호한 설명은 없습니다. 만약 최적화 도구가 이 5명의 플레이어가 가장 높은 가용성 신뢰도로 완전한 역할 커버리지를 제공한다고 말한다면, 당신은 그 이유를 정확히 읽을 수 있습니다.
팀장의 역할은 라인업을 구성하는 것에서 라인업을 검토하고 수정하는 것으로 바뀝니다. 이것이 인체공학적(ergonomic) 측면에서의 완전한 승리입니다. Discord에서는 명령어 하나로 해결됩니다: /weekplan은 한 주 동안의 모든 시간대에 대한 최적의 라인업을 보여주고, /early-lineup은 다가올 단일 시간대에 집중합니다.
왜 그냥 LLM에게 물어보지 않나요?
이 부분은 2026년에도 개발자들이 실수하는 경향이 있는 부분이므로, 솔직하게 말씀드리겠습니다: 라인업을 선택하기 위해 언어 모델 (language model)을 사용해서는 안 됩니다.
- 하드 제약 조건 (hard constraints)을 위반할 수 있습니다. LLM은 그럴듯해 보이는 출력을 패턴 매칭(pattern-matched)하여, 탱커(Tank)가 두 명이고 서포터(Support)가 없는 "라인업"을 아무렇지 않게 내놓을 수 있습니다. 반면 제약 조건 해결사 (constraint solver)는 구조적으로 그럴 수 없습니다.
- 감사가 불가능합니다 (not auditable). 팀장이 "왜 내 메인 DPS가 벤치로 가나요?"라고 물었을 때, 확률 분포 (probability distribution)가 아닌 실제 답변("그 선수는 '아마도'라고 표시했고, 최적화 도구(optimizer)는 '가능'이라고 표시한 선발 선수를 선호했습니다")이 필요합니다.
- 느리고 비결정론적 (nondeterministic)입니다. 동일한 데이터로 실행할 때마다 즉각적이고 동일한 결과가 나와야 하는 작업에 있어서는 부적합합니다.
최적화 문제는 규모가 작고, 잘 정의되어 있으며, 규칙에 얽매여 있습니다. 이것이 바로 전통적인 AI (classical AI)가 언어 모델 (language model)을 압도하는 영역이며, 단지 "LLM 기반"이라고 주장하기 위해 그렇지 않은 척하는 것은 제품을 더 나쁘게 만들 뿐입니다.
LLM이 제 역할을 할 수 있는 곳
스크림 (scrim) 워크플로우 중에서 진정으로 언어 문제인 지점이 하나 있습니다. 바로 상대 팀으로부터 받는 난잡한 DM (Direct Message)입니다.
"요, 우리 너희 시간으로 9시에 tn 가능해, bo3, 우리가 bind 밴 하면 너희는 split 밴 해줘, 우리 디스코드 주소는 ..."
이것은 시간, 형식, 맵 베토 (map veto), 연락처 정보가 모두 뒤엉킨 비정형 자연어 (unstructured natural language)입니다. 정규 표현식 (regex)으로 이를 파싱 (parsing)하는 것은 승산 없는 싸움입니다. 그래서 Supatimer는 두 번째의 별도 AI 시스템을 갖추고 있습니다. 바로 어떤 자유 형식의 스크림 메시지에서도 시간, 상대, 형식, 맵 베토, 로비 상세 정보와 같은 구조화된 필드 (structured fields)를 추출하여 깔끔한 확인 메시지로 변환해 주는 LLM 스크림 파서 (LLM scrim parser) (현재 베타 버전)입니다.
이것이 바로 적재적소에 맞는 도구입니다. 언어 문제에는 언어 모델을, 제약 조건 문제에는 제약 조건 해결사를 사용하는 것입니다. 두 개의 서로 다른 시스템이며, 어느 것도 다른 시스템인 척하지 않습니다.
내가 배운 몇 가지 사항들
- 수학적 모델링을 하기 전에 도메인을 모델링하세요. "로스터 상태(roster status)"와 "잠재적 가용성(maybe availability)"을 데이터 모델에 반영하는 것이 작업의 80%를 차지했습니다. 입력 데이터가 깨끗하면 최적화 도구(optimizer) 자체는 간단해집니다.
- 결정론(Determinism)은 하나의 기능입니다. 팀들은 예측 가능한 도구를 신뢰합니다. 동일한 가용성 데이터가 입력되면, 매번 동일한 라인업이 출력되어야 합니다.
- 설명 가능성(Explainability)이 판매를 결정합니다. 라인업이 왜 선택되었는지 보여주는 것은 그 어떤 정확도 주장보다 회의론자들을 더 빠르게 설득합니다.
- 모든 것을 LLM으로 처리하려는 유혹을 뿌리치세요. 흥미로운 엔지니어링은 무엇을 언어 모델(language model)에 넘기지 않을 것인지 결정하는 과정이었습니다.
직접 체험해 보세요
라인업 최적화 도구는 현재 Supatimer에서 라이브로 운영 중이며, 역할 프리셋(role presets)이 이미 구성된 21개의 경쟁 게임에 대해 무료로 사용할 수 있습니다. 플레이어들은 Discord의 주간 캘린더에서 버튼을 눌러 가용성을 표시하며, /weekplan 명령어가 라인업을 생성합니다. 스크림 도구(scrim tooling)는 확인 및 점수 추적을 처리하며, LLM 스크림 파서(LLM scrim parser)는 베타 버전으로 출시되고 있습니다.
만약 당신이 경쟁 팀을 운영하면서 여전히 여기저기 흩어진 "목요일에 가능해요" 같은 메시지들을 보고 수동으로 라인업을 짜고 있다면, 더 이상 그럴 필요가 없습니다.
저는 Supatimer의 개발자 Raven입니다. 매일 밤 오버워치(Overwatch) 라인업을 수동으로 짜는 것에 지쳐서 이 최적화 도구를 만들었습니다. 질문이나 피드백이 있거나, 혹은 조건 해결사(constraint solvers)에 대해 깊게 토론하고 싶으신가요? Supatimer Discord에서 저를 찾아주세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기