LLMOps 08
Agent 역할 정의서: 예측 가능한 시스템을 위한 책임 경계 설계
Agent를 여러 개 만들면 자동으로 역할이 분리된다고 생각하기 쉽다.
근거 · 교안 p26
1장: Agent, 많다고 다가 아니다: 모호한 역할의 위험
솔라는 거실 테이블에 노트북을 펼쳐놓고 무언가 골똘히 생각에 잠겨 있었다. 화면에는 여러 개의 작은 창과 아이콘이 복잡하게 얽혀 있는 프로그램이 떠 있었다. 마치 작은 로봇들이 각자 분주하게 움직이는 도시 같았다.
“언니, 이거 봐봐.”
솔라가 화면을 가리키자, 소파에서 책을 읽던 루나가 고개를 들었다.
“복잡한 AI 시스템을 만들 때 말이야. 그냥 기능을 아주 잘게 쪼개서 Agent를 여러 개 만들면 되는 거 아닐까? 각자 자기 역할을 맡아서 처리하면, 시스템이 알아서 잘 돌아갈 것 같은데. Agent가 많으면 많을수록 더 똑똑해지는 거지.”
솔라의 목소리에는 반짝이는 확신이 담겨 있었다. 복잡한 문제는 잘게 나누면 쉬워진다는 원칙. 그 원칙을 그대로 적용해 Agent를 여러 개 두면, 마치 숙련된 팀처럼 자동으로 역할이 분리되고 일이 처리될 거라는 기대였다.
루나는 잠시 솔라의 화면을 들여다보더니, 조용히 읽던 책을 덮었다. 정답을 알려주는 대신, 다른 그림을 그리기 시작했다.
“재미있는 생각이네, 솔라. 그럼 우리 머릿속으로 간단한 시스템을 하나 만들어볼까? ‘스마트 키친’ 시스템이야. 그리고 이 시스템에는 두 개의 Agent가 있어. 하나는 ‘요리사 Agent’, 다른 하나는 ‘장보기 Agent’.”
“간단하네.”
솔라는 즉시 대답했다. 이름만 들어도 역할이 명확하게 그려졌다.
“요리사 Agent는 레시피에 따라 요리를 하고, 장보기 Agent는 필요한 식료품을 사 오는 거지.”
“좋아. 그럼 사용자가 이 스마트 키친 시스템에 이렇게 말하면 어떨까?”
루나는 잠시 뜸을 들인 뒤, 결정적인 질문을 던졌다.
“‘냉장고에 우유가 다 떨어졌네.’”
솔라의 얼굴에 순간 당혹감이 스쳤다. 너무나 간단해 보였던 시스템에 예상치 못한 균열이 생긴 것 같았다.
“음… 그건 당연히 장보기 Agent가 처리해야지. 식료품을 사는 게 걔 역할이니까.”
솔라는 자신 있게 말했지만, 말끝을 스스로 흐렸다. 무언가 껄끄러운 부분이 느껴졌다.
루나는 아무 말 없이 솔라가 자신의 생각 속에서 길을 찾도록 기다려주었다.
“아니, 잠깐만.”
솔라는 미간을 좁혔다.
“만약에 요리사 Agent가 지금 당장 크림 파스타를 만들려고 우유가 필요한 상황이면 어떡해? 장보기 Agent가 정기 배송으로 주문할 때까지 기다릴 순 없잖아. 그럼 요리사 Agent가 급하게 우유를 주문할 수도 있겠네. 그런데… 만약 장보기 Agent도 사용자의 말을 듣고 동시에 우유를 주문하면?”
순식간에 솔라의 머릿속에 혼란스러운 장면이 펼쳐졌다. 다음 날 아침, 현관문 앞에는 우유가 두 팩 놓여 있을 것이다. 혹은 더 최악의 상황도 가능했다.
“서로 ‘네가 하겠지’ 생각하고 아무도 주문을 안 할 수도 있겠다! 요리사 Agent는 장보기 Agent의 역할이라고 생각하고, 장보기 Agent는 요리사 Agent가 급하게 쓸 거라 알아서 시켰을 거라고 지레짐작하는 거야. 결국 우유가 꼭 필요한 순간에 냉장고는 텅 비어있겠지.”
솔라는 가볍게 탄식했다. 깔끔하게 분리된 것처럼 보였던 두 Agent의 역할 경계가 ‘우유 주문’이라는 하나의 임무 앞에서 흐물흐물 녹아내리는 것을 목격한 것이다. 결과는 예측 불가능했다. 우유가 두 개가 될 수도, 하나도 없을 수도 있었다.
“이제 알겠다. Agent를 여러 개 만든다고 해서 역할이 자동으로 나뉘는 게 아니구나.”
솔라는 노트북 화면을 보며 중얼거렸다. 화면 속 분주하게 움직이던 아이콘들이 이제는 서로 부딪히거나, 누가 먼저 가야 할지 몰라 우왕좌왕하는 모습으로 보였다. 이름표만 붙여준다고 팀워크가 생기는 게 아니었다. 오히려 책임의 경계가 모호해져서 누구도 선뜻 나서지 않거나, 모두가 한꺼번에 달려드는 혼란만 커질 수 있었다.
“단순히 Agent의 개수를 늘리고 이름만 붙여주는 건… 예측 가능한 시스템을 만드는 것과는 전혀 다른 문제였어.”
솔라는 자신의 처음 생각이 얼마나 순진했는지 깨달았다. 문제는 Agent의 개수가 아니라, 그들 사이의 보이지 않는 선, 즉 책임의 경계였다. 명확한 경계가 없을 때 시스템은 언제든 오작동할 수 있는 시한폭탄과 같았다.
그렇다면 해법은 명확해 보였다. 흐릿한 선을 분명하게 만드는 것. 솔라는 새로운 질문을 향해 고개를 돌렸다.
“언니, 그럼 이 모호한 경계를 어떻게 해야 확실하게 그을 수 있어? 누가 무엇을 받고, 무엇을 처리한 뒤, 누구에게 넘겨줘야 하는지 어떻게 정해주는 거야?”
2장: 이름뿐인 역할은 금물: 입력과 출력으로 경계를 긋다
솔라는 거실 테이블에 새 노트를 펼쳤다. 어젯밤의 혼란스러웠던 ‘스마트 키친’ 시스템에 질서를 부여할 참이었다. 노트의 첫 페이지에는 큼지막한 글씨로 ‘Agent 역할 정의서’라고 적혀 있었다. 그 아래에는 깔끔하게 두 개의 단락이 나뉘어 있었다.
1. 요리사 Agent
- 역할: 레시피에 따라 요리한다.
2. 장보기 Agent
- 역할: 필요한 식료품을 구매한다.
솔라는 만족스러운 미소를 지었다. 이것이야말로 모호했던 경계를 명확히 하는 첫걸음이라고 생각했다. 각 Agent의 역할을 한 문장으로 정의했으니, 이제 서로의 일을 침범할 리 없다고 믿었다. 어제처럼 ‘우유 주문’을 두고 서로 미루거나 중복으로 처리하는 일은 없을 것이다.
“언니, 이거 봐봐. 내가 어제 그 문제, 이렇게 해결했어.”
솔라가 자랑스럽게 노트를 내밀자, 소파에 기대앉아 있던 루나가 몸을 일으켜 테이블로 다가왔다. 루나는 솔라가 정성 들여 쓴 노트를 잠시 들여다보았다. ‘요리사 Agent’, ‘장보기 Agent’. 이름과 역할. 분명 이전보다 정돈된 모습이었다.
“각자 맡은 역할을 글로 명확하게 써줬네.”
루나의 차분한 목소리에 솔라는 어깨를 으쓱했다.
“그치? 이제 ‘우유가 다 떨어졌네’ 같은 말이 나와도, 장보기 Agent가 자기 역할이니까 알아서 처리할 거야. 요리사 Agent는 요리에만 집중하고. 완벽한 분업이야.”
솔라의 확신에 찬 대답에, 루나는 고개를 끄덕이는 대신 질문을 던졌다.
“정말 그럴까? 만약 사용자가 ‘오늘 저녁 메뉴는 스테이크야’라고 말하면, 누가 반응해야 하지?”
순간 솔라의 표정이 미묘하게 굳었다.
“스테이크? 음… 그건 요리사 Agent가 들어야지. 요리 메뉴니까.”
“그럼 요리사 Agent는 스테이크를 만들기 위해 필요한 재료, 예를 들어 소고기, 아스파라거스, 버터가 있는지 확인하겠네. 만약 없다면?”
“없으면… 장보기 Agent한테 알려줘야지.”
“어떻게?”
루나의 짧은 질문이 핵심을 찔렀다. 솔라의 머릿속이 다시 복잡해지기 시작했다. 요리사 Agent가 장보기 Agent에게 ‘알려준다’는 것은 구체적으로 무엇일까? 말을 거는 걸까, 신호를 보내는 걸까? 장보기 Agent는 그 신호를 항상 듣고 있을까? 혹시 요리사 Agent가 ‘소고기가 없어!’라고 외쳤는데, 마침 장보기 Agent가 ‘오늘의 특가 상품’ 목록을 보느라 그 말을 듣지 못하면 어떡하지?
“결국 똑같잖아…”
솔라는 힘없이 중얼거렸다. 역할의 ‘이름’과 ‘설명’을 적어두는 것만으로는 충분하지 않았다. Agent들이 서로 소통하는 방식, 즉 어떤 정보를 ‘받아서’ 일을 시작하고, 어떤 정보를 ‘넘겨주는지’에 대한 규칙이 없으면 책임의 경계는 여전히 흐릿했다. 이름표만 ‘요리사’에서 ‘식료품 담당 요리사’로 더 길고 자세하게 바꾼다고 해결될 문제가 아니었다.
루나는 말없이 연필을 들어 솔라의 노트에 두 개의 빈칸을 추가했다. ‘요리사 Agent’와 ‘장보기 Agent’의 역할 설명 아래에 각각 ‘입력(Input):’과 ‘출력(Output):’이라는 단어를 적어 넣었다.
1. 요리사 Agent
- 역할: 레시피에 따라 요리한다.
- 입력:
- 출력:
2. 장보기 Agent
- 역할: 필요한 식료품을 구매한다.
- 입력:
- 출력:
“중요한 건 각 Agent의 정체성이 아니라 행동이야, 솔라. 그리고 모든 행동은 무언가를 받고, 무언가를 내보내는 흐름으로 정의할 수 있어. 이 빈칸을 우리가 직접 채워보면 어떨까?”
솔라는 루나가 만든 새로운 틀을 뚫어지게 쳐다보았다. 입력과 출력. 주고받는 것을 명시하라는 뜻이었다. 누가 무엇에 반응하고, 그 결과로 무엇을 만들어내는지 못 박아두는 것. 이것이 바로 경계를 긋는 구체적인 방법일지도 모른다는 생각이 들었다.
솔라는 연필을 집어 들고 다시 고민에 빠졌다. 잠시 후, 그녀는 신중하게 빈칸을 채워나가기 시작했다.
1. 요리사 Agent
- 역할: 레시피에 따라 요리한다.
- 입력: 사용자의 ‘{요리 이름}’ 요리 명령
- 출력: 해당 요리에 필요한 ‘식재료 목록’
2. 장보기 Agent
- 역할: 필요한 식료품을 구매한다.
- 입력: ‘식재료 목록’
- 출력: ‘주문 완료’ 확인 메시지
새로운 정의서를 완성한 솔라는 숨을 한번 골랐다. 이제 다시 ‘스테이크’ 상황을 시뮬레이션해 보았다.
사용자가 “오늘 저녁 메뉴는 스테이크야”라고 말한다. 이 말은 요리사 Agent의 입력 형식인 ‘{요리 이름} 요리 명령’에 부합한다. 요리사 Agent가 활성화된다. 장보기 Agent는 자신의 입력 조건인 ‘식재료 목록’이 아니므로 아무것도 하지 않는다.
요리사 Agent는 스테이크 레시피를 확인하고, 필요한 ‘식재료 목록’(소고기, 아스파라거스, 버터)을 출력으로 내보낸다.
이 ‘식재료 목록’은 정확히 장보기 Agent의 입력 조건과 일치한다. 이제 장보기 Agent가 활성화되어 목록에 있는 물품들을 주문하고, 일을 마친 뒤 ‘주문 완료’ 확인 메시지를 출력한다.
혼선이 사라졌다. 우유가 두 번 주문될 일도, 서로 미루다 아무도 주문하지 않을 일도 없었다. 모든 정보의 흐름이 단 하나의 길을 따라 움직였다.
“아…!”
솔라는 나지막이 탄성을 질렀다.
“경계라는 게 바로 이거였구나. Agent의 이름이나 역할 설명이 아니었어. 누가 무엇을 ‘받고’, 무엇을 ‘내보내는지’를 정의하는 것 자체가 경계를 만드는 행위였던 거야.”
단순히 역할을 나열하는 것을 넘어, 각 Agent가 책임져야 할 입력과 출력을 명확히 하자 비로소 시스템의 부품들이 맞물려 돌아가기 시작했다. 모호했던 책임의 영역이 칼로 자른 듯 명확해졌다. 솔라는 자신이 만든 ‘입력/출력 책임 경계’가 그어진 새 정의서를 보며 뿌듯함을 느꼈다.
하지만 동시에 새로운 궁금증이 고개를 들었다. 이렇게 각 Agent의 행동을 빡빡하게 정의하면 일 처리가 명확해진다는 것은 알겠다. 그런데 이것이 어떻게 시스템 전체를 더 ‘예측 가능하게’ 만든다는 걸까? 이건 그저 버그 몇 개를 잡은 것뿐 아닐까?
3장: 명확한 입력/출력이 만드는 예측 가능한 시스템
솔라는 자신이 어제 완성한 ‘Agent 역할 정의서’를 만족스럽게 바라보고 있었다. 너저분하게 얽혀 있던 생각의 실타래가 ‘입력’과 ‘출력’이라는 두 개의 축을 중심으로 깔끔하게 정리된 기분이었다. 이제 ‘요리사 Agent’와 ‘장보기 Agent’는 서로의 발을 밟거나, 해야 할 일을 미루지 않을 것이다. 모든 정보의 흐름이 명확한 파이프라인을 따라 흐르는 그림이 머릿속에 그려졌다.
하지만 그 뿌듯함 한편으로 미묘한 의문이 가시지 않았다. ‘우유 중복 주문’ 같은 특정 버그를 잡은 건 분명했다. 그런데 이게 정말 ‘예측 가능한 시스템’의 전부일까? 솔라는 ‘예측 가능성’이라는 단어를 펜으로 톡톡 건드리며 생각에 잠겼다. 그냥 시스템이 똑똑하게 결과를 잘 내놓으면 그게 예측 가능한 것 아닌가?
“언니.”
솔라가 고개를 들었다.
“입력과 출력을 정해서 책임 경계를 만드니까, 확실히 혼선은 줄어들겠어. 그런데 이게 어떻게 시스템 전체를 ‘예측 가능하게’ 만든다는 건지 아직은 잘 모르겠어. 그냥 버그가 줄고 결과가 좀 더 잘 나오게 되는 거랑, 예측 가능한 거랑 같은 말인가?”
솔라의 질문에는 ‘결과만 좋으면 장땡’이라는 순수한 의문이 담겨 있었다. 루나는 솔라의 질문에 바로 답하는 대신, 솔라가 보고 있던 노트를 향해 손짓했다.
“좋은 질문이야. 그럼 우리 두 개의 주방을 상상해볼까? 하나는 어제 네가 처음 생각했던, 이름표만 붙어있는 주방. 다른 하나는 방금 네가 완성한, 입력과 출력이 명확한 주방.”
루나는 솔라의 노트 옆에 작은 메모지를 한 장 더 놓았다.
“두 주방에 똑같은, 하지만 약간 애매한 주문을 넣어보는 거야. 예를 들면… ‘오늘 뭐 맛있는 거 없어?’”
솔라는 잠시 눈을 감고 첫 번째 주방을 떠올렸다. ‘요리사 Agent’와 ‘장보기 Agent’라는 이름표만 달랑 붙어 있는 혼란스러운 공간.
“첫 번째 주방에서는… ‘맛있는 거’라는 말을 듣고 요리사가 나설 수도 있고, 장보기 담당이 나설 수도 있겠네. 요리사는 자기가 아는 근사한 레시피를 제안할 거고, 장보기 담당은 오늘 마트에서 세일하는 품목을 알려줄지도 몰라. 아니면 둘 다 ‘내 전문 분야가 아닌데?’ 하고 서로 미룰 수도 있겠다.”
솔라의 미간이 좁혀졌다. 결과는 완전히 제멋대로였다. 근사한 파스타 요리법이 나올 수도, 대뜸 삼겹살 할인 정보가 튀어나올 수도, 혹은 아무런 대답 없이 침묵만 흐를 수도 있었다. 어떤 결과가 나올지 전혀 짐작할 수 없었다. 그야말로 예측 불가능한 상태였다.
이번엔 솔라가 심혈을 기울여 완성한 두 번째 주방, 즉 입력과 출력이 명확하게 정의된 시스템을 상상했다.
1. 요리사 Agent
- 입력: 사용자의 ‘{요리 이름}’ 요리 명령
- 출력: 해당 요리에 필요한 ‘식재료 목록’
2. 장보기 Agent
- 입력: ‘식재료 목록’
- 출력: ‘주문 완료’ 확인 메시지
솔라는 새로운 주문, ‘오늘 뭐 맛있는 거 없어?’를 이 시스템에 넣어보았다. 그러자 놀랍도록 명확한 결론이 나왔다.
“아무 일도… 일어나지 않아.”
솔라는 나지막이 중얼거렸다. ‘오늘 뭐 맛있는 거 없어?’라는 문장은 ‘요리사 Agent’가 알아들을 수 있는 ‘{요리 이름} 요리 명령’ 형식이 아니었다. 당연히 ‘장보기 Agent’의 입력 조건인 ‘식재료 목록’과도 거리가 멀었다. 두 Agent 모두에게 이 주문은 그저 스쳐 지나가는 소음일 뿐이었다. 아무도 반응하지 않는 것이 이 시스템의 정해진 동작이었다.
순간 솔라의 머릿속에서 무언가 ‘탁’ 하고 연결되는 느낌이 들었다.
“아! 예측 가능성이라는 게… 시스템이 항상 멋진 결과를 내놓는다는 뜻이 아니었구나.”
솔라는 흥분하며 목소리를 높였다.
“어떤 입력이 들어왔을 때, 시스템 안에서 어떤 일이 벌어질지, 혹은 아무 일도 벌어지지 않을지를 우리가 미리 정확히 알 수 있다는 뜻이었어! 정보가 흐르는 길이 정해져 있으니까, 그 길 위에 없는 건 무시되고, 길 위에 있는 건 정해진 순서대로 처리되는 흐름 자체를 우리가 볼 수 있는 거구나.”
흐릿한 안개가 걷히는 기분이었다. 예측 가능성이란 결과의 ‘품질’이 아니라, 과정의 ‘투명성’에 관한 문제였다. 각 Agent가 무엇을 받고 무엇을 내보낼지 명확하게 약속되어 있을 때, 비로소 우리는 시스템의 내부 동작을, 그 정보의 흐름을 손에 잡힐 듯 추적할 수 있게 된다. 어떤 입력에 대해 어떤 Agent가 활성화되고, 그 결과물이 다음 어떤 Agent를 깨울지, 최종적으로 어떤 결과가 나올지를 마치 설계도를 보듯 따라갈 수 있는 것이다. ‘입력/출력 정의의 명확성’ 자체가 바로 시스템의 예측 가능성을 평가하는 가장 중요한 지표였다.
모든 의문이 풀린 솔라는 후련한 표정으로 노트의 새 페이지를 넘겼다. 더 이상 질문은 없었다. 대신, 방금 깨달은 원칙을 사용해보고 싶어 손이 근질거렸다. 그녀는 노트 맨 위에 ‘개인 학습 도우미 시스템’이라고 적었다.
복잡한 시스템을 설계하는 첫걸음. 예전 같았으면 ‘계획 Agent’, ‘자료 검색 Agent’ 같은 이름부터 떠올렸을 것이다. 하지만 지금의 솔라는 달랐다. 그녀는 연필을 들고 Agent의 이름이 들어갈 자리를 비워둔 채, 가장 먼저 정보의 흐름부터 그리기 시작했다.
- 사용자가 “기말고사 준비해야 해”라고 말한다. (입력)
- 시스템은 시험 범위를 분석해 공부할 주제 목록을 만든다. (출력: 학습 주제 목록)
- 주제 목록을 받아, 각 주제를 공부할 순서와 일정을 짠다. (입력: 학습 주제 목록 / 출력: 주간 학습 계획표)
- 각 학습 주제에 맞는 추천 강의나 논문을 찾아 링크를 제공한다. (입력: 학습 주제 / 출력: 추천 자료 링크)
솔라는 자신이 그린 입력과 출력의 흐름을 보며 비로소 빈칸에 Agent의 이름을 채워 넣었다. ‘학습 분석가’가 ‘학습 주제 목록’을 만들면, ‘스케줄러’가 그 목록을 받아 ‘학습 계획표’를 짜고, ‘자료 탐색가’는 각 주제에 맞는 자료를 찾아준다.
이름이나 역할 설명이 아니라, 주고받는 약속을 먼저 설계하는 것. 그것이 예측 가능한 시스템을 만드는 핵심이라는 것을, 솔라는 이제 몸으로 이해했다. 그녀의 연필은 흔들림 없이 다음 책임의 경계를 그려나가고 있었다.