Multi-Agent 22
보이지 않는 지휘자: 네트워크 핸드오프의 비밀
중앙 Supervisor가 없으면 흐름 제어가 불가능하다고 생각하기 쉽다.
근거 · 교안 p92-p103
1장: 지휘자인가, 축구 선수인가
1. 지휘자인가, 축구 선수인가
솔라의 손끝이 태블릿 화면 위를 불안하게 맴돌았다. 화면에는 간결한 도식 하나가 떠 있었다. 왼쪽에는 ‘Supervisor: 오케스트라 지휘자’라고 쓰여 있고, 오른쪽에는 ‘Network: 축구 경기’라고 적혀 있었다. 강의에서 봤을 땐 명쾌한 비유라고 생각했는데, 혼자 다시 보니 영 개운치 않았다.
“이상하네…”
나지막한 혼잣말에, 맞은편에서 조용히 책을 읽던 언니 루나가 고개를 들었다.
“뭐가?”
“이거. 여러 에이전트가 협력하는 방식을 두 가지로 나눈 거 말이야.”
솔라는 태블릿을 루나 쪽으로 돌려 보였다.
“하나는 지휘자 모델. 중앙 관리자가 ‘다음은 바이올린, 그다음은 첼로’ 하고 일일이 지시하는 오케스트라 같은 방식. 이건 알겠어. 그런데 다른 하나가 문제야. 각 에이전트가 자율적으로 다음 단계를 정하는 네트워크 모델이라면서 예시가 ‘축구 경기’잖아. 근데 축구도 감독이 있잖아? 선수들이 완전히 자기 마음대로 뛰는 건 아니지 않아? 결국 경기장 밖의 지휘자가 있는 셈이니까, 이게 정말 다른 방식이라고 할 수 있나 싶어서.”
솔라의 말에는 날카로운 의심이 묻어났다. 중앙 통제가 없으면 각자 다른 생각만 하다가 우왕좌왕하며 혼돈에 빠질 거라는 생각이 머릿속을 떠나지 않았다. 예측 불가능한 혼돈. 솔라에게 ‘감독 없는 축구’는 그런 이미지였다. 결국 ‘네트워크 모델’이라는 것도 말만 바꾼 중앙 통제 시스템 아닐까.
루나는 솔라의 화면을 잠시 들여다보더니, 말없이 자리에서 일어났다. 그러고는 서랍에서 포스트잇 한 묶음과 펜을 가져와 테이블에 놓았다.
“잠깐 우리 둘이서 아주 간단한 일을 하나 처리해 보자.”
루나는 포스트잇 첫 장에 ‘업무 시작’이라고 적어 솔라 앞에 툭 내려놓았다. 솔라는 의아한 표정으로 그 쪽지를 집어 들었다.
“자, 이제 뭘 해야 할까?” 루나가 물었다.
“뭘 하긴, 언니가 다음 할 일을 알려줘야지.” 솔라가 당연하다는 듯 대답했다.
“내가? 왜?”
“언니가 이 일을 시작했으니까.”
“하지만 난 이제 쪽지가 없는데.” 루나는 빈 양손을 펼쳐 보였다. “그걸 들고 있는 건 솔라, 너잖아. 이제 뭘 할지 결정할 수 있는 사람은 너뿐이야. 난 네가 그걸 나한테 다시 주거나, 뭔가 행동을 취하기 전까지는 아무것도 할 수 없어.”
순간 솔라의 눈이 동그래졌다. 너무나 단순한 사실이었다. 지금 이 작은 ‘업무’의 열쇠를 쥔 사람은 쪽지를 손에 든 자신이었다. 루나는 시작을 했을 뿐, 현재의 진행 권한은 자신에게 넘어와 있었다.
“음… 그럼 내가 언니한테 뭔가 답을 써서 줘야겠네?”
“좋아. 그럼 거기에 ‘확인 완료’라고 쓰고, 그 뒤에 ‘이제 언니 차례야’라고 덧붙여서 나에게 건네줘.”
솔라는 루나가 시키는 대로 펜을 들어 글씨를 썼다. ‘확인 완료. 이제 언니 차례야.’ 그리고 쪽지를 루나에게 건넸다. 루나는 쪽지를 받아 들고는 빙그레 웃으며 다시 물었다.
“자, 그럼 지금은 누가 이 일을 처리할 차례지?”
“언니.” 솔라는 망설임 없이 대답했다. “이제 언니가 쪽지를 갖고 있으니까.”
그때였다. 솔라의 머릿속에서 뭔가 ‘아!’ 하고 연결되는 느낌이 들었다. 축구 경기의 본질. 감독의 전략 지시와 경기장 안에서 벌어지는 일 사이의 미묘한 차이.
“알겠다… 축구 비유가 감독을 말하는 게 아니었구나.”
솔라는 아까의 태블릿 화면을 다시 켰다. ‘Network: 축구 경기’라는 글자가 전과 다르게 보였다.
“감독은 전체적인 전략을 짜지만, 매 순간의 패스를 지시하진 않아. 지금 공을 가진 선수가 ‘다음은 누구에게 패스할지’ 결정하는 거잖아. 오케스트라 지휘자는 모든 연주자의 모든 음표를 지휘하지만, 축구 선수는 공을 가진 동안만큼은 완전한 제어권을 갖는 거야. 다음 행동을 결정할 권리. 바로 이 쪽지처럼!”
솔라는 방금 전까지 자신이 들고 있던 포스트잇을 가리켰다. 제어권. 그것은 하늘 위에 떠 있는 추상적인 권위가 아니었다. 지금 당장 공을 가진 선수, 쪽지를 손에 든 사람, 현재 작업을 수행하는 행위자에게 주어지는 구체적인 실행 권한이었다. 중앙 통제가 없어도, 공의 흐름이 곧 작업의 흐름을 만들며 질서가 유지되는 것이었다.
“맞아. 제어권이 누구에게 있는지, 중앙에 있는지 아니면 각자에게 흩어져 있는지 보는 게 첫 단계야.”
루나의 말에 솔라는 고개를 끄덕였다. 머리를 어지럽히던 안개가 한순간에 걷힌 기분이었다. 이제 시스템을 볼 때 ‘누가 지휘하는가?’가 아니라 ‘누가 공을 가졌는가?’를 먼저 물어보게 될 것 같았다.
하지만 명쾌해진 머릿속으로 새로운 질문이 스며들었다.
“그런데 언니. 방금 우리 게임에서는 언니가 나한테 ‘이제 언니 차례야’라고 쓰라고 말로 시켰잖아. 이건 그냥 우리 둘 사이의 구두 약속 같은 거 아냐? 실제 컴퓨터 시스템에서는 이런 약속을 어떻게 지키는데? ‘다음은 너야’라고 정하면, 시스템이 그걸 어떻게 알아듣고 진짜로 그 다음 녀석을 깨워서 일을 시키는 거지? 그냥 말로만 하는 약속이라면, 누구든 약속을 어기고 엉뚱한 곳으로 공을 던져버릴 수도 있잖아.”
솔라의 눈빛이 다시금 호기심으로 반짝였다. 보이지 않는 지휘자의 정체를 어렴풋이 눈치챈 것 같았지만, 그 지휘자가 어떻게 연주자들에게 신호를 보내는지는 여전히 수수께끼였다.
2장: 보이지 않는 약속
솔라의 질문이 채 공기 중에 흩어지기도 전에, 루나는 말없이 테이블 위의 포스트잇들을 정리하기 시작했다. 방금 전 둘이 주고받았던 쪽지, ‘업무 시작’과 ‘확인 완료. 이제 언니 차례야.’라고 적힌 그 쪽지였다. 루나는 그 옆에 새로운 포스트잇 한 장과 펜을 나란히 놓았다. 하지만 이번에는 무언가 달랐다.
루나는 새 포스트잇의 맨 아랫부분에 네모난 상자를 하나 그리고, 그 옆에 [다음:]이라고 썼다. 마치 편지 봉투의 수신인 칸처럼 보였다. 그리고는 그 위 여백에 펜으로 쓱쓱 그림을 그렸다. ‘솔라’, ‘루나’라고 이름 붙인 동그라미 두 개, 그리고 물음표가 그려진 세 번째 동그라미였다. 세 동그라미는 서로 아무런 선으로도 연결되어 있지 않았다. 텅 빈 관계도처럼 보였다.
이 기묘한 준비물을 보고 있자니, 솔라는 방금 전 자신이 던진 질문이 더욱 날카롭게 느껴졌다. ‘이제 네 차례야’라는 말은 그저 우리 둘 사이의 약속일 뿐이다. 컴퓨터 시스템이 어떻게 그 약속을 알아듣고, 배신하지 않고, 정확히 다음 사람에게 일을 넘긴다는 말인가?
“언니, 이 그림은 뭐야? 그리고 이 ‘다음’ 칸은?”
솔라의 목소리에는 지난 장에서 얻은 명쾌함 대신, 다시금 짙어진 의심이 섞여 있었다.
“만약 우리 둘 말고 다른 사람이 더 있다면 어떨까? 저 물음표처럼. 그리고 내가 ‘다음은 너야’라고 말하는 대신, 이 쪽지를 그냥 테이블 위에 올려두고 가 버린다면?”
루나의 말에 솔라는 잠시 상상해 보았다. 테이블 위에 덩그러니 놓인 쪽지. 누가 가져가야 할지 아무도 모른다. 먼저 집는 사람이 임자일까? 아니면 영원히 그 자리에 남아있을까? 그야말로 혼돈이었다.
“그럼 엉망이 되겠지. 누가 이걸 처리해야 할지 모르니까.”
“바로 그거야.” 루나는 새로 만든 포스트잇을 솔라 쪽으로 밀었다. “지난번 게임은 제어권이 누구에게 있는지 이해하기 위한 거였어. 이번에는 그 제어권을 ‘어떻게’ 넘기는지에 대한 규칙을 추가해 보자. 규칙은 하나야. 쪽지에 내 할 일을 적은 뒤, 반드시 저 [다음:] 칸에 다음 사람의 이름을 명시적으로 적어야 해.”
루나는 펜을 들어 먼저 시범을 보였다.
업무 내용: 상품 A 재고 확인 요청
[다음: 솔라]
루나는 쪽지를 솔라에게 건넸다. 지난번과 똑같이 쪽지를 건네는 행위였지만, 느낌이 완전히 달랐다. ‘이제 언니 차례야’라는 막연한 말이 아니었다. ‘다음은 솔라’라는, 누구도 부정할 수 없는 명백한 지시가 적혀 있었다.
솔라는 쪽지를 받아 들었다. ‘아, 내 이름이 적혀 있네. 이건 내가 해야 할 일이구나.’ 자연스럽게 책임감이 느껴졌다. 솔라는 잠시 고민하다가 펜을 들어 답을 적었다.
업무 내용: 상품 A 재고 3개 남음. 추가 주문 필요.
[다음: 루나]
쪽지를 루나에게 다시 건네는 순간, 솔라의 머릿속에서 무언가 번쩍했다. 이전에는 그저 대화 내용을 기록하는 메모장에 불과하다고 생각했던 ‘쪽지’의 역할이 다르게 보이기 시작했다. 이건 단순한 정보 저장소가 아니었다.
“아…!”
솔라는 자신의 태블릿을 켜서 강의 노트를 다시 띄웠다. 그곳에는 이런 문장이 있었다.
Handoff는 ... State에 다음 실행 대상을 명시하고 ...
솔라는 지금까지 State라는 단어를 그저 ‘상태’라고만 번역하며, 대화 기록이나 중간 계산 결과 같은 수동적인 정보 덩어리라고만 여겼다. 하지만 지금 눈앞의 이 쪽지가 바로 State였다. 그리고 그 안의 [다음: 루나] 라는 글자는, 단순한 메모가 아니었다. 그것은 미래의 흐름을 결정하는, 살아있는 명령어였다.
“알겠다! ‘제어권을 넘긴다’는 게 추상적인 약속이 아니었어. 그냥 ‘자, 받아’ 하고 공을 던지는 게 아니라, 공에다 ‘다음 받을 사람: 루나’ 라고 이름을 써서 보내는 거였구나! 제어의 흐름 자체를 공유하는 상태(State) 안에다 직접 기록하는 거였어.”
‘네 차례야’라는 말로 하는 약속은 얼마든지 어길 수 있고, 오해할 수도 있다. 하지만 모두가 함께 보고 있는 공유된 문서에 [다음: 루나]라고 명시적으로 쓰는 행위는 훨씬 더 구체적이고 강력한 장치였다. 이전의 제어권 소솔라가 다음 제어권 소솔라를 지목하는 행위. 이것이 바로 ‘보이지 않는 약속’의 실체였다. 제어권 전달은 구두 약속이 아니라, 공유된 State 객체에 ‘next_agent’라는 필드 값을 명시적으로 ‘쓰는(write)’ 구체적인 행위였던 것이다.
솔라의 얼굴에 다시 자신감이 어렸다. 보이지 않는 지휘자의 정체에 한 걸음 더 다가선 기분이었다. 이제 이 원리를 안다면, 여러 에이전트들이 중앙 통제 없이도 순서대로 협력하는 그림을 그릴 수 있을 것 같았다.
하지만 솔라는 루나에게 건넨 쪽지를 가만히 내려다보며 고개를 갸웃했다. 명쾌해진 머릿속으로 또 다른, 더 근본적인 질문이 파고들었다.
“그런데 언니, 이것도 이상하긴 마찬가지야. 이 쪽지에 ‘다음은 루나’라고 적혀있는 건 알겠어. 그런데 이 쪽지가 저절로 언니에게 날아가는 건 아니잖아. 결국 내가 직접 언니에게 건네줘야 하잖아? 컴퓨터 시스템 안에서는 누가 이 ‘쪽지 배달’ 역할을 하는 거지? 누가 [다음:] 칸을 읽고, 거기에 적힌 바로 그 사람에게 정확히 전달해주는 건데? 그 배달부가 결국 또 다른 중앙 관리자 아닐까?”
3장: 자동으로 움직이는 우체부
솔라의 날카로운 질문은 테이블 위에 놓인 쪽지, [다음: 루나]라고 적힌 그 작은 사각형에 무게를 더했다. 그 쪽지는 분명 다음 목적지를 품고 있었지만, 스스로 움직일 수는 없었다. 그저 테이블 위에서 다음 행동을 기다릴 뿐이었다.
솔라의 시선이 그 쪽지에 머무는 동안, 루나는 말없이 부엌으로 가 컵 세 개를 가져왔다. 그리고는 각각의 컵에 포스트잇을 붙여 이름을 적었다. ‘솔라’, ‘루나’, ‘물음표’. 마치 각자의 우편함이라도 되는 것처럼, 세 개의 컵은 테이블 위에 나란히 놓였다. 이어서 루나는 테이블 한가운데에 작은 쟁반을 두었다. ‘발송함’인 셈이다.
루나는 솔라가 루나에게 건넸던, [다음: 루나]라고 적힌 쪽지를 집어 들었다. 하지만 루나 자신의 컵에 넣는 대신, 그 쪽지를 ‘발송함’ 쟁반 위에 올려놓았다. 목적지가 적힌 편지가 우체통에 막 투입된 것 같은 풍경이었다. 그러나 거기까지였다. 쪽지는 더 이상 움직이지 않았다.
“봐, 언니. 내 말이 맞지?”
솔라는 그 광경을 보며 확신에 찬 목소리로 말했다.
“결국 누군가는 저 쟁반에서 쪽지를 집어서, ‘다음: 루나’라고 적힌 걸 읽고, 저 ‘루나’ 컵에 넣어줘야 하잖아. 그 일을 하는 존재가 있다면, 그게 바로 내가 말하는 또 다른 중앙 관리자, 똑똑한 지휘자 아니야?”
솔라의 미련은 끈질겼다. 제어권을 분산시켜도, 그 흐름을 연결하는 과정 어딘가에는 반드시 지성을 가진 존재가 개입해야만 할 것 같았다.
“좋아, 그럼 내가 그 ‘누군가’가 되어볼게.”
루나는 쟁반 앞으로 다가서며 말했다.
“대신 아주 중요한 규칙이 있어. 나는 지금부터 ‘우체부’야. 이 우체부는 생각하는 능력이 없어. 딱 한 가지 일만 할 수 있지. 발송함에서 쪽지를 집는다, 맨 아래 [다음:] 칸만 본다, 그리고 거기에 적힌 이름의 우편함에 넣는다. 끝. 내용이 뭔지, 누가 보냈는지, 왜 보내는지는 전혀 관심 없어. 아니, 볼 수도 없어.”
루나는 선언과 함께 로봇처럼 뻣뻣한 동작을 시작했다. 그녀는 쟁반에서 쪽지를 집어 들었다. 그리고는 눈을 가늘게 뜨고 마치 다른 내용은 보이지 않는다는 듯 쪽지 맨 아랫부분에 시선을 고정했다.
“음… [다음: 루나]… 확인.”
루나는 기계적인 목소리로 말하고는, 몸을 돌려 ‘루나’라고 쓰인 컵에 쪽지를 툭 떨어뜨렸다. 임무를 완수한 우체부는 생각도, 다음 행동도 없이 그 자리에 멈춰 섰다. 그 모습은 지휘자라기보다는 컨베이어 벨트 위의 로봇 팔에 가까웠다.
그 모습을 지켜보던 솔라의 눈빛이 미세하게 흔들렸다. 루나가 연기한 ‘우체부’는 결정을 내리지 않았다. 그저 입력된 값(‘루나’)에 따라 정해진 행동(‘루나’ 컵에 넣기)을 수행했을 뿐이다. 지성이나 판단이 개입할 여지가 전혀 없었다.
“우체부는… 똑똑할 필요가 없구나. 그냥 규칙만 따르면 되니까.”
“맞아.” 루나가 평소의 목소리로 돌아왔다. “이 우체부처럼, 시스템 안에도 미리 정해진 길을 연결해주는 장치가 있어. 그걸 ‘조건부 엣지(conditional edge)’라고 불러.”
루나는 솔라의 태블릿을 가져와 그림을 그리기 시작했다. 이전 장에서 그렸던, 선 없이 흩어져 있던 세 개의 동그라미(‘솔라’, ‘루나’, ‘물음표’)였다. 루나는 ‘솔라’ 동그라미에서 ‘발송함’ 쟁반으로 향하는 화살표를, 그리고 ‘발송함’ 쟁반에서 다른 세 개의 동그라미로 각각 뻗어 나가는 점선을 그렸다.
“솔라, 네가 작업을 마치고 [다음: 루나]라고 쓰는 행위는 이 ‘발송함’에 쪽지를 보내는 것과 같아. 그럼 이 점선들, 즉 ‘조건부 엣지’들이 일제히 쪽지를 확인하지.”
루나는 ‘발송함’에서 ‘루나’ 컵으로 향하는 점선을 굵은 실선으로 덧그렸다.
“그리고 ‘어, 내 목적지 이름이 적혀있네?’라고 확인된 이 길 하나만 진짜 길로 바뀌는 거야. 나머지는 그냥 없는 셈 치고. 이건 복잡한 if문이라기보다, 쪽지에 적힌 주소에 따라 자동으로 철컥하고 바뀌는 철로의 선로 전환기 같은 거야. 선로 전환기는 ‘이 기차가 어디서 왔을까’하고 고민하지 않아. 그냥 신호에 따라 길을 열어줄 뿐이지.”
그 순간, 솔라의 머릿속을 어지럽히던 마지막 안개가 걷혔다. 보이지 않는 지휘자. 그 정체는 사람이 아니었다. 관리자도 아니었다. 그것은 시스템의 구조 자체에 녹아 있는, 상태 값에 반응하여 자동으로 길을 여는 ‘규칙’이자 ‘경로’였다.
솔라는 자신의 태블릿을 돌려받아 강의 노트를 켰다. 그곳에는 오늘 하루 종일 그녀를 괴롭혔던 문장이 있었다.
...conditional edge로 동적 분기를 구성하는 방식...
이제 이 문장은 더 이상 암호처럼 보이지 않았다. 솔라는 이전과는 완전히 다른 눈으로 이 문장을 읽었다. ‘조건부 엣지’라는 단어가 마치 살아 움직이는 우체부, 자동으로 철컥거리는 선로 전환기처럼 느껴졌다. 중앙 통제 없이도 질서 있는 흐름을 만드는, 보이지 않는 지휘자의 심장이 바로 저기서 뛰고 있었다.
“알겠다… 전부 알겠어.”
솔라는 흥분을 감추지 못하고 말했다.
“비트토렌트 같은 P2P 파일 공유 시스템이 어떻게 중앙 서버 없이 돌아가는지 이제야 제대로 이해가 돼. 내 컴퓨터가 파일 조각 다운로드를 끝내면, 중앙 서버에 ‘이거 누구한테 줄까요?’라고 묻는 게 아니었어. 그냥 ‘이 조각이 필요한 다른 사용자(Peer)에게 전달하라’는 조건부 엣지 같은 프로토콜 규칙이 있는 거고, 네트워크라는 우체부가 그 규칙에 따라 자동으로 배달해주는 거였구나!”
솔라는 방금 전 루나가 그렸던 태블릿 화면을 가져왔다. 그리고는 펜을 들어 ‘발송함’과 ‘루나’ 컵 사이를 이었던 굵은 실선을 다시 한번 힘주어 따라 그렸다.
“지휘자는 여기 있었네. 연주자가 다음 연주자를 지목하고, 그 둘 사이를 이어주는 ‘약속된 길’ 그 자체가 바로 지휘자였어.”
테이블 위의 컵과 쪽지들은 더 이상 혼란스러운 문제가 아니었다. 그것은 솔라의 손으로 직접 검증하고 완성한, 명쾌한 분산 시스템의 축소판이었다.