LLMOps 31

멀티 Agent 보고서 생성 시스템: Trace와 평가로 품질 확보하기

평가 기능을 배웠지만 실제 멀티 Agent 루프에 어떻게 붙는지 막힌다.

근거 · 교안 p117-p118

멀티 Agent 보고서 생성 시스템: Trace와 평가로 품질 확보하기 대표 이미지

1장: Agent 루프의 핵심: ‘검토’ 지점 찾기

솔라는 노트를 내려다보며 미간을 살짝 찌푸렸다. 하얀 종이 위에는 보고서를 만드는 멀티 Agent 시스템에 대한 설명이 간결하게 적혀 있었다.

보고서 생성 Agent는 초안 생성, 검토, 재작성, 종료를 거친다. LangSmith에서 trace와 LLM-as-Judge 평가를 확인한다.

분명 모든 단어는 아는 것이었다. Agent가 초안을 쓰고, 그걸 검토하고, 다시 쓰는 과정을 반복한다는 것도, LangSmith라는 도구로 그 과정을 추적하고 평가한다는 것도 이해했다. 하지만 단어들이 나열된 문장을 읽을수록 머릿속 그림은 오히려 흐릿해졌다. 마치 잘 만들어진 자동차의 부품 목록을 하나하나 읊는 것 같았다. 엔진, 바퀴, 핸들, 브레이크… 부품 이름은 알지만, 그것들이 어떻게 맞물려 차를 움직이게 하는지에 대한 감각은 전혀 생기지 않았다.

“언니, 이것 좀 봐.”

솔라가 거실 테이블에 노트를 펼쳐놓자, 맞은편에서 조용히 책을 읽던 루나가 고개를 들었다.

“이 설명 말이야. Agent가 보고서를 만드는 과정이랑, 그걸 LangSmith로 확인한다는 거잖아. 그런데 아무리 읽어도 꼭 별개의 일을 순서대로 하는 것처럼 느껴져. Agent가 알아서 보고서를 다 만들고 나면, 우리가 나중에 LangSmith에 들어가서 ‘음, 잘 돌아갔군’ 하고 구경하는 느낌?”

솔라는 손가락으로 노트의 ‘평가’라는 단어를 톡톡 쳤다.

“특히 이 ‘평가’라는 게 대체 어디에 끼어드는 건지 모르겠어. Agent가 일을 다 끝낸 뒤에 찍어보는 성적표 같은 걸까? 만약 그렇다면, Agent가 스스로 ‘재작성’을 결정하는 데에는 아무런 영향을 못 주는 거 아냐?”

루나는 솔라의 말을 잠자코 듣더니, 시선을 노트에 잠시 두었다. 그리고는 말없이 옆에 있던 빈 이면지와 펜을 가져왔다. 설명 대신, 행동으로 답하려는 듯했다.

“솔라, 네가 방금 말한 그 Agent가 되어서 보고서를 만든다고 상상해 봐. 가장 먼저 뭘 할 것 같아?”

“음… 일단 주제랑 개요를 받아야지. 그걸 바탕으로 첫 번째 글, 그러니까 초안을 쓸 거야.”

솔라가 대답하자, 루나는 이면지 위에 네모 상자를 하나 그리고 그 안에 ‘초안 생성’이라고 적었다. 시작점이었다.

“좋아, 초안이 나왔어. 그다음은?”

“그다음엔… 더 좋게 만들어야지.”

“어떻게?”

루나의 간결한 질문에 솔라는 잠시 말문이 막혔다. 더 좋게. 너무 당연해서 깊이 생각해 본 적 없는 말이었다.

“일단 내가 쓴 초안을 다시 읽어봐야지. 주제에 맞게 썼는지, 내용은 충분한지, 혹시 이상한 문장은 없는지…”

“바로 그거야. ‘다시 읽어보는 것’. 그걸 뭐라고 부를 수 있을까?”

“검토?”

솔라의 대답과 동시에 루나의 펜이 움직였다. ‘초안 생성’ 상자 옆에 화살표를 긋고, 새로운 네모 상자를 그려 ‘검토’라고 썼다.

“자, 이제 가장 중요한 분기점이야. 검토를 해봤더니 초안이 아주 마음에 들어. 그럼 어떻게 할래?”

“그럼 끝이지! 보고서 완성.”

루나는 ‘검토’ 상자에서 아래로 화살표를 빼내 ‘종료’라고 적었다.

“그런데 검토해 보니, 중요한 내용이 빠졌고 결론도 이상해. 그럼 어떻게 하지?”

“당연히 다시 써야지. 빠진 내용 채워서.”

솔라가 자신 있게 외쳤다. 루나는 고개를 끄덕이며 ‘검토’ 상자에서 옆으로 화살표를 그었다. 그 끝에 ‘재작성’이라는 상자를 그렸다. 그리고 ‘재작성’ 상자에서 다시 ‘검토’ 상자로 돌아가는 화살표를 연결했다.

순간, 평평한 종이 위에 뱅글뱅글 도는 하나의 흐름, 즉 루프(loop)가 나타났다. 솔라의 눈이 동그래졌다. 단어의 나열이 아니라, 살아 움직이는 과정이 눈앞에 그려진 것이다.

솔라는 자기도 모르게 손가락으로 그림을 짚었다. ‘초안 생성’에서 시작해 ‘검토’로. 그리고 ‘재작성’을 거쳐 다시 ‘검토’로 돌아오는 순환선. 마음에 들 때까지 이 고리를 빙빙 돌다가, 마침내 ‘적합’ 판정이 나면 ‘종료’로 빠져나가는 구조.

“아…”

낮은 탄성이 터져 나왔다. 솔라는 고개를 들어 루나를 보았다.

“평가는… 우리가 밖에서 구경하는 게 아니었네. 이 그림에서 보면, ‘검토’ 단계 자체가 평가인 거구나. Agent가 다음 행동을 결정하기 위해 루프 안에서 스스로 거치는 과정이었어.”

솔라는 아까 자신이 톡톡 쳤던 노트의 문장을 다시 보았다. ③ 검토( 적합 부적합 판정). 이제야 이 괄호 안의 글자가 다르게 보였다. 검토는 그냥 훑어보는 행위가 아니었다. ‘적합’ 또는 ‘부적합’이라는 명확한 판정을 내리는, 시스템의 핵심 의사결정 지점이었다. 평가는 Agent가 일을 다 끝낸 뒤에 받는 성적표가 아니라, 더 나은 결과물을 내놓기 위해 스스로 길을 바꾸는 나침반이었던 것이다.

자신이 가졌던 오해가 선명하게 보였다. Agent의 행동과 우리의 평가를 완전히 분리해서 생각했던 것. 하지만 이 그림은 명확히 보여주었다. 평가는 Agent의 반복적인 작업 루프 안에 깊숙이 내장된 엔진의 일부라는 것을.

솔라는 완성된 다이어그램의 ‘검토’ 상자를 손가락으로 꾹 눌렀다. 이제 평가가 어디에 있는지는 알겠다. 하지만 새로운 궁금증이 고개를 들었다.

“언니, 그럼 이 ‘검토’ 단계에서 Agent는 대체 뭘 기준으로 ‘적합하다’, ‘부적합하다’를 판단하는 거야? 사람처럼 글을 읽고 ‘음, 이건 좀 별로인데?’ 하고 느끼는 건 아닐 거 아냐.”

2장: ‘검토’ 단계의 기준: LLM-as-Judge의 역할

솔라는 언니와 함께 그렸던 다이어그램을 가만히 내려다보고 있었다. 펜 끝으로 ‘검토’라고 적힌 네모 상자를 톡톡 건드렸다. 어제는 이 상자의 ‘위치’를 발견한 것만으로도 큰 수확이라 생각했는데, 하룻밤 자고 나니 그 속이 궁금해져 좀이 쑤셨다. ‘적합/부적합 판정’. 이 두 단어가 마치 굳게 닫힌 문처럼 느껴졌다.

솔라는 펜을 들어 ‘검토’ 상자 옆 빈 공간에 무언가 적기 시작했다. 스스로에게 던졌던 질문에 대한 답을 직접 찾아보려는 시도였다. 뭘 기준으로? 라고 작게 쓴 뒤, 잠시 고민에 잠겼다. 만약 내가 보고서를 검토한다면 무엇을 볼까?

”…일단 주제에서 벗어나면 안 되고.” 혼잣말과 함께 첫 번째 항목을 적었다. 그리고는 “내용이 이상하게 흘러가거나, 말이 안 되면 그것도 탈락.” 두 번째 항목을 추가했다. 마지막으로 “주장은 있는데 근거가 없으면 텅 빈 깡통 같잖아.” 세 번째 항목까지 적고 나서야 펜을 내려놓았다. 솔라의 노트에는 어느새 ‘검토’ 상자를 향해 뻗어 나가는 세 개의 작은 화살표와 기준들이 자리를 잡았다.

  1. 주제 일치성: 엉뚱한 소리를 하는가?
  2. 논리적 명확성: 앞뒤가 맞는 말을 하는가?
  3. 근거 충분성: 주장을 뒷받침하는 내용이 있는가?

그때, 솔라의 움직임을 조용히 지켜보던 루나가 입을 열었다.

“훌륭한 기준이네. 나라면 솔라, 너에게 보고서 검토를 믿고 맡길 수 있겠어.”

“정말? 그냥 생각나는 대로 적어본 건데.” 솔라는 쑥스러운 듯 웃었다. “그런데 언니, 내가 궁금한 건 바로 다음이야. 이 멋진 기준들을 Agent는 어떻게 알아듣고 판단을 내리는 걸까? ‘논리적 명확성’ 같은 건 기계가 이해하기엔 너무 추상적이잖아.”

루나는 솔라가 적어놓은 기준들을 손가락으로 가리켰다.

“바로 그 지점이 중요해. 만약 보고서에 ‘결론’이라는 단어가 포함되어 있는지, 혹은 문단이 정확히 5개인지 같은 규칙을 검사한다면 간단한 코드로도 충분하겠지. 하지만 솔라 네가 정한 기준들은 단순한 규칙이 아니야. 글의 ‘의미’를 파악해야만 판단할 수 있는 것들이지.”

루나는 잠시 말을 고르더니, 새로운 질문을 던졌다.

“글의 의미를 가장 잘 이해하는 존재가 지금 우리 주변에 있지 않나?”

순간 솔라의 머릿속에 번개가 쳤다. 글을 쓰고, 요약하고, 번역하고, 심지어 그림까지 그리는 그것.

”…설마, LLM(거대 언어 모델)?”

“맞아.” 루나는 고개를 끄덕였다. “바로 그 LLM에게 ‘판사’의 역할을 맡기는 거야. 이걸 ‘LLM-as-Judge’, 즉 ‘판사로서의 LLM’이라고 불러.”

루나의 말에 솔라의 눈이 커졌다. Agent가 글을 쓰면, 또 다른 Agent가 그 글의 심판을 본다는 발상이었다. 자신이 세웠던 기준들이 단순한 바람이 아니라, ‘판사 Agent’에게 내리는 구체적인 ‘판결 지침’이 될 수 있다는 뜻이었다.

“아! 그럼 내가 적은 이 기준들을… ‘이 보고서 초안은 주제에 일치하고, 논리적으로 명확하며, 근거가 충분한지 평가해서 ‘적합’ 또는 ‘부적합’으로만 답해줘’ 같은 프롬프트로 만들어서 다른 LLM에게 던지는 거구나!”

솔라는 방금 자신이 뱉은 말을 곱씹으며 전율했다. 평가가 더 이상 막연한 품질 점수 매기기가 아니었다. 적합/부적합이라는 명확한 신호를 만들어내기 위해, 평가 기준을 정의하고(평가 기준 정의), 그 기준에 따라 판결을 내릴 ‘판사’를 지정하는, 아주 구체적이고 공학적인 과정이었던 것이다. ‘검토’라는 네모 상자는 더 이상 닫힌 문이 아니었다. 그 안에는 보고서 초안, 평가 기준 프롬프트, 그리고 판사 LLM이 들어가 치열하게 재판을 벌이는 법정이 있었다.

LLM-as-Judge : 품질 의미 기반의 평가. 노트에 적힌 이 개념이 이제야 선명하게 다가왔다. 키워드 개수나 글자 수를 세는 기계적인 평가가 아니라, 글의 맥락과 뉘앙스라는 ‘의미’를 기반으로 품질을 판정하는 것. 그래서 ‘판사’로 LLM이 필요했던 것이다.

모든 조각이 맞춰지는 느낌에 잠시 흥분했던 솔라의 표정에 다시 새로운 물음표가 떠올랐다.

“알겠어. ‘검토’ 법정에서 판사 LLM이 ‘부적합!’이라고 땅땅 판결을 내렸어. 그럼 그 다음은? 그 ‘부적합’이라는 판결문이 어떻게 Agent를 ‘재작성’이라는 행동으로 이끄는 거지? 마치 기찻길의 선로를 바꾸는 신호수처럼, 누군가 그 흐름을 제어해줘야 하는 거 아냐?“

3장: 평가 결과로 루프 제어하기: 조건부 재작성

솔라는 어제 그렸던 다이어그램 위에 펜을 든 채 허공에서 멈춰 있었다. ‘검토’라는 상자 안에서 ‘판사 LLM’이 ‘부적합!’을 외치는 장면까지는 선명하게 그려졌다. 하지만 그 다음이 문제였다. ‘부적합’이라는 판결문이 어떻게 ‘재작성’이라는 행동으로 이어지는가. 마치 거대한 기계의 두 부품 사이에 연결 벨트가 빠져 있는 듯한 공허함이 느껴졌다.

결국 솔라는 펜을 움직였다. ‘검토’ 상자에서 ‘재작성’으로 향하는 화살표 위에 커다란 물음표를 그려 넣었다. 그리고 그 옆에 ‘신호수 Agent?’라고 작게 적었다. 판사의 판결을 듣고, 기찻길 선로를 바꾸듯 다음 행동을 지시하는 또 다른 존재가 필요할 것만 같았다. 완성된 그림은 이전보다 더 복잡해졌지만, 그만큼 솔라의 머릿속 혼란을 정확하게 보여주고 있었다.

“언니, 역시 모르겠어.”

솔라는 자신이 더 복잡하게 만들어버린 그림을 루나에게 내밀었다.

“‘검토’ 법정에서 ‘부적합’ 판결이 나왔어. 그럼 이 판결문을 누군가 보고, ‘아, 부적합이구나. 재작성 루프로 돌아가라!’ 하고 명령을 내려줘야 하는 거 아냐? 내가 그린 이 ‘신호수’처럼 말이야. 판결 따로, 흐름 제어 따로. 이렇게 역할이 나뉘는 게 맞는 것 같은데.”

루나는 솔라가 그려 넣은 ‘?’와 ‘신호수 Agent?’를 말없이 들여다보았다. 솔라의 오해가 어디에 있는지, 그 작은 낙서가 명확하게 보여주고 있었다. 루나는 솔라의 펜을 건네받아, 그 ‘신호수 Agent’를 지우는 대신 새로운 그림을 그리기 시작했다.

루나는 ‘검토’ 상자 바로 다음에 화살표 대신 마름모(◇) 기호를 그렸다. 그리고 마름모의 양옆과 아래로 세 개의 새로운 화살표를 뽑아냈다. 하나는 ‘재작성’으로, 다른 하나는 ‘종료’로 향했다. 갑자기 등장한 낯선 도형에 솔라의 시선이 집중됐다.

“신호수 대신, 갈림길을 두는 거야.”

루나가 말했다.

“‘검토’ 단계의 판사 LLM은 그냥 ‘부적합!’이라고 소리치지 않아. 약속된 형식, 예를 들어 ‘판정: 부적합’이라는 꼬리표(label)를 정확히 돌려주지. 그럼 이 마름모, 즉 ‘조건부 분기점’은 그 꼬리표를 확인하는 거야.”

루나는 마름모에서 ‘재작성’으로 가는 화살표 위에 ‘만약 “부적합”이면’이라고 적었다. 그리고 ‘종료’로 가는 화살표 위에는 ‘만약 “적합”이면’이라고 썼다.

“만약 꼬리표가 ‘부적합’이라고 쓰여 있으면, 이쪽 길로 가서 ‘재작성’을 다시 시작해. 만약 ‘적합’이라고 쓰여 있으면, 저쪽 길로 가서 과정을 ‘종료’하는 거지. 별도의 신호수 Agent가 고민하고 판단하는 게 아니야. 그냥 정해진 규칙에 따라 자동으로 길이 나뉘는 거야.”

순간 솔라의 머릿속에서 거대한 톱니바퀴가 ‘철컥’ 하고 맞물리는 소리가 들리는 듯했다. 신호수가 필요한 게 아니었다. 처음부터 길이 두 갈래로 나 있었고, 어떤 길로 갈지는 ‘판정’이라는 꼬리표가 이미 결정해주는 것이었다. 평가 결과는 단순히 루프 밖에서 확인하는 점수가 아니라, 루프의 흐름을 능동적으로 제어하는 ‘키(key)’였다.

“아…!”

솔라는 손바닥으로 이마를 쳤다.

“평가 결과가 곧 길을 안내하는 이정표였네! 나는 판결을 내리는 판사랑, 그 판결문을 보고 선로를 바꾸는 신호수가 따로 있는 줄 알았는데… 그냥 판결문에 다음 역 이름이 적혀 있었던 거구나.”

솔라는 자신의 노트 첫 장에 적혀있던 문장을 떠올렸다. ④ 부적합일 경우 ② 단계로 이동 적합일 경우, 종료. 처음에는 그저 과정을 요약한 설명문처럼 보였던 문장이었다. 하지만 이제는 달랐다. 그것은 마치 컴퓨터 코드의 ‘if-then’ 문처럼, 시스템의 동작을 제어하는 명백한 규칙으로 읽혔다. LLM-as-Judge의 판정 결과에 따라 Agent의 흐름을 ‘재작성’ 또는 ‘종료’로 분기하도록 설계하는 것. 이것이 바로 ‘조건부 루프 제어’의 핵심이었다.

자신의 힘으로 다이어그램을 완성한 솔라는 뿌듯한 미소를 지었다. 초안 생성, 검토, 조건부 분기, 재작성, 종료. 이제 모든 부품이 제자리에 연결되어 완벽하게 작동하는 기계처럼 보였다. 그런데 그 완벽한 흐름도를 보고 있자니, 새로운 걱정이 스멀스멀 피어올랐다.

“언니, 그런데 이 루프가 한 번만 도는 게 아니잖아. 만약 Agent가 쓴 초안이 계속 ‘부적합’ 판정을 받아서 이 갈림길을 세 번, 네 번 반복해서 돌았다면? 우리가 나중에 문제가 생겼을 때, 대체 어느 지점에서, 몇 번째 바퀴에서 잘못된 건지 어떻게 찾아낼 수 있지? 마치 핀볼 게임에서 이리저리 튕기는 공을 눈으로만 쫓는 기분일 것 같은데.”

4장: LangSmith Trace: 반복 과정의 흐름 시각화

솔라는 자신이 어제 완성한 다이어그램을 보며 깊은 한숨을 내쉬었다. 어제까지만 해도 모든 부품이 완벽하게 맞물려 돌아가는 기계처럼 보였던 그림은, 하룻밤 사이에 엉망으로 엉킨 실타래가 되어 있었다. 그녀의 펜 자국이 문제였다. ‘만약 Agent가 계속 부적합 판정을 받으면 어떡하지?’라는 질문에 스스로 답을 찾으려 한 흔적이었다.

그림 위에는 ‘초안 1 → 검토 → 부적합’이라는 흐름 옆에, 다시 ‘재작성 1 → 검토 → 부적합’이라는 흐름이 덧그려져 있었다. 그리고 또다시 ‘재작성 2 → 검토 → 적합 → 종료’라는 흐름이 겹쳐 있었다. 화살표들은 서로를 가로지르고, ‘검토’ 상자는 여러 개의 선이 뒤엉켜 지저분했다. 처음의 명쾌했던 루프 구조는 온데간데없고, 어떤 ‘재작성’이 어떤 ‘검토’로 이어지는지 한눈에 파악하기 불가능했다. 솔라는 펜을 내려놓고 머리를 감쌌다. 자신이 걱정했던 ‘핀볼 게임’의 혼란이 종이 위에 그대로 재현된 것 같았다.

“언니, 역시 안 되겠어.”

솔라의 목소리에 맞은편에 있던 루나의 시선이 솔라의 노트로 향했다. 루나는 솔라가 망쳐버린 다이어그램을 잠시 들여다보았다. 솔라의 혼란이 그림 위에서 소리치고 있었다.

“어제는 이 조건부 루프가 완벽한 해답 같았어. 그런데 막상 루프가 여러 번 돈다고 생각하고 그려보니까… 그냥 뒤죽박죽이야. 나중에 이 기록을 본다고 해도, 그냥 ‘초안 생성, 검토, 재작성, 검토, 재작성, 검토…’ 이런 식으로 시간 순서대로 쭉 나열된 텍스트밖에 더 있겠어? 첫 번째 ‘검토’에서 왜 실패했는지, 두 번째 ‘재작성’은 어떤 내용을 고쳤는지 어떻게 구분해? 그냥 로그(log) 더미일 뿐이잖아.”

솔라는 자신이 그린 엉망인 그림을 손가락으로 가리켰다. 자신의 생각이 틀렸음을 증명하는 증거물이었다.

“네 말이 맞아.”

루나가 의외로 순순히 동의했다.

“만약 모든 기록이 한 줄로 길게 이어진 목록이라면, 네가 말한 혼란이 벌어지겠지. 하지만 우리가 길을 찾을 때 평면 지도만 보는 건 아니잖아.”

루나는 솔라의 펜을 들어, 너저분한 다이어그램 옆 깨끗한 공간에 새로운 그림을 그릴 준비를 했다.

“솔라, 네가 상상하는 그 ‘기록’을 직접 한번 그려봐. 단, 규칙이 있어. 평평한 목록이 아니라, 컴퓨터의 폴더처럼 계층을 만들어서 그려보는 거야. Agent가 일을 한 번 시작하면, 그 전체 과정이 담긴 가장 큰 폴더가 하나 생긴다고 상상해 봐.”

솔라는 잠시 망설이다 펜을 잡았다. ‘폴더’라는 말에 무언가 번뜩이는 느낌이 들었다. 그녀는 먼저 커다란 사각형을 그리고 보고서 생성 작업 1이라고 이름을 붙였다. 이게 가장 큰 폴더였다.

“좋아. 그 폴더 안에 첫 번째로 무슨 일이 일어나지?”

“‘초안 생성’.”

솔라는 보고서 생성 작업 1 안에 들여쓰기를 해서 - 초안 생성이라고 적었다. 그다음은 ‘검토’였다. 솔라는 같은 단계에 - 검토라고 적었다.

“자, 이 ‘검토’ 단계 안에서는 또 무슨 일이 벌어질까? 어제 우리가 얘기했던 법정이 열리잖아.”

그 말에 솔라의 손이 다시 움직였다. 그녀는 ‘검토’ 아래에 한 단계 더 들여쓰기를 해서 -- 판사 LLM 호출 (결과: 부적합) 이라고 적었다. 이제 ‘검토’는 단순한 이름표가 아니라, 그 안에 다른 작업을 품고 있는 작은 폴더가 되었다.

“‘부적합’ 판정이 나왔으니, 다음은 ‘조건부 분기’를 통해 ‘재작성’으로 가겠지.”

솔라는 다시 바깥 단계로 나와 - 재작성 (1차) 이라고 적고, 그 아래에 다시 - 검토를, 그리고 그 안에 -- 판사 LLM 호출 (결과: 적합) 이라고 그렸다. 마지막으로 - 조건부 분기를 거쳐 종료에 다다랐다.

그림이 완성되자 솔라는 숨을 멈췄다. 너저분한 실타래와는 비교도 안 될 만큼 명쾌한 구조가 눈앞에 있었다. 모든 작업이 하나의 큰 ‘작업’ 폴더 안에 순서대로 정리되어 있었고, ‘검토’와 같은 복잡한 단계는 그 안에 또 다른 하위 작업을 품고 있는 형태로 시각화되었다. 각 단계가 언제, 어떤 순서로, 그리고 어떤 작업의 일부로 실행되었는지 한눈에 들어왔다. 루프가 여러 번 돌아도 더 이상 헷갈리지 않았다. 첫 번째 ‘검토’와 두 번째 ‘검토’는 같은 이름이지만, 명백히 다른 시간대의 다른 맥락에 위치한 별개의 폴더였다.

“아…!”

솔라는 낮은 탄성을 내뱉었다.

“이건… 이건 단순한 기록 목록이 아니야. 실행의 ‘족보’나 ‘가계도’ 같은 거네! 모든 단계가 부모-자식 관계처럼 연결되어 있어. 이렇게 보면, 수십 번을 반복하더라도 내가 원하는 특정 시점의 ‘검토’ 폴더를 열어서 그 안의 ‘판사 LLM 호출’ 결과를 정확히 찾아낼 수 있겠어.”

루나는 고개를 끄덕였다. “바로 그게 ‘실행 추적(LangSmith)’이 하는 일이야. Agent가 밟아간 모든 경로를, 네가 방금 그린 것처럼 시각적인 계층 구조로 남기는 것. 그래서 우리는 이걸 ‘실행 추적 시각화’라고 부르기도 해. 네가 걱정하던 핀볼 게임이 아니라, 모든 경로와 환승 지점이 명확하게 표시된 지하철 노선도를 보는 것과 같아.”

실행 추적(LangSmith). 노트에 적혀 있던 이 건조한 단어가 이제 솔라에게 전혀 다른 의미로 다가왔다. 그것은 단순히 로그를 쌓는 행위가 아니었다. 복잡하게 얽힌 Agent의 사고 과정과 의사결정의 흐름을 한눈에 파악할 수 있도록 펼쳐 보여주는, 강력한 시각화 도구였던 것이다.

솔라는 자신이 그린 두 개의 그림, 엉망인 실타래와 명쾌한 폴더 구조를 번갈아 보았다. 자신의 오해가 어떻게 풀렸는지 명확하게 보였다. 그런데 문득, 새로운 의문이 고개를 들었다.

“언니, 그럼 이제 알겠어. 이 ‘지하철 노선도(Trace)’가 있으면 Agent가 어디로 어떻게 움직였는지 전부 볼 수 있어. 그리고 ‘판사 LLM’은 각 역마다 보고서가 좋은지 나쁜지 평가 점수를 매겨줘. 그런데… 이 두 개가 어떻게 같이 일하는 거지? 마치 여행 경로가 그려진 지도랑, 각 장소의 평점을 매긴 리뷰 사이트를 따로 보는 느낌이야. 이 두 정보를 합쳐서 다음 여행 계획을 더 좋게 짜려면 어떻게 해야 하는 거야?”

5장: 통합 검증: Trace와 평가의 시너지로 품질 확보

솔라는 테이블 위에 자신이 그린 두 개의 그림을 나란히 펼쳐놓고 턱을 괬다. 왼쪽에는 어제 완성한, 컴퓨터 폴더 구조처럼 깔끔하게 정리된 Agent의 실행 경로, 즉 ‘Trace’가 있었다. 오른쪽에는 가상의 평가 결과를 메모한 작은 쪽지가 놓여 있었다.

1차 검토: 부적합 2차 검토: 적합

솔라는 왼쪽 그림의 검토 (1차) 단계를 손가락으로 짚고, 다시 오른쪽 쪽지의 부적합 글자를 쳐다봤다. 그리고 다시 왼쪽 그림의 검토 (2차)와 오른쪽의 적합을 번갈아 보았다. 두 정보는 명백히 연결되어 있었지만, 물리적으로 분리된 종이 위에 있으니 마치 서로 다른 세상의 이야기처럼 느껴졌다. 어제 루나에게 던졌던 질문이 다시 머릿속을 맴돌았다. 잘 그려진 여행 경로 지도와, 각 장소의 평점을 따로 모아놓은 리뷰 사이트를 번갈아 보는 기분.

“언니, 역시 이상해.”

솔라는 결국 고개를 저으며 말했다.

“지도를 보다가, 리뷰 사이트에 가서 해당 장소 이름을 검색해서 평점을 확인하고, 다시 지도로 돌아와 다음 경로를 보는 것 같아. 물론 이렇게 해도 여행 계획을 짤 수는 있겠지. 하지만 너무 번거롭고, 한눈에 들어오지도 않아. Trace랑 평가가 정말 이렇게 따로따로 노는 게 맞아? 이것들을 합쳐서 더 똑똑하게 시스템을 진단하는 방법은 없을까?”

솔라의 시선은 ‘디버깅 도구’와 ‘독립적인 평가 도구’라는, 자신이 그어놓은 보이지 않는 선에 갇혀 있었다.

루나는 솔라의 말을 잠자코 듣더니, 맞은편에서 일어나 솔라의 옆으로 다가왔다. 그리고는 솔라가 들고 있던 펜을 조용히 가져갔다. 루나는 아무 말 없이, 솔라가 그린 왼쪽의 Trace 그림, 그중에서도 첫 번째 검토 단계 옆에 무언가를 써넣기 시작했다.

- 검토 -- 판사 LLM 호출 (결과: 부적합) ← 바로 이 부분 옆이었다.

루나는 작은 꼬리표를 달 듯, 그 옆에 이렇게 덧붙였다. [피드백: 보고서의 핵심 주장에 대한 구체적인 근거 데이터가 누락됨]

그것이 전부였다. 루나는 펜을 내려놓고 다시 제자리로 돌아가 앉았다. 하지만 솔라는 자리에서 꼼짝할 수 없었다. 그 짧은 문장 하나가, 분리되어 있던 두 개의 그림을 강력한 자석처럼 하나로 합쳐버렸기 때문이다.

‘리뷰’가 ‘지도’ 위에 직접 새겨진 순간이었다.

“아…!”

솔라는 저도 모르게 탄성을 내뱉었다. Trace는 더 이상 단순한 경로 지도가 아니었다. 각 단계에서 어떤 일이 일어났는지, 왜 그런 결정이 내려졌는지를 모두 품고 있는, 살아있는 역사서였다. 평가 결과는 Trace 바깥에 존재하는 별개의 정보가 아니라, Trace의 각 단계를 구성하는 핵심적인 일부였던 것이다.

솔라는 떨리는 손으로 펜을 다시 집어 들었다. 그리고 루나가 했던 것처럼, 재작성 (1차) 단계 옆에 가상의 설명을 덧붙였다. [수행 작업: 근거 데이터 검색 및 추가]. 그리고 마지막 검토 단계, 판사 LLM 호출 (결과: 적합) 옆에는 이렇게 적었다. [피드백: 주장에 대한 근거가 명확하게 보강됨].

완성된 그림은 이전과 완전히 다른 정보를 보여주었다.

  1. 왜 실패했는가? : 첫 번째 검토에서 근거 데이터 누락 때문에 부적합 판정을 받았다.
  2. 어떻게 수정했는가? : 재작성 단계에서 근거 데이터를 검색하여 추가했다.
  3. 개선이 확인되었는가? : 두 번째 검토에서 근거 보강을 인정받아 적합 판정을 받았다.

단순히 루프를 돌았다는 사실을 넘어, 실패의 원인, 수정의 과정, 그리고 성공의 확인까지 이어지는 하나의 완전한 서사가 눈앞에 펼쳐졌다. 솔라는 고개를 들어 루나를 보았다.

“Trace와 평가는 별개의 도구가 아니었어. 하나의 몸이었네. Trace는 뼈대고, 평가는 그 뼈대에 붙어 있는 살과 근육이었어. 이 두 가지를 합쳐서 봐야만 Agent가 어떻게 생각하고, 배우고, 성장하는지 전체 모습을 볼 수 있는 거였어.”

이제 솔라는 노트의 첫 장에 적혀있던 문장을 완전히 새로운 눈으로 읽을 수 있었다. LangSmith trace와 LLM-as-Judge 평가를 함께 확인한다. 이것은 두 개의 창을 나란히 띄워놓고 보라는 뜻이 아니었다. Trace라는 하나의 창 안에서 평가 결과가 어떻게 각 단계의 의사결정을 이끌어냈는지, 그 통합된 흐름을 읽어내라는 의미였던 것이다. 이것이 바로 ‘통합 품질 검증’의 핵심이었다.

루나는 만족스러운 듯 희미한 미소를 지었다. 그리고는 마지막 과제를 던지듯, 빈 종이 한 장을 솔라 앞으로 밀었다.

“자, 여기 마지막 Trace가 있어. 이 Agent는 뭔가 문제가 있는 것 같은데, 한번 진단해 줄래?”

루나가 빠르게 스케치한 Trace는 이러했다.

보고서 생성 작업 3 - 초안 생성 - 검토 (1차) -- 판사 LLM 호출 (결과: 부적합) [피드백: 서론이 너무 길고 장황함] - 재작성 (1차) -- [수행 작업: 서론 수정] - 검토 (2차) -- 판사 LLM 호출 (결과: 부적합) [피드백: 서론이 너무 길고 장황함] - 재작성 (2차) -- [수행 작업: 서론 다시 수정] - 검토 (3차) -- 판사 LLM 호출 (결과: 부적합) [피드백: 서론이 너무 길고 장황함] ... (계속 반복)

솔라는 그림을 보자마자 문제의 핵심을 짚어냈다. 그녀의 손가락이 2차, 3차 검토 단계에 적힌 피드백을 차례로 가리켰다.

“언니, 찾았어. 문제는 루프 자체가 아니야.”

솔라의 목소리에는 확신이 서려 있었다.

“봐봐. 1차 검토에서 ‘서론이 길다’는 피드백을 받았어. 그런데 2차, 3차 검토에서도 똑같은 피드백을 받고 있잖아. 이건 ‘재작성’ Agent가 ‘검토’ Agent가 준 피드백을 전혀 이해하지 못하거나, 제대로 반영하지 못하고 있다는 뜻이야. 계속 헛다리만 짚으면서 똑같은 실수를 반복하고 있는 거지. 우리는 이 Agent가 루프를 끝내도록 할 게 아니라, ‘재작성’ 단계의 프롬프트를 수정해서 ‘서론이 길다’는 피드백을 어떻게 처리해야 하는지 더 명확하게 알려줘야 해.”

솔라는 말을 마치고 자신이 내린 진단을 내려다보았다. 더 이상 막연한 추측이 아니었다. Trace와 평가라는 통합된 증거를 기반으로 내린, 논리적이고 구체적인 개선 전략이었다. 이제 Agent 시스템은 그냥 ‘돌아간다’ 혹은 ‘멈춘다’로 평가할 수 있는 대상이 아니었다. 내부의 각 부품이 어떻게 상호작용하는지 들여다보고, 문제가 되는 부품을 정확히 찾아내 고칠 수 있는, 투명한 기계와도 같았다. 솔라는 비로소 Agent 시스템의 품질을 확보한다는 말의 진짜 의미를 깨달았다.