203. 밀리언 스크립트
애당초 남의 코드라는 것이 뜯어서 본다고 프로그램 용도를 한번에 슥슥 파악할 정도로 분석이 쉬운 것이 아니다.
하물며 그것이 민준이 짠 코드이고, 주석까지 죄다 이해할 수 없는 용어로 쓰여 있으면 더 하고.
그렇기에 상혁이 모집한 마스터 급 프로그래머들은 코드 전체를 파악하려 하기 보다는, 기본적인 입출력 내용을 확인함으로써 민준이 짠 결과물의 ‘목적’을 파악하려 애썼다.
그러나 첨부된 실행파일을 실행 해봐도, 컴퓨터가 바로 멈춰버리는 상황에서 테스트를 통해 용도를 파악하는 것은 불가능했다.
결국 그들에게 남은 방법은 코드를 뜯어보는 것 뿐.
물론 민준이 코딩하는 방식이나 스타일 자체는 PTW의 직원이라면 누구나 자유롭게 접근할 수 있었기에 그들 모두가 그 스타일엔 익숙하다 할 수 있었다.
그러나 그럼에도 불구하고 민준이 짠 코드는 무언가가 빠져 있는 것처럼 알 수 없는 목적의 코드들로 가득 차 있었기에, 그들은 결국 상혁에게 ‘이게 무슨 용도의 프로그램인지 모르겠다. 단지 어떤 것을 분석해서 무언가 목적을 지닌 코드덩어리를 생성하는 프로그램으로 추정될 뿐.’라고 말해주었다.
아마도 민준이 비몽사몽한 상태에서 결정적인 뭔가를 빠트린 게 분명하다는 이야기와 함께.
결국 상혁은 미칠 듯이 궁금했지만 민준이 복귀할 때까지 얌전히 기다릴 수밖에 없었다.
그리고 민준이 복귀 한 날, 상혁은 20명의 마스터 클래스 프로그래머들의 요청을 물리치고 민준과 1:1로 이번에 작성한 코드에 대한 회의를 진행했다.
아마도 민준이 이번에 작업한 내용의 상당 부분이, 밝혀져서는 안될 ‘회귀 전 지식’과 관련되어 있다는 판단에서.
아무래도 그런 상황에서는 편하게 이야기 할 수 있도록 단 둘이 있는 편이 회의 진행이 매끄러운 편이었다.
눈치 보지 않고 회귀 전 타임라인의 이야기를 할 수 있으니까.
그리고 2일을 내리 쉬고 깔끔한 모습으로 회사로 돌아온 민준이 내뱉은 대답은, 상혁을 황당하게 만드는 내용을 담고 있었다.
“아, 이거 몇 개가 빠졌네.”
단순한 업로드 실수라는 해명에 상혁이 얼빠진 표정으로 자신을 바라보자 민준은 머리를 긁적이며 작업실로 이동해 나머지 파일을 올렸다.
그리고 부실로 돌아와 자신이 작업한 프로그램에 대한 브리핑을 하기 시작했다.
상혁이 원했던, ‘마치 스트리머랑 합방을 하는 듯한 느낌’을 게이머들이 받을 수 있는, 그런 형태의 AI를 구현하기 위해서 자신이 만든 프로그램에 대해서.
불가능해 보이는 개념의 구현을 위해 민준이 만든 프로그램은, 게임을 분석하여 성격에 따른 리워드를 뽑아낼 수 있는 일종의 ‘API 생성 프로그램’이었다.
“간단하게 말해서, 내가 만든 코드는 기존 게임의 코드를 분석해서 리액션 포인트를 자동 생성하는 API를 짜는 코드 생성 프로그램이야. 그리고 실행했을 때 이게 돌아가지 않던 이유는, 우선 분석할 타겟 프로그램도 없었거니와, 기본적으로 이 프로그램이 렌더링 센터의 성능을 전제해서 만든 프로그램이기 때문이지.”
“아. 그러니까 일반 컴퓨터에서는 안돌아가는 코드다?”
“맞아. 물론 모든 게임을 다 분석할 수 있는 건 아니지만···. 아직은 오류도 좀 있어. 하지만 적어도 유명한 오픈소스 고전게임 몇 종류는 성공적으로 분석 가능하더라고.”
“그럼 구체적으로 게임을 분석해서 만들어진 코드가 하는 일이 뭐야?”
상혁의 질문에 민준이 씩 웃었다.
그리고는 마커를 집어 들며 이야기했다.
“상혁이 너도 알다시피, 인간을 흉내 낸 대화형 AI를 만들기 위한 엄청난 시도가 있었지. 수십만 명의 카톡 대화를 무단으로 퍼다 가 그럴싸한 수준까지 근접한 완성된 ‘이루다’같은 경우도 있고, 시리나 알렉사, 코나타 같은 것도 그런 의도로 만들어진 물건이니까. 근데 실제로 사적인 대화를 시도해보면, 이루다가 알렉사나 코나타보다 대화가 자연스러워. 왜인지 알아?”
“아니.”
“이루다는 목적이 없이 흉내를 전제로 만들어진 프로그램이거든. 기본적으로 알렉사나 시리같은 전자 비서 AI들은 상대가 하는 이야기를 분석해서 자신에게 뭘 시키려는 것인지 파악하는 것을 목적으로 하는 프로그램이야. 하지만 이루다는 다르지. 그냥 상대 대화 안에 들어있는 단어를 분석해서, 자신이 가지고 있는 방대한 답변 중에 가장 근사치인 답변을 던지는 AI거든. 그럼 우리는 어떤 AI를 만들어야할까?”
“함께 게임을 플레이하는 거니 목적성이 있어야하고, 사람처럼 느껴지게 만들어야하니까 둘 다 만족시켜야하는 거 아냐?”
“맞아. 방금 말한 대로, 이루다는 자연스럽지만 단순히 DB에서 긁은 데이터 중에 가장 적합한 대화를 시도하는 기능밖에 없고, AI비서들은 대화 내용을 이해할 수 있지만 자연스럽지가 못하지. 난 두 AI의 장점을 합칠 방법을 고민한 거고.”
“그래서, 성공했다?”
“아직 그렇게 말하기는 이르지. 몇 가지 조건이 필요하니까.”
민준이 마커를 들어 화이트보드에 동그라미 몇 개를 그렸다.
“인간과 대화형 AI의 가장 큰 차이는, 인간은 ‘말하는 것’이 목적이고 대화형 AI는 ‘대답하는 것’이 목적이라는 거야. 이건 이루다든 AI비서든 똑같아. 예를들어줄게. 내가 지금 설명을 하는 도중에, 갑자기 상혁이 네가 대화 흐름과 전혀 상관없는 ‘저녁 뭐 먹을까?’라는 질문을 던졌어. 그럼 나는 뭐라고 답할까?”
“나중에 이야기하자, 아니면 간단하게 먹고 싶은 걸 답하거나 뜬금없다고 하겠지.”
“맞아. 그 경우 나에게 주어진 선택지는 2가지라고 할 수 있어. 지금 하고 있던 설명을 계속 이어나가기 위해 네 질문을 쳐낸다. 아니면 네 질문의 우선순위를 설명보다 높게 잡고 먼저 저녁 메뉴에 대한 대화로 주제를 변경한다.”
민준은 동그라미에 화살표 몇 개를 그어 분기점들을 만들었다.
“쳐내려고 하는 경우는 방법이 여러 가지 있겠지. ‘아무거나’라고 대답하고 저녁 메뉴에 대한 이슈가 넘어가기를 기대하거나, 아니면 갑자기 뜬금없는 메뉴 이야기를 꺼낸 널 비난하거나, 아니면 ‘넌 먹을 거 밖에 모르냐?’하고 욕을 한바가지 먹여주던가. 수많은 방법이 있지. AI가 절대 인간을 따라잡을 수 없는 이유 중 하나는, 그 대답하는 판단에 있어서 인간은 장기 데이터와 단기 데이터, 모두를 사용한다는 거야.”
“무슨 말이야?”
“예를 들어 장기데이터는, 대화의 흐름을 끊은 너에 대한 내 판단데이터를 기반으로 이루어지는 거야. 평소에도 그런 식으로 ‘내 목적을 방해하는’ 행위를 자주 하면서 그 주제가 항상 식사에 관한 것이라면, 난 상혁이 네놈이 돼지녀석이라고 판단하고 비난을 하는 스탠스를 취하겠지? 반면에 평소에 그러지 않던 애가 계속 저녁메뉴를 언급하면, ‘아, 얘가 지금 무지 배가 고프구나.’라고 판단할 수 있어.”
민준은 담담히 말을 이었다.
“그 판단 기준에 너의 표정, 어조, 목소리의 크기, 그리고 현재 내가 하려는 대화의 중요성. 그 모든 판단 기준을 슈퍼컴퓨터도 하지 못하는 속도로 엄청나게 자연스럽게 처리하는 게, 바로 인간의 뇌라는 거지.”
“그래서, 그 문제를 어떻게 해결했는데?”
“이렇게.”
민준은 보드에 그려놓은 동그라미 중에 하나를 골라, 거기에 ‘저녁식사’ 라는 글자를 적었다.
그리고 나머지 동그라미엔 ‘설명’ ‘망할 놈’ ‘대단한 이 몸’ ‘어때 멋지지?’ 같은 단어를 적어놓았다.
“너도 알다시피 인터넷에서 유행하던 것 중에 뇌 그림 속에 여러 가지 동그라미를 그려놓고 크기별로 그 사람이 중요하게 생각하는 것을 표현하는 그림을 본적이 있을 거야.”
“잠깐만, ‘망할 놈’동그라미 크기가 너무 큰 거 아냐?”
“사람이 어떠한 행동을 할 때, 그 안에서 여러 가지 판단 기준이 있고 그 안에서 크기별로 중요한 비중이 다르다는 거지.”
“생까지 말고 이놈아.”
“시끄러. 닥치고 내가 만든 개 쩌는 코드에 대한 설명이나 들으라고.”
“넵. 조용히 할게요.”
“그러니까 내가 만든 프로그램은, 게임을 뜯어서 그 안에서 ‘리액션을 취해야하는 포인트’를 잡아주는 프로그램이야. 매 게임 안의 상황 안에서, 전황이 극적으로 바뀌거나 AI의 목표 달성에 방해가 되는 상황이 발생하거나, 예측하지 못하는 뭔가를 발견했거나 할 때, ‘대화가 나와야 하는 타이밍’을 잡아주는 프로그램인거지. 그리고 그 타이밍에 게임에서 외부로 보내야하는 ‘상황 로그’를 만들어서 보내줘. 그럼 그걸 대화엔진이 받아서 그 상황에 맞는 대화를 하게 되는 거지.”
“그럼 그냥 상황에 따른 단순한 리액션 아냐?”
“그 프로그램만 두고 보면 그렇지.”
민준이 짠 프로그램은 그것 하나가 아니었다.
가장 중요한 것은, 그 ‘대화 엔진’이었으니까.
“기본적으로 내가 이번에 짠 커뮤니케이션 엔진은, 상황마다 각 AI별로 ‘시냅스(synapse)’라 부르는 의미 덩어리를 생성해. 예를 들어 같이 게임을 한다 치면, 로비 화면에서 분석 엔진으로 만들어낸 API가 보내는 ‘상황 로그’를 받고, 그 상황로그에 필요한 대화를 처리하기 위해 여러 개의 시냅스를 생성 하는 거지. 그 시냅스는 기본적으로 ‘유저와의 관계’ ‘지금 상황이 만들어진 흐름’ ‘하려는 게임의 종류’같은 여러 가지 요소들에 의해서 만들어지는 거야.”
synapse라고 보드에 영문을 적은 민주은 상혁을 바라보며 말했다.
“몇몇 시냅스는 게임을 시작하기 전의 상황에서 남아서 넘어온 것들이고, 몇몇 시냅스는 지금 게임 로비에 들어가면서 새로 생성된 것들이지. 커뮤니케이션 엔진이 그것을 받아서 중요도에 따라 ‘지금 무슨 대화를 할까’를 결정해. 그리고 플레이어가 대화를 시도하면, 그 즉시 대화 내용을 받아서 분석한 뒤 기존 시냅스의 내용과 연결되는 대화인지, 아니면 새 주제를 가진 대화인지 파악하고 새 주제라면 새 시냅스를, 기존 주제라면 관련된 시냅스의 중요도 레벨을 올리고 최종적으로 대답을 어떻게 할지를 결정하는 거지. 만약 플레이어의 질문을 받은 시냅스의 보정 값이 현재 AI가 가지고 있는 기존 시냅스의 중요도보다 낮다면, 플레이어의 대화를 무시하거나 건너뛰려고 시도하고.”
“중요도가 높으면 기존에 하려던 대화를 취소하고 플레이어에게 대답하려 한다?”
“맞아.”
상혁은 엄청난 충격을 받았다.
민준이 완성했다는 프로그램의 용도와 구조가, 자신이 상상하던 스케일을 아득하게 넘어서 있었기 때문에.
그리고 그런 민준의 설명을 듣던 상혁의 머릿속에는, 자연스레 하나의 질문이 떠올랐다.
민준이 지금 ‘대화’를 언급한 부분에 대해서.
“잠깐만, 민준아.”
“어.”
“근데 방금 ‘플레이어가 대화를 시도하면’ 이라고 말 한 거 맞아?”
“어. 그런데?”
“잠깐만, 그럼 네 말은, 지금 네가 짠 커뮤니케이션 엔진이, 플레이어가 하는 대화를 알아들을 수 있다고?”
“당연하지. 네가 원한 게 그거잖아?”
“아니, 나는 그냥 옆에서 상황에 맞게 ‘오빠 멋있어!’같은 추임새 정도 넣는 그런 AI를 말한 건데? 그런데 사람 말을 알아듣고 거기 맞게 반응하는 AI를 만들었다고?”
“그렇게 복잡한 개념이 아냐. 봐봐.”
민준은 자신이 그린 동그라미 주변으로 사람 얼굴모양의 테두리를 그렸다.
“이게 AI 1번이라고 쳐. 코드네임은 ‘천재’.”
그리고는 하나의 얼굴을 더 그린 뒤, 그 안에 여러 개의 동그라미를 그렸다.
“이게 AI 2번이야. 코드네임은 ‘돌아이’.”
“뭔가 기분 나쁘지만 일단 넘어가지. 계속 해봐.”
“결과적으로 대화라는 건, 이 각각의 시냅스 덩어리가 만들어낸 최종 조합의 결과물이야. 그리고 상대 AI가 말을 꺼내거나 게임 안에서 뭔가 행동을 취함으로써 이쪽 AI에 개입하면, 이쪽 시냅스의 구성이나 비중이 바뀌는 거지.”
“마치 사람처럼?”
“마치 사람처럼.”
민준이 설명을 이어갔다.
“그러니까 실제로 이 AI들은 게임을 하면서 다른 AI에게 살해당하거나, 살해하거나, 혹은 방해를 하거나 협조를 하면서, 다양한 ‘인풋’을 만들어낸다고. 그리고 그 인풋에 따라서 이쪽의 결정을 ‘행동’이나 ‘대사’로 표현하는 거고. 그럼 여기서 질문하나 할게.”
“어.”
“AI가 하는 행동이 최종적으로 대사나 행동으로 다른 AI에 개입한다면, 플레이어가 하는 행동이랑 대화와 다른 AI가 하는 그것을 컴퓨터가 구분할 수 있어?”
잠시 생각하던 상혁이 말했다.
“아니겠지.”
“맞아. 그러니까 사실 플레이어가 게임 안에서 하는 행동이나 대사도 전부 이 안의 AI가 하는 행동과 동일하게 처리하는 거야.”
“그러니까, 결국 플레이어의 행동도 게임 안에서 이루어지는 거라면 다른 AI가 하는 것과 다르지 않다?”
“이론상으로는 그렇지.”
상혁은 생각에 잠겼다.
눈앞에 있는 이 ‘미친 놈’이 완성한 물건이, 대체 어떤 식으로 쓰일 수 있을지에 대해 생각하기 위해서.
그리고 잠시 후, 고개를 든 상혁의 얼굴은 여전히 의문으로 가득 차 있었다.
“그게 가능해?”
민준이 말한 것은, 말하자면 이론상으론 그럴싸해 보일지 몰라도 실현 가능성이 제로에 가까워 보이는 물건이었기에, 상혁의 질문은 타당하다 할 수 있었다.
게다가 지금은 2012년이었으니까.
아무리 민준이 슈퍼 천재 괴물 프로그래머라고 하더라도, 그 정도 연산을 돌리는 물건을 콘솔 게임기에서 돌리겠다는 발언은 미친 생각이나 다름없었다.
그게 아무리 내년에 발매될 8세대 게임기라 하더라도.
그러자 민준은, 그제야 자신이 만든 물건의 한계점에 대해 이야기하기 시작했다.
“우선, 내가 말한 형태의 시스템을 돌리기 위해서, 몇 가지 제약이 생겼다는 건 말해둘게.”
“좋아. 그게 뭔데?”
“우선 복잡한 최신 게임을 커뮤니케이션 엔진과 함께 돌리는건 불가능해. 게임이 복잡할수록, 발생하는 인풋 량도 증가하고, 커뮤니케이션 엔진이 처리해야하는 시냅스 코드의 양도 어마어마하게 증가할 테니까.”
“그럼 어디까지 가능한데?”
“최대 잘 잡아도 어몽○스 정도.”
“그건 잘 돌아가?”
“원본 게임을 바닥부터 여기 맞게 최적화 하면, 아마 사람이 하는 거랑 크게 다르지 않은 수준까지는 가능할거야.”
“잠깐만, 어몽○스는 마피아 게임 아냐?”
“맞아.”
“그럼 네 말은 AI가 거짓말도 할 수 있다고?”
“어.”
“너 미쳤니?”
상혁은 어처구니가 없었다.
이전에 마나 엔진 때도 그랬지만, 민준이 만든 결과물이 2020년대를 기준으로 해도 구현이 불가능해 보이는 오파츠에 가까운 물건이었기 때문에.
그러나 민준은 그런 상혁의 눈빛을 받고도 어깨를 으쓱할 뿐이었다.
단지 자신은, 요청받은 것을 만들었을 뿐이라는 표정으로.
그리고 상혁은, 그런 민준을 보며 자신이 ‘인조학원’에 잡고 있던 모든 계획을 빠르게 수정해야했다.
민준이 만든 결과물의 효용성을 감안하면, 아예 게임 프레임 전체를 거기에 맞게 조정하는 것이 적합할 것이 분명했기 때문에.
그러나 그런 판단을 내리기에 앞서, 상혁은 먼저 확인해야할 것 이있다는 사실을 깨달았다.
민준이 만든, ‘사람처럼 행동하고 대화하는 AI’의 수준을, 먼저 파악할 필요가 있었기 때문에.
“민준아.”
“어.”
“그럼 지금 당장 테스트 가능하냐? 얼마나 사람같은지, 확인하고 싶은데?”
“아, 그렇지. 그게 우선이겠지.”
기대감에 가득 찬 눈빛으로 자신을 바라보는 상혁을 보며, 민준이 씨익 웃었다.
그러나 민준의 입에서 나온 대답은, 상혁의 그런 기대를 무참하게 깨부수는 대답이었다.
“미안한데 안 돼.”
“어?!!?”
“안 된다고. 지금 테스트 못해.”
“완성한 거 아니었어?”
“프로그래밍 적으로야 완성이지.”
그렇게 말한 민준이 테스트 프로그램을 실행했다.
그러자 마치 매트릭스를 연상하게 하는 수많은 텍스트들이 화면에 나란히 출력되기 시작했다.
“이게 뭐냐?”
“아까 말했잖아. 커뮤니케이션 엔진.”
“아니 근데 이건 게임이 아니잖아. 대화도 아니고.”
“당연하지. 그 안에서 만들 수 있는 대화 조합이 수천만 개인데, 그걸 내가 언제 다 입력하겠냐. 이건 그냥 스크립트 규칙에 맞게 함수를 생성해서 호출하는 프로그램일 뿐이야.”
민준의 이야기를 들은 상혁의 안색이 파랗게 질렸다.
이후에 민준의 입에서 나올, 다음 말이 무엇인지 바로 눈치 챘기 때문에.
“그럼 네 말은···.”
“아마 네 생각이 맞겠지.”
민준의 입가에, 마치 상혁을 연상하게 하는 사악해 보이는 미소가 걸렸다.
이제 프로그래밍의 단계는 끝났다는 것을, 그리고 상혁에게 지옥문이 열렸다는 것을 암시하는 사악한 미소가.
“이제 남은 건, 만들려는 성격대로 가능한 모든 수의 스크립트에 맞춰서, 대사를 집어넣어야지. 그것도 넣으려는 게임 종류에 맞춰서 말이야.”
그렇게 말한 민준은, 자리에서 일어나며 상혁의 어깨를 툭툭 두드렸다.
그리고는 이 말도 안 되는 코드를 만들도록 강요한 자신의 오랜 친구에게, 반격의 한 마디를 건넸다.
“가라! 상혁몬! 이제 남은 건 기획의 영역이다!”
허탈한 웃음을 짓는 상혁을 남겨두고, 민준은 다시 휴식을 취하러 나가버렸고, 회의실엔 상혁만이 홀로남아 모니터를 하염없이 바라보고 있을 뿐이었다.
그 모니터에는, 앞으로 자신이 채워야 할, 수많은 스크립트 번호들을 끊임없이 생성하고 있는 ‘괴물 같은 코드’가, 앞으로 채워야 할 말도 안 되는 작업량을 암시하듯 화려하게 반짝이고 있었다.
‘작업량이 얼마나 될지 짐작도 안가네 이거.’
그렇다고 포기할 수는 없었다.
민준이 만든 물건은, 단순히 작업의 난이도 때문에 포기하기엔 너무나도 매력적인 물건이었으니까.
그리고 상혁에게는, 나름 믿을만한 구석도 있었다.
적어도 스크립트에 필요한 텍스트를 채워 넣는 작업 인원으로는, 전 세계의 게임회사에서 가장 큰 규모의 스크립터 숫자를 보유하고 있는 개발사가 PTW였기에.
“어, 혁찬아?”
상혁은 휴대폰으로 혁찬에게 전화를 걸었다.
그리고 담담한 목소리로, 모니터를 바라보며 입을 열었다.
“포수 회귀 개발팀 전원, 지금 회의실로 불러줘.”
상혁이 작업을 맡기려 하는 개발자들.
그들은 바로 ‘텍스트로만 이루어진 야구 시뮬레이션 게임’이라는, 말도 안 되는 게임을 현실로 만들어낸, 세계 최고의 스크립터 집단이었다.