대규모 코드베이스를 AI 에이전트로 자동 유지보수한다는 것은 매력적이지만, 동시에 큰 위험을 동반합니다. 에이전트가 잘못된 PR을 생성하거나, CI를 통과했지만 기능적으로 오류가 있는 코드를 만들어낸다면 신뢰는 순식간에 무너집니다. 스포티파이 엔지니어링 팀은 이 문제를 '예측 가능성(Predictability)'을 최우선으로 설계하여 해결했습니다. 이 글에서는 그 핵심인 '검증 루프(Verification Loop)' 전략을 깊이 있게 살펴봅니다. 자세한 근거자료는 원문 블로그에서 확인할 수 있어요.
![]()
실패 모드를 사전에 차단하는 검증 루프 설계
에이전트의 주요 실패 모드는 크게 세 가지입니다:
- PR 생성 실패: 비교적 사소한 문제입니다.
- CI 실패 PR 생성: 엔지니어에게는 짜증나는 문제로, 반쯤 망가진 코드를 수정할지 말지 결정해야 하는 부담을 줍니다.
- CI는 통과했지만 기능적 오류가 있는 PR 생성: 가장 심각한 문제로, 자동화 시스템에 대한 신뢰를 근본적으로 훼손합니다.
2, 3번 실패를 막기 위해 도입한 것이 다층적 검증 루프입니다. 에이전트는 변경을 확정(commit)하기 전에 단계적으로 자신의 작업이 올바른 방향으로 가고 있는지 확인할 수 있어야 합니다.
결정론적 검증기(Verifier)와 LLM 판관(Judge)
검증 루프는 두 가지 핵심 요소로 구성됩니다.
- 결정론적 검증기: Maven(
pom.xml발견 시 실행), Gradle, 포매터, 테스트 러너 등 구체적인 빌드/테스트 도구를 추상화한 도구입니다. 에이전트는 단순히 '검증' 도구를 호출하기만 하면, 검증기가 실제 명령어를 실행하고 결과를 정제하여 반환합니다. 이는 에이전트의 컨텍스트 윈도우를 절약하고, 복잡한 출력 파싱 같은 지루한 작업을 대신해줍니다. - LLM 판관(Judge): 검증기가 문법적, 구문적 오류를 잡아낸다면, 판관은 의미적 오류를 잡아냅니다. 에이전트가 프롬프트의 범위를 벗어나 불필요한 리팩토링을 시도하거나, 문제 해결 방법을 잘못 선택했는지를 평가합니다. 내부적으로 수천 건의 세션 중 약 1/4이 판관에 의해 거부되며, 이 중 절반은 에이전트가 스스로 수정에 성공했다고 합니다.

예측 가능성을 높이는 에이전트 설계 철학
높은 신뢰도를 달성한 배경에는 에이전트 자체를 단일 목적에 집중시킨 설계 철학이 있습니다.
| 설계 원칙 | 설명 | 기대 효과 |
|---|---|---|
| 제한된 접근 권한 | 코드 읽기/쓰기, 검증 도구 호출 외의 권한 없음. 코드 푸시, 슬랙 통신 등은 외부 인프라가 담당. | 예측 가능성 향상, 보안 강화 |
| 높은 샌드박싱 | 제한된 바이너리만 갖춘 컨테이너에서 실행, 외부 시스템 접근 최소화. | 보안 위험 감소, 실행 환경 일관성 유지 |
| 추상화된 도구 인터페이스 | 에이전트는 'Maven 검증'이 아닌 '검증'이라는 추상화된 도구만 호출. | 에이전트의 인지 부하 감소, 유지보수성 향상 |
이러한 설계는 에이전트가 '창의적'으로 날뛰는 것을 방지하고, 주어진 임무에만 충실하도록 유도합니다. 결국, 배포하는 것은 에이전트가 아닌 에이전트를 통제하는 시스템이라는 점이 핵심 인사이트입니다.

결론: 실무에 주는 시사점
스포티파이의 사례는 AI 에이전트를 단순한 코드 생성 도구가 아닌, 강력한 제어 시스템으로 관리해야 하는 엔지니어링 대상으로 바라보게 합니다. 성공을 위한 조건은 다음과 같습니다.
- 빠른 피드백 루프 구축: 에이전트가 중간에 틀렸는지 바로 알 수 있도록 결정론적 검증기를 먼저 도입하세요.
- 의미 검증 레이어 추가: 문법 검사 이상으로, LLM 판관을 활용해 작업의 의도와 결과가 일치하는지 확인하는 절차가 필요합니다.
- 에이전트의 역할을 제한하라: 만능 도구보다는 특화된 도구로 설계할 때 예측 가능성이 높아집니다.
이 분야는 빠르게 진화하고 있으며, 하드웨어 확장, CI/CD 파이프라인 심층 통합, 체계적인 평가 시스템 구축이 다음 도전 과제로 떠오르고 있습니다. 대규모 코드 변환에 AI를 적용하고 있다면, 이러한 피드백 루프 설계에 특히 주목할 필요가 있습니다.