에이전트 평가(Agent Evals)의 콜드 스타트 문제: 레이블링된 데이터가 없는 첫날 무엇을 게이트(Gate)해야 하는가
요약
에이전트 배포 초기, 레이블링된 데이터가 없는 '콜드 스타트' 상황에서 효과적인 평가(Evals) 전략을 제시합니다. 비용 중심의 평가가 아닌, 에이전트가 조작할 수 없는 '독립성'을 기준으로 Tier 1(외부 증거)과 Tier 2(통계적 신호)를 우선 활용할 것을 권장합니다.
핵심 포인트
- 레이블링된 데이터 없이도 독립적인 증거를 통해 에이전트 평가 가능
- 비용보다 에이전트가 조작할 수 없는 '독립성'이 평가의 핵심 축
- Tier 1: JSON 유효성, 파일 존재 여부, 컴파일 성공 등 외부 관찰 증거 활용
- Tier 2: 임베딩 유사도, 출력 길이, 반복 패턴 등 통계적 신호 활용
- Tier 3: Model-as-judge는 신호일 뿐이며 가장 오염되기 쉬운 방식
방금 에이전트(Agent)를 배포했습니다. 데모에서는 잘 작동합니다. 이제 누군가 합리적인 질문을 던집니다: "이게 계속 잘 작동할지 어떻게 알 수 있죠?" 그리고 당신은 평가(Evals)를 시도하려 하지만, 벽에 부딪힙니다. 레이블링된 데이터셋(Labeled dataset)이 없습니다. 골든 출력(Golden outputs)도 없습니다. 과거의 트레이스(Historical traces)도 없습니다. 비교하여 점수를 매길 대상이 아무것도 없습니다.
그래서 팀은 정체됩니다. "데이터를 수집하면 평가를 추가하자." 그동안 에이전트는 게이트(Gated) 없이 프로덕션 환경에서 실행되며, 처음으로 조용히 고장 나는 순간이 바로 누군가가 이를 알아차리는 첫 순간이 됩니다.
이것이 콜드 스타트(Cold-start) 문제이며, 일반적인 대응 방식인 "LLM을 사용하여 출력을 1~10점으로 점수 매기게 하자"는 것은 정확히 잘못된 직관입니다. 게이트를 시작하는 데 레이블(Labels)이 필요한 것이 아닙니다. 첫날 당신이 신뢰할 수 있는 증거가 무엇인지, 그리고 결코 신뢰할 수 없는 것이 무엇인지 이해해야 합니다.
비용이 아닌 독립성
대부분의 평가(Eval) 논의는 비용 축을 기준으로 체크 항목을 나열합니다. 하단에는 저렴한 문자열 일치(String matches)가 있고, 상단에는 비싼 모델-애즈-저지(Model-as-judge)가 있어, 마치 더 많은 비용을 지불하면 더 많은 진실을 살 수 있는 것처럼 취급합니다. 이는 거꾸로 된 생각입니다. 중요한 축은 **독립성(Independence)**입니다: 에이전트가 이 신호(Signal)를 조작할 수 있는가, 없는가?
이러한 재정의가 콜드 스타트의 핵심입니다. 왜냐하면 독립적인 증거는 레이블이 전혀 필요하지 않기 때문입니다. 그것은 에이전트의 의도와 상관없이 세상에 대해 참인지 거짓인지를 나타냅니다.
독립적인 것부터 오염 가능한 것 순으로 나열한 세 가지 티어(Tier)는 다음과 같습니다:
- Tier 1 — 에이전트가 조작할 수 없는 외부 관찰 가능한 증거. 유효한 JSON을 생성했는가? 작성했다고 주장하는 파일이 존재하는가? 코드가 컴파일되었는가? 테스트를 통과했는가? 타임아웃(Timeout) 내에 완료했는가? 출력이 비어 있지 않은가?
- Tier 2 — 에이전트가 작성하지 않은 베이스라인(Baseline)에 대한 통계적 신호. 출력이 주어진 작업과 임베딩 유사도(Embedding-similar)가 높은가? 길이가 정상적인가, 아니면 반복되는 패턴으로 무너졌는가? 디프(Diff)가 실제로 무언가를 변경했는가?
- Tier 3 — 모델-애즈-저지 (Model-as-judge). 공유된 기질(Shared-substrate)에 기반한 의견. 이는 신호일 뿐, 결코 판결이 아닙니다.
첫날 당신은 Tier 1과 Tier 2를 완전히 무료로 얻을 수 있습니다. 둘 다 단 하나의 레이블링된 예시도 필요로 하지 않습니다. 왜냐하면 둘 다 "이것이 좋은가?"라고 묻는 것이 아니라, "이것이 실제인가?"라고 묻기 때문입니다.
첫날의 게이트 (The day-one gate)
코드 패치(code patch)를 생성해야 하는 에이전트를 위한 시작 단계의 게이트(starter gate) 예시입니다. 데이터셋은 필요하지 않습니다:
type GateResult = { pass: boolean; tier: 1 | 2; reason: string };
async function coldStartGate(
...
여기에서의 모든 검사는 파일 시스템(filesystem)/컴파일러(compiler)/시계(clock)에 대해 참이거나, 에이전트가 받았지만 직접 작성하지는 않은 작업 문자열(task string)과의 거리(distance)를 측정하는 것입니다. 레이블링(labeling)할 것이 아무것도 없습니다. 그리고 이는 실제 실패 사례의 압도적인 대다수를 잡아냅니다: 오래된 실행(stale run), 충돌(crash), 잘못된 형식의 출력(malformed output), 환각된 파일 경로(hallucinated file path), 빈 응답(empty response), 관련 없는 파일로 벗어난 패치(patch) 등이 이에 해당합니다.
Tier 3가 첫날(그리고 그 이후에도) 제외되는 이유
이 모든 과정을 건너뛰고 판사 모델(judge model)이 패치를 읽고 점수를 매기게 하고 싶은 유혹이 생길 것입니다. 이를 저지하십시오. 단순히 레이블(labels)이 없기 때문만은 아닙니다.
모델이 다른 모델의 결과물을 심사하는 것은 **순환적(circular)**입니다. 심사자와 피심사자는 동일한 기질(substrate)을 공유합니다: 즉, 동일한 학습 분포(training distribution), 동일한 사각지대(blind spots), 동일한 확신에 찬 오류(confident wrongness)를 공유합니다. 그 루프 안에는 독립적인 정답(ground truth)이 존재하지 않습니다. 따라서 Tier 3는 취향(taste)에 관한 신호일 뿐, 결코 정확성(correctness)에 대한 판결이 아닙니다. 또한 Tier 3는 피심사 에이전트가 작성하지 못한 결과물(artifacts)만을 검사할 수 있을 뿐, 에이전트가 스스로 합리화할 수 있는 자신의 추론 과정(reasoning trace)은 결코 검사할 수 없습니다.
두 가지 더 엄격한 제약 조건이 있습니다. **Tier 1+2는 실시간 게이트(real-time gate)**입니다: 결정론적(deterministic)이며, 사실상 비용이 들지 않고, 잘못된 출력이 빠져나가기 전에 실행을 차단할 수 있을 만큼 충분히 빠릅니다. 반면 **Tier 3는 오프라인 전용(offline-only)**입니다: 비용이 발생하고, 느리며, 비결정론적(non-deterministic)입니다. 따라서 핫 패스(hot path)에 위치할 수 없습니다. Tier 3는 나중에 배치(batch)로 실행하여 Tier 1+2가 판결할 수 없는 주관적인 나머지 약 20%의 영역을 처리하며, 그 출력에는 "증거가 아닌 의견(opinion, not evidence)"이라는 레이블을 붙여야 합니다. 오늘 결정론적으로 게이트할 수 있는 80%를 먼저 출시하십시오. 어차피 루프 안에서 신뢰해서는 안 될 판사 모델을 기다리느라 출시를 늦추지 마십시오.
실제로 필요한 두 가지 측면
출력 게이팅(Gating output)은 업무의 절반에 불과합니다. 나머지 절반은 _무슨 일이 일어났는지_를 아는 것이며, 여기서 콜드 스타트(cold-start) 팀들은 조용히 편법을 씁니다. 그들은 에이전트의 자기 보고(self-report)를 기준으로 게이팅을 하는데, 이는 바로 Tier 1이 우회하도록 설계된, 위조 가능한 요소입니다.
이것이 바로 평가(eval) 레이어와 트레이스(trace) 레이어가 하나의 단위로 배포되어야 하는 이유입니다. agent-eval은 출력을 점수화하고 게이팅합니다. 즉, 위에서 언급한 계층(tier) 로직인 평가(evals), 드리프트(drift), 환각 체크(hallucination checks)를 수행합니다. AgentLens는 에이전트가 그 결과에 도달한 _과정(how)_의 트레이스를 캡처합니다. 즉, 모든 모델 호출(model call)과 도구 단계(tool step), 해결된 입력값(resolved inputs), 가공되지 않은 출력값(raw outputs)을 기록합니다. 이 두 가지는 특정 접점에서 연결됩니다. Tier 1+2는 점수를 매기기 위해 위조 불가능한 데이터가 필요하며, 에이전트가 그 데이터를 직접 작성해서는 안 됩니다. AgentLens는 에이전트가 자신이 무엇을 했다고 생각하는지에 대한 요약 대신, 실제로 기록된 파일, 실제 종료 코드(exit code), 실제 실행 시간(wall-clock duration)과 같은 정확한 데이터를 제공합니다.
트레이스가 없다면, 여러분의 게이트는 에이전트가 직접 작성한 보도자료를 채점하는 수준으로 전락합니다. 트레이스가 있다면, "타임아웃 내에 완료됨"과 "대상 파일이 존재함"은 주장이 아닌 사실이 됩니다.
오늘 바로 시작하십시오
여러분에게는 레이블링된 데이터셋(labeled dataset)이 없습니다. 첫날에는 결코 가질 수 없습니다. 하지만 여러분은 이미 파일 시스템, 컴파일러, 시계, 그리고 임베딩 모델(embedding model)을 가지고 있습니다. 이는 이미 Tier 1+2 게이트를 보유하고 있음을 의미합니다. agent-eval을 여기에 연결하고, AgentLens를 실행(run)에 연결하여 위조 불가능한 트레이스 데이터를 공급하게 한 뒤, 80%를 게이팅하십시오. 판사 모델의 레이블(judge-tail labels)은 프로덕션 환경을 보호하는 대신에 모으는 것이 아니라, 이미 프로덕션 환경이 보호받고 있는 동안 수집하십시오.
콜드 스타트 문제는 데이터의 부재에 관한 것이 아니었습니다. 그것은 출시 허가를 받기 위해 잘못된 계층(tier)에 요청을 하는 것에 관한 문제였습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기