Multi-Agent 16
Router와 Conditional Edge: 역할 경계 명확화
Router가 답변까지 생성해도 된다고 생각하면 역할 경계가 흐려진다.
근거 · 교안 p54-p61
1장: Router의 역할: 분류와 라우팅, 그리고 메시지 생성 금지
솔라는 모니터에 떠 있는 시스템 아키텍처 다이어그램의 한 부분을 손가락으로 짚었다. ‘Router Agent’라고 적힌 네모 상자. 그리고 그 아래에 붙은 한 줄짜리 설명.
Router Agent는 사용자 입력의 의도를 분류해 destination만 업데이트하고...
이 문장이 며칠째 솔라의 머릿속을 맴돌았다. ‘에이전트(Agent)’라는 단어가 주는 느낌과 실제 역할 사이의 미묘한 간극 때문이었다. 스스로 판단하고 행동하는 주체. 솔라가 이해하는 에이전트는 그런 존재였다. 그런데 이 라우터 에이전트는 사용자의 의도를 파악하는 복잡한 일을 해내고도, 정작 자기는 아무런 결과물을 내놓지 않는다. 그저 ‘destination’, 다음 목적지만을 슬쩍 바꿔놓을 뿐이다.
“언니, 이것 좀 봐봐.”
솔라는 옆에서 조용히 책을 읽던 루나를 불렀다.
“이 라우터 에이전트 말이야. 역할이 너무 애매하지 않아? 사람 말을 알아듣는 똑똑한 녀석이라면서, 왜 자기가 직접 답을 안 하는 거지? 예를 들어 사용자가 ‘안녕’이라고 인사하면, 그냥 ‘안녕하세요’라고 답해주면 되잖아. 굳이 다른 전문가한테 넘길 필요도 없이. 그런데 얘는 의도만 파악하고 입을 꾹 닫고 있대. 꼭 자기 할 일을 다 안 하는 것처럼 느껴져.”
솔라의 말에는 일리가 있었다. 가장 먼저 사용자의 입력을 받아 분석하는 역할이라면, 간단한 응대 정도는 직접 처리하는 것이 효율적으로 보였다. 굳이 그 역할을 제한하는 이유가 명확히 와닿지 않았다.
루나는 솔라의 모니터를 잠시 들여다보더니, 말없이 자리에서 일어나 부엌으로 향했다. 잠시 후, 그녀는 쟁반에 3개의 빈 컵과 여러 색깔의 구슬이 담긴 그릇을 들고 돌아왔다. 루나는 컵 각각에 ‘기술 문의’, ‘환불 요청’, ‘일반 대화’라고 적힌 포스트잇을 붙였다.
“네가 지금부터 중앙 분류 담당자라고 상상해봐.”
루나가 솔라 앞에 구슬 그릇을 밀어주며 말했다.
“이 구슬들은 사용자들의 질문이야. 파란색은 기술 문제, 빨간색은 환불, 노란색은 그냥 잡담. 네 역할은 구슬 색깔을 보고, 맞는 컵에 던져 넣는 거야. 자, 시작해.”
솔라는 어깨를 으쓱하며 구슬을 하나 집었다. 파란색이었다. 솔라는 망설임 없이 ‘기술 문의’ 컵에 구슬을 넣었다. 다음은 빨간색, ‘환불 요청’ 컵으로. 노란색은 ‘일반 대화’ 컵으로. 몇 번 반복하자 금세 익숙해졌다.
“자, 이제 규칙을 하나 추가할게.”
루나가 말했다.
“구슬을 컵에 넣을 때마다, ‘이 구슬은 파란색이군요!’라고 외쳐야 해.”
솔라는 고개를 갸웃했지만 시키는 대로 했다. 파란 구슬을 집어 들고 “이 구슬은 파란색이군요!”라고 외친 뒤 ‘기술 문의’ 컵에 넣었다. 빨간 구슬을 보며 “이 구슬은 빨간색이군요!”라고 외치고 ‘환불 요청’ 컵에 넣었다.
“어때? 아까랑 뭐가 다른 것 같아?”
“음… 쓸데없는 말이 한마디 늘었지. 분류하는 속도도 조금 느려졌고. 어차피 내가 색깔을 보고 맞는 컵에 넣고 있는데, 굳이 그걸 말로 할 필요가 있나 싶어.”
“바로 그거야.”
루나는 솔라의 손을 멈추게 했다.
“네가 방금 ‘말’을 한 행위가, 라우터 에이전트가 직접 답변 메시지를 생성하는 것과 같아. 라우터의 유일한 임무는 들어온 요청을 보고 가장 적합한 다음 단계가 어디인지를 ‘결정’하는 거야. 파란 구슬을 ‘기술 문의’ 컵으로 보내는 것처럼 말이지. 여기서 라우터가 ‘기술적인 문제로 보이는군요’ 같은 메시지를 하나 생성하는 순간, 그건 분류 담당자가 구슬을 던져 넣으며 혼잣말을 하는 것과 같아. 시스템 전체로 보면 불필요한 잡음이고, 자신의 핵심 역할을 벗어난 행동이지.”
루나는 솔라가 처음 짚었던 문장을 다시 가리켰다. destination만 업데이트하고.
“여기서 ‘destination’이 바로 저 컵들이야. 라우터는 구슬의 색깔을 보고 어느 컵으로 가야 할지 목적지만 알려줄 뿐, 구슬 자체에 무언가를 쓰거나, 구슬을 넣으며 새로운 소리를 내지 않아.”
솔라는 구슬과 컵, 그리고 모니터 속 다이어그램을 번갈아 보았다. ‘에이전트’라는 단어에 갇혀 있던 생각이 조금씩 풀리는 기분이었다. 라우터의 역할은 ‘대화’가 아니라 ‘분류’에 있었다. 똑똑하지만, 자신의 지능을 오직 올바른 길을 가리키는 데에만 사용하는 교통 경찰처럼. 행동을 안 하는 게 아니라, ‘분류와 전달’이라는 행동에 모든 역량을 집중하고 있었던 것이다.
“아… 그럼 라우터는 대화에 참여할 능력이 없는 게 아니라, 시스템 설계상 그 역할이 엄격하게 금지된 거구나. 자신의 정체성이 ‘분류 전문가’인 거네.”
솔라가 중얼거렸다. 이제 라우터가 왜 침묵을 지키는지 이해가 되었다. 그것은 역할의 모호함이 아니라, 오히려 역할의 명확함 때문이었다. 자신의 책임 한계를 정확히 지키고 있었던 것이다.
그때, 새로운 질문이 솔라의 머릿속에 떠올랐다.
“알겠어. 라우터는 그냥 분류만 하고, 질문 구슬을 올바른 컵에 넣어주기만 하는 거네. 그런데… 그럼 그 컵에 담긴 구슬은 누가 처리해? 사용자에게 가는 최종 답변은 대체 어디서 만들어지는 거야?“
2장: 실제 답변은 누가 만드나: Expert Agent의 역할
솔라의 질문이 채 끝나기도 전에, 루나는 조용히 테이블 위를 정리하기 시작했다. 방금 전까지 솔라가 구슬을 던져 넣던 세 개의 컵, ‘기술 문의’, ‘환불 요청’, ‘일반 대화’. 그 컵들을 테이블 중앙으로 옮기더니, 루나는 서랍에서 작은 메모지 세 장을 꺼내 각 컵 옆에 나란히 놓았다. 아무것도 적혀 있지 않은, 그냥 하얀 메모지였다.
이 미묘한 행동의 변화가 솔라의 시선을 사로잡았다. 분류가 끝난 구슬들. 그 옆에 놓인 새로운 메모지. 방금 전까지 머릿속을 맴돌던 질문, ‘그래서 누가 답변을 만드는데?’라는 막연한 물음이 눈앞의 구체적인 사물들로 옮겨온 듯했다. 컵에 담긴 구슬은 이미 분류가 끝난 ‘문제’이고, 그렇다면 이 메모지들은 그 문제에 대한 ‘답’을 줄 주체를 상징하는 걸까?
“이게… 그 컵들을 담당하는 전문가들이야?”
솔라가 조심스럽게 물었다. 컵은 그저 그릇일 뿐, 그 안에 담긴 구슬을 처리하는 건 결국 누군가의 역할일 터였다. 라우터가 분류한 뒤에 이어질 다음 단계를, 루나가 또 다른 사물로 보여주고 있었다.
루나는 말없이 고개를 끄덕이며 ‘기술 문의’ 컵 옆에 놓인 메모지를 집어 펼쳤다. 그 안에는 솔라가 예상했던 ‘기술 전문가 아무개’ 같은 이름 대신, 몇 줄의 간결한 지시사항이 적혀 있었다.
[Expert: 기술 지원 에이전트]
- 입력: 사용자의 질문을 받는다.
- 임무: 질문을 분석하여 기술적인 해결책을 찾는다.
- 출력: 해결책이 담긴 답변 메시지를 생성한다.
솔라는 메모지를 받아들고 눈을 가늘게 떴다. ‘에이전트’라는 단어가 또 등장했지만, 지난번 라우터 에이전트와는 역할이 명확히 달랐다. 이 에이전트의 마지막 단계는 ‘답변 메시지 생성’이었다. 라우터에게는 엄격히 금지되었던 바로 그 행동.
호기심이 발동한 솔라는 ‘환불 요청’ 컵 옆의 메모지도 펼쳐보았다.
[Expert: 환불 처리 에이전트]
- 입력: 사용자의 질문을 받는다.
- 임무: 환불 정책을 확인하고 요청의 타당성을 검토한다.
- 출력: 검토 결과가 담긴 답변 메시지를 생성한다.
마지막 ‘일반 대화’ 컵의 메모리도 마찬가지였다. 각 메모지는 특정 분야에만 집중하는, 저마다 다른 임무를 가진 전문가의 프로필처럼 보였다.
“아…”
솔라의 입에서 나지막한 탄성이 터져 나왔다.
“그러니까 라우터는 우체국의 중앙 분류 담당자고, 이 메모지들이 각 부서의 담당자인 거구나. 기술 지원팀, 고객 서비스팀, 홍보팀 같은. 라우터는 편지를 어느 부서로 보낼지만 결정하고, 실제로 편지를 뜯어 읽고 답장을 쓰는 건 이 전문가 에이전트들의 몫이었던 거야.”
솔라는 이제야 전체 그림을 이해할 수 있었다. 시스템은 한 명의 만능 에이전트로 이루어진 게 아니었다. 각자의 책임 한계가 명확한 여러 명의 전문가가 협업하는 구조였다. 라우터의 역할이 ‘분류’에만 한정된 것은 비효율이나 역할의 모호함 때문이 아니었다. 오히려 각 분야의 전문가들이 자신의 일에만 온전히 집중하게 만들기 위한, 매우 의도적인 설계였던 것이다.
‘환불 처리 에이전트’는 기술적인 지식이 없어도 된다. ‘기술 지원 에이전트’는 사용자와 시시콜콜한 농담을 나눌 필요가 없다. 각자의 역할이 명확하게 분리되어 있었기에, 시스템 전체가 더 견고하고 효율적으로 작동할 수 있었다.
“역할 분담이 핵심이었네. 한 명이 모든 걸 다 하려고 하면 오히려 복잡해지고 실수할 가능성도 커지니까. 라우터가 답변을 만들지 않는 게 아니라, 만들 수 없도록 설계해서 각 전문가의 역할을 보장해주는 거였어.”
솔라가 고개를 끄덕이며 말했다. 이제 라우터의 침묵과 전문가들의 활약이 하나의 완성된 흐름으로 보였다. 막연했던 ‘누군가’의 자리를, 각자의 전문성을 지닌 에이전트들이 채워 넣자 모든 것이 명쾌해졌다.
그때, 솔라의 시선이 라우터가 구슬을 넣는 행위와 전문가 에이전트가 일을 시작하는 그 사이의 간극에 머물렀다.
“알겠어. 라우터가 ‘기술 문의’ 컵에 파란 구슬을 넣으면, 기술 지원 에이전트가 그걸 처리해서 답변을 만들어. 그런데… 시스템이 그걸 어떻게 알아? 라우터가 컵을 지정하는 행위가, 어떻게 정확히 그 담당 에이전트를 깨워서 일을 시키는 신호가 되는 거지? 그 연결고리는 뭐야?“
3장: Router와 Expert Agent 연결: Conditional Edge의 작동 방식
솔라의 질문이 끝나자, 테이블 위에는 잠시 정적이 흘렀다. 라우터가 구슬을 컵에 넣는 행위와, 전문가 에이전트가 일을 시작하는 행위. 그 사이의 보이지 않는 간극. 솔라의 시선은 ‘기술 문의’ 컵과 그 옆에 놓인 전문가 메모 사이의 빈 공간에 머물러 있었다. 분류와 실행, 두 단계는 명확히 이해했지만, 그 둘을 잇는 자동화된 ‘신호’의 정체가 모호했다.
루나는 솔라의 질문에 바로 답하는 대신, 테이블 옆에 놓여 있던 커다란 스케치북과 마커펜을 가져왔다. 그리고 테이블 위의 컵과 메모지들을 한쪽으로 잠시 밀어두고, 스케치북을 펼쳤다. 루나는 먼저 페이지 중앙에 네모 상자 하나를 그리고 ‘라우터’라고 적었다. 그리고 그 아래에, 조금 간격을 두고 ‘기술 전문가’, ‘환불 전문가’, ‘일반 대화 전문가’라는 세 개의 상자를 나란히 그렸다. 테이블 위의 구슬 놀이가 한 장의 도식도로 옮겨오는 순간이었다.
“라우터가 파란 구슬, 즉 기술 문의를 받았어. 그럼 이 그림에서 어떤 일이 일어나야 할까?”
루나가 마커펜 뚜껑을 열어 솔라에게 건넸다. 솔라는 잠시 망설이다 펜을 받아 들었다. 그리고 ‘라우터’ 상자에서 ‘기술 전문가’ 상자로 이어지는 화살표를 그었다.
“이렇게… 신호를 보내야지.”
“맞아. 그럼 환불 요청이 들어오면?”
솔라는 즉시 ‘라우터’에서 ‘환불 전문가’로 향하는 또 다른 화살표를 그렸다. 마지막으로 ‘일반 대화 전문가’에게도 화살표를 연결했다. 이제 ‘라우터’ 상자에서는 세 갈래의 길이 뻗어 나가고 있었다.
“좋아. 그럼 이제 가장 중요한 질문이야.”
루나가 말했다.
“라우터는 이 세 개의 화살표 중에 어떤 길로 가야 할지 어떻게 알려주지? 라우터가 직접 손으로 밀어주는 건 아닐 테고.”
솔라는 자신이 그린 그림을 들여다보았다. 화살표는 그냥 길일 뿐, 어떤 길을 선택할지에 대한 정보는 없었다. 라우터가 ‘기술 문의’라고 판단했을 때, 정확히 ‘기술 전문가’로 가는 길을 타도록 만드는 장치가 필요했다.
“음… 길마다 표지판을 세워두면 되지 않을까? ‘기술 문의는 이쪽’ 하고.”
“바로 그거야.”
루나는 솔라가 ‘기술 전문가’로 그은 화살표 위에 작게 글씨를 썼다.
만약, 목적지가 ‘기술’이라면
그리고 다른 화살표들 위에도 각각 만약, 목적지가 ‘환불’이라면, 만약, 목적지가 ‘일반’이라면 이라고 적었다.
“이 표지판이 바로 ‘조건부 엣지(Conditional Edge)’야. 그래프의 한 지점(노드)에서 다음 지점으로 넘어갈 때, 특정 조건을 확인하고 그 조건이 맞을 때만 흐름을 허용하는 길이지.”
루나는 처음 솔라가 혼란스러워했던 문장, destination만 업데이트하고를 다시 입에 올렸다.
“라우터가 하는 일이 바로 이 ‘목적지’ 값을 정하는 거야. 라우터는 ‘기술 문의입니다’라고 소리치거나 답변을 만드는 대신, 시스템만 볼 수 있는 메모지에 ‘목적지: 기술’이라고 딱 한 단어만 적어. 그러면 라우터에 연결된 조건부 엣지들이 그 메모지를 확인하는 거지. 그리고 ‘목적지가 기술이라면’이라는 표지판이 붙은 길만이 열리게 돼.”
솔라의 눈이 커졌다. 모든 조각이 맞춰지는 순간이었다. 라우터의 역할, 전문가의 역할, 그리고 그 둘을 잇는 메커니즘까지.
“아…! 라우터는 길을 안내하는 게 아니라, 그냥 행선지를 적은 푯말을 주는 거구나. 그럼 그 푯말을 보고 올바른 길로 보내주는 건 완전히 별개의 시스템, 이 조건부 엣지의 역할이었던 거네.”
라우터가 답변을 생성하지 않는 이유가 더욱 명확해졌다. 만약 라우터가 답변까지 생성하려 한다면, 푯말을 쓰는 동시에 길까지 안내하려는 것과 같다. 역할이 섞이고, 시스템은 복잡해진다. 오직 ‘분류 후 푯말 전달’이라는 한 가지 책임만 지기 때문에, 이 조건부 엣지라는 견고한 자동화 시스템과 완벽하게 협력할 수 있었던 것이다.
솔라는 마침내 모든 것을 이해했다는 듯 고개를 끄덕였다. 그리고 자리에서 일어나 자신의 모니터로 다가갔다. 며칠간 자신을 괴롭혔던 바로 그 아키텍처 다이어그램 앞이었다. ‘Router Agent’ 상자와 다른 전문가 에이전트 상자들 사이의 텅 비어 있던 공간.
솔라는 루나에게서 건네받았던 마커펜을 들고, 그 빈 공간에 직접 화살표를 그려 넣기 시작했다. ‘Router’에서 ‘tech_agent’로, ‘refund_agent’로, ‘general_agent’로. 그리고 각 화살표 위에, 방금 배운 가장 중요한 규칙을 작게 적었다.
destination == "tech"
destination == "refund"
destination == "general"
텅 비어 있어 모호하고 불완전해 보였던 다이어그램이, 솔라의 손끝에서 명확한 흐름과 규칙을 가진 완성된 설계도로 변하고 있었다. 더 이상 라우터의 역할은 애매하지 않았다. 그것은 시스템 전체의 효율성을 극대화하기 위한 가장 날카롭고 명확한 책임의 경계였다.