AI 코딩 에이전트도 밤에 복기하면 좋아질까

왜 이걸 돌려봤나

코딩 에이전트를 사용하며 가장 자주 하는 생각은 단순했다. 에이전트가 오늘 저지른 실수를 내일 반복하지 않게 만들 수 있을까.

사람은 업무를 마친 뒤 과정을 복기한다. 어떤 요청에서 혼선이 있었는지, 사용자가 기피하는 표현은 무엇인지, 반드시 지켜야 할 기준은 어떤 것인지 되짚어본다. 문제는 코딩 에이전트 역시 이와 유사한 방식으로 발전할 수 있느냐는 점이다. 매번 새로운 대화마다 동일한 지침을 반복해서 설명하는 대신, 과거의 세션 기록을 바탕으로 스스로 행동 규칙을 다듬어 나가는 구조가 가능하다면 상당히 실용적일 것이라 판단했다.

이에 따라 SkillOpt-Sleep을 한 달 동안 직접 구동해 보았다. 결론부터 언급하자면, 현재 자동 야간 실행 기능은 꺼둔 상태다. 개선안이 실제 지침으로 채택된 것은 단 한 번뿐이었고, 나머지 시도는 대부분 무의미하게 토큰만 소모했다. 그럼에도 불구하고 이 시도를 완전한 실패로 규정하기는 어렵다. 오히려 이번 실험을 통해 가장 인상 깊게 확인한 요소는, 무분별한 개선을 차단하는 ‘검증 게이트’의 존재 자체였다.

SkillOpt-Sleep이 하는 일

SkillOpt-Sleep은 AI 코딩 에이전트가 야간에 과거 작업 세션을 수집하여 반복된 실수와 사용자의 선호도를 학습한 뒤, 스스로 지침 개선안을 제안하도록 돕는 도구다. 이는 SkillOpt를 기반으로 작동하는 플러그인이다.

이 도구의 핵심 아이디어는 매우 직관적이다. 사람이 수면을 취하며 기억을 정리하는 것처럼, 에이전트 또한 자체적인 수면 사이클을 거치며 자신의 행동을 복기한다. 이전 대화 내역과 작업 기록을 분석하여 “향후 유사한 상황에서는 이렇게 대응하는 것이 더 적절하다”는 형태의 메모리나 스킬 개선안을 도출해 낸다.

여기서 주목해야 할 중요한 특징은 제안된 개선안이 라이브 지침을 즉각적으로 변경하지 않는다는 점이다. 개선안이 생성되었다고 해서 무조건 채택되는 구조가 아니다. 모든 제안은 반드시 ‘held-out 점수’라는 엄격한 검증 게이트를 통과해야만 한다. 이 게이트를 넘기 전까지 기존의 라이브 지침은 원형 그대로 유지된다. 즉, 학습기가 아무리 그럴듯한 제안을 내놓더라도 검증을 거치지 않으면 실제 에이전트의 행동 패턴에는 전혀 반영되지 않는다.

이러한 구조적 안전장치는 매우 긍정적으로 다가왔다. 자기 개선 AI 모델에서 가장 경계해야 할 위험 요소는 “스스로 유의미하게 학습했다”고 착각한 잘못된 내용을 실제 행동 규칙에 오염 물질처럼 주입하는 현상이다. SkillOpt-Sleep은 최소한 그러한 치명적인 위험을 방지할 수 있는 확실한 여과 장치를 갖추고 있었다.

실제로 돌려본 결과

약 한 달의 기간 동안 자동 야간 사이클을 총 8회 구동했다. 그 결과는 상당히 냉정하게 나타났다. 8회의 사이클 중 7회가 아무런 성과를 내지 못한 빈 사이클로 끝났다. 설령 새로운 개선안이 도출되더라도 검증 게이트의 기준을 충족하지 못해 전부 기각(reject) 처리되었다. 실제 지침으로 채택된 사례는 단 1회에 불과했다.

구분결과
총 자동 야간 사이클8번
기각(reject)된 빈 사이클7번
실제 채택1번
첫 성공night3
이후 night4~8전부 기각
사이클당 토큰 소모60k~70k 수준

유일한 성공은 세 번째 사이클(night3)에서 발생했다. 당시 held-out 점수가 0.120에서 0.578로 대폭 상승하며 검증 게이트를 무사히 통과했다. 그 결과 1개의 지침이 실제 행동 규칙으로 채택되었다. 채택된 내용은 향후 응답을 생성할 때 출처 URL, 작업의 구조적 틀, 그리고 상태를 나타내는 어휘를 원래대로 보존하라는 행동 규칙이었다.

이는 분명히 유의미한 질적 개선이었다. 특정 작업 수행 시 사용자가 핵심적으로 여기는 구조적 요소를 유지하라는 명확한 원칙이었으며, 다른 다양한 상황에서도 비교적 폭넓게 적용 가능한 범용성을 지니고 있었다. 충분히 채택될 만한 가치가 있는 제안이었다.

진짜 문제는 그 이후의 흐름이었다. night4부터 마지막 night8 사이클까지는 점수가 사실상 제자리에 머물렀다. 예를 들어 0.583에서 0.583으로, 혹은 0.247에서 0.247로 개선 전후의 점수 차이가 전무했다. 기준 점수를 넘어서지 못하니 제안된 모든 개선안이 기각되었다. 매일 밤 사이클은 성실하게 작동했고 회당 60k에서 70k 수준의 적지 않은 토큰이 지속적으로 소모되었으나, 실제 라이브 지침에는 단 한 줄의 변화도 일어나지 않았다.

여기서 도출되는 결론은 단순하고 명확하다. 자동화 사이클을 무조건 많이 반복한다고 해서 에이전트의 성능이 비례하여 향상되는 것은 아니다. 횟수와 무관하게 단 한 번이라도 실질적인 개선안이 검증을 통과해야만 그 의미를 가진다. 극단적으로 낮은 채택률 앞에서는, 이러한 자동화 과정이 에이전트의 지능적 성장이 아니라 단순한 리소스 낭비이자 금전적 비용으로 전락하게 된다.

왜 정체됐나

개선이 정체된 근본적인 원인을 진단해 본 결과, 문제는 다름 아닌 과적합(Overfitting) 현상에 있었다.

본래 학습기는 과거 대화의 맥락에서 범용적인 행동 원칙을 추출해 내야 한다. 하지만 실제로는 해당 세션에 등장했던 표면적인 단어들을 기계적으로 베껴오는 경향이 강했다. 예를 들어 Blogger, 티스토리, 네이버와 같은 고유한 플랫폼 명칭이나 특정 URL, 혹은 개별 PR 번호 등 지나치게 구체적인 단어들을 개선안에 그대로 포함시켰다. 물론 해당 단어들이 등장했던 당장의 훈련 세션 내부에서는 그 제안이 제법 그럴듯해 보일 수 있다. 그러나 완전히 다른 도메인과 상황을 가정한 held-out 테스트 환경에서는 전혀 들어맞지 않는 무용지물이 되고 만다.

에이전트에게 진정 필요한 것은 개별 단어의 암기가 아니라 행동 원칙의 확립이다. “특정 블로그 플랫폼의 이름을 기억하라”는 지엽적인 규칙이 아니라 “정보의 출처와 현재 작업 상태를 명확히 구분하고 혼동하지 말라”는 원칙이 도출되어야 옳다. 마찬가지로 “특정 PR 번호를 텍스트에 보존하라”가 아니라, “사용자가 명시적으로 부여한 고유 식별자와 작업의 상태 값을 에이전트가 임의로 축약하거나 일반화해서는 안 된다”는 규칙으로 발전해야 한다. 가치 있는 개선안이란 단순히 표면에 노출된 명사를 암기하는 것이 아니라, 그 기저에 깔린 행동 규칙으로 고도화되고 압축된 결과물이어야 한다.

SkillOpt-Sleep의 학습기는 바로 이 일반화의 지점에서 빈번하게 한계를 드러냈다. 과거 세션의 기록 속에서 시각적으로 두드러지는 고유명사를 포착하는 데는 능했으나, 그 고유명사 이면에 자리 잡고 있는 핵심 행동 원칙을 범용적인 수준으로 끌어올리지 못했다. 그 결과 자신이 학습한 특정 세션에만 과도하게 최적화되었고, 낯선 held-out 환경의 검증 앞에서는 무기력하게 무너졌다.

이는 자기 개선을 목표로 하는 AI 모델들이 공통적으로 빠지기 쉬운 전형적인 함정이라 판단한다. 방대한 양의 로그 데이터를 단순히 주입한다고 해서 질 좋은 원칙이 자생적으로 튀어나오는 것은 아니다. 모든 로그 안에는 특정한 사건이 기록되어 있고, 사건에는 그것을 둘러싼 맥락이 존재하며, 그 맥락 속에는 상황적 특수성으로 인해 우연히 등장한 단어들이 필연적으로 섞여 있다. 만약 학습기가 이 우연한 단어들을 본질적인 원칙으로 오인하고 붙잡게 된다면, 도출되는 개선안의 적용 범위는 극단적으로 좁아질 수밖에 없다.

그래서 자동 트리거를 껐다

이러한 분석을 바탕으로 내린 최종 결정은 명확했다. 야간 자동 실행 트리거를 과감하게 비활성화(OFF)했다.

결정의 이유는 지극히 단순하다. 실질적인 채택은 거의 이루어지지 않는 반면, 매 사이클마다 상당한 양의 토큰 비용만 지속적으로 지출되었기 때문이다. 총 8회의 시도 중 단 1회만 채택되는 성공률이라면 매일 밤 이를 자동으로 가동할 명분과 실익이 부족하다. 특히 첫 성공 이후 이어진 다수의 사이클에서 held-out 점수가 조금의 진전도 없이 정체되어 있었다는 사실이 결정적으로 작용했다. 한 차례 성공을 거둔 이후에도 동일한 메커니즘을 통해 점진적으로 나아지는 우상향의 흐름을 전혀 발견할 수 없었다.

다만, 자동화 기능을 껐을 뿐 수동 실행 기능 자체는 유지해 두었다. 이 도구를 완전히 폐기할 만큼 무가치하다고 판단한 것은 아니다. 첫 번째 성공 사례가 증명하듯, 까다로운 게이트를 무사히 통과한 개선안은 실제로 에이전트의 행동을 교정하는 데 유의미한 역할을 했다. 무엇보다 검증 게이트가 제 역할을 훌륭히 수행한 덕분에 품질이 떨어지는 불량 개선안이 라이브 지침에 무단으로 침투하는 사태를 완벽하게 차단할 수 있었다. 방어 메커니즘이라는 측면에서 보면 이 시스템은 오히려 매우 훌륭하게 작동한 셈이다.

따라서 현재의 결정은 완전한 “폐기”가 아니라 상황에 따른 “조건부 보류”에 가깝다. 향후 내부 엔진, 즉 학습기가 표면적인 단어에 집착하지 않고 그 이면의 의미를 기반으로 범용적인 행동 원칙을 추출해 낼 수 있도록 알고리즘이 고도화된다면 자동 트리거는 언제든 다시 켤 수 있다. 그러나 현재의 기술적 완성도와 동작 상태를 고려할 때, 자동 야간 실행을 매일 반복하는 것은 투입되는 비용 대비 효율성이 현저히 떨어진다.

자기 개선 시스템의 가치를 평가할 때 가장 중요한 지표는 결코 개선안의 ‘생성량’이 아니다. 설익은 개선안을 수십 개 쏟아내는 것보다, 엄격한 검증 과정을 온전히 통과한 진짜 개선안 단 하나를 얻어내는 것이 훨씬 더 본질적이고 중요하다. 이 기준을 엄격하게 적용한다면, 현재로서는 맹목적인 자동 실행을 멈추는 것이 가장 합리적인 선택이다.

누구에게 권하나, 누구에게 권하지 않나

SkillOpt-Sleep은 특정 조건이 충족된 사용자에게는 충분히 흥미롭고 유용한 도구가 될 수 있다. 코딩 에이전트를 오랜 기간 사용해 와서 분석 가능한 과거 세션 로그가 충분히 누적되어 있고, 에이전트의 지침을 실험적인 방식을 통해 정교하게 다듬어보고 싶은 성향을 가진 사람이라면 시도해 볼 만하다. 특히 대화 과정에서 “에이전트가 내가 선호하는 작업 방식을 반복적으로 망각하거나 놓친다”는 명확한 문제의식을 가지고 있다면, 자동화 대신 수동으로 한 번쯤 사이클을 구동해 원인을 분석해 볼 가치는 충분하다.

하지만 도입 초기부터 자동 야간 트리거를 활성화하는 것은 결코 권장하지 않는다. 최소한 개선안의 실제 채택률과 그 과정에서 소모되는 토큰 비용의 상관관계를 면밀하게 따져보아야 한다. 사이클을 총 몇 번 돌렸는가 하는 표면적인 횟수보다는, 그중에서 몇 번이나 실제 지침으로 유효하게 채택되었는가가 훨씬 더 중요한 지표다. 물론 도출된 개선안이 기각(reject)되는 현상 자체를 단순한 실패로 치부할 수는 없다. 이는 검증 게이트가 자신의 임무를 충실히 수행해 불량 지침을 걸러낸 정상적인 결과일 확률이 높기 때문이다. 다만, 그러한 기각 상태가 유의미한 변화 없이 지루하게 반복된다면 무의미한 자동화는 즉시 중단하는 것이 옳다.

특히, 다루는 작업의 도메인이 수시로 바뀌는 사용자라면 이 도구를 사용할 때 훨씬 더 큰 주의를 기울여야 한다. 하루는 블로그 포스팅 작업을 지시하고, 다음 날은 복잡한 코드 리뷰를 맡기며, 또 다른 날에는 서버 배포 확인이나 방대한 문서 정리를 요청하는 식이라면 세션마다 등장하는 단어의 풀과 전체적인 맥락이 극단적으로 요동치게 된다. 이처럼 환경이 가변적일수록 학습기는 맥락의 기저에 있는 원칙을 파악하기보다는 당장 눈에 띄는 표면적인 단어에 과적합될 위험성이 급격히 커진다. 이런 환경에서는 학습기가 “과거 세션의 어떤 특정 단어를 기억해 냈는가”에 집중할 것이 아니라, “서로 다른 환경에서도 통용될 수 있는 어떤 행동 원칙을 추출해 냈는가”를 날카롭게 검증해야 한다.

반대로 상대적으로 일관되고 단일한 종류의 작업을 반복적으로 수행하는 환경이라면, 이 도구가 빛을 발할 가능성은 조금 더 커진다. 환경이 고정되면 노이즈가 줄어들고 학습기가 규칙을 찾기 수월해지기 때문이다. 그럼에도 불구하고 최종적인 판단 기준은 변하지 않는다. held-out 점수가 유의미한 폭으로 상승하고 있는지, 최종 채택된 지침이 범용성을 상실한 채 너무 구체적인 특정 단어들에 종속되어 있지는 않은지, 그리고 매일 소모되는 토큰 비용과 비교했을 때 도출되는 채택률이 합리적으로 납득할 만한 수준인지를 종합적으로 저울질해야 한다.

정리

한 달간 진행한 이번 실험을 통해 내린 결론은 매우 단호하다. AI 코딩 에이전트 역시 작업 종료 후 과거의 기록을 복기하는 과정을 거치면 분명 더 나은 방향으로 발전할 수 있다. 하지만 단순히 맹목적으로 밤마다 수면 사이클을 많이 돌린다고 해서 저절로 똑똑해지는 것은 결코 아니다.

이번 SkillOpt-Sleep 구동 과정에서 가장 가치 있었고 신뢰를 주었던 요소는 아이러니하게도 새로운 지침을 만들어내는 학습기가 아니라, 그것을 가차 없이 막아서는 ‘검증 게이트’였다. 철저한 게이트의 존재는 실질적인 효과가 없는 무의미한 변경 시도들을 훌륭하게 걸러냈다. 총 8회의 시도 중 7회가 기각(reject)되었다는 사실은 겉보기에는 초라한 성적표처럼 보일 수 있다. 그러나 관점을 조금만 바꾸어 보면, 이는 아직 설익은 불량 지침들이 실제 라이브 지침의 생태계를 오염시키지 못하도록 완벽하게 방어해 냈다는 것을 의미한다. 만약 검증 과정 없이 학습기가 던지는 아무 개선안이나 무비판적으로 채택했다면, 에이전트의 성능은 오히려 더 심각하게 훼손되었을 가능성이 높다.

현재 자기 개선 AI가 직면한 진짜 병목 구간은 ‘생성’이 아니라 ‘검증’에 있다. 이 분야의 핵심 경쟁력은 단순히 “그럴듯해 보이는 개선안을 다량으로 찍어내는 것”이 아니라, “엄밀한 테스트를 거쳐 실제로 성능이 향상되었음이 입증된 개선안만을 선별하여 채택하는 것”이다. 이 냉정한 검증 기준을 안정적으로 통과하지 못한다면, 그 어떤 화려한 자동화 시스템이라도 결국 생산성을 높이는 도구가 아니라 무의미한 리소스만 축내는 반복 비용의 굴레로 전락하고 만다.

이러한 명확한 이유로 인해 나는 자동 야간 트리거를 완전히 껐다. 수동 실행 기능만을 조심스럽게 남겨두었을 뿐이다. 유일하게 채택되었던 한 번의 개선안은 실제로 안전하고 유효했으며, 자동화 구조 자체에는 여전히 발전할 수 있는 잠재력이 존재했다. 하지만 학습기가 과거 세션의 표면적인 단어들을 앵무새처럼 외우는 현재의 수준을 극복하고, 그 이면의 의미를 통찰하여 범용적인 행동 원칙을 추출해 내는 단계에 도달하기 전까지는 매일 밤 이를 자동으로 가동할 이유가 전혀 없다.

만약 AI 에이전트의 자기 개선 기능을 현업에서 실험하고자 한다면 반드시 세 가지를 냉정하게 주시해야 한다. 실제 지침으로 반영되는 채택률을 꼼꼼히 확인해야 하고, 객관적인 지표인 held-out 점수의 추이를 살펴야 하며, 그 과정에서 소모되는 토큰 비용의 규모를 통제해야 한다. 그리고 무엇보다 “지금 눈앞에 제안된 이 개선안이 과거 특정 세션의 단어들을 기계적으로 베껴온 것에 불과한지, 아니면 당장 내일 주어질 완전히 새로운 작업 환경에서도 굳건하게 통용될 수 있는 진짜 행동 원칙인지”를 꿰뚫어 보아야 한다.

자동화라는 도구의 진정한 가치는 기계를 얼마나 자주, 많이 가동했느냐는 단순한 횟수에 있지 않다. 그 수많은 반복의 과정 속에서 단 한 번이라도, 본질을 꿰뚫는 진짜 개선안이 검증의 벽을 통과해 실제 성장을 이끌어내는가에 모든 의미가 달려 있다.

관련 글: ChatGPT는 왜 모르면서 아는 척할까 — AI 환각이 버그가 아니라 설계인 이유

관련 글: AI 코딩에 의존하는 게 약점일까 — 직접 굴려보고 내린 결론

댓글

이 블로그의 인기 게시물

마와린세 패스 완전정리 — 이세시마 여행 [1/9]

해외여행 환전·카드 완전정리 — 트래블카드·현금 비율·ATM 활용

다낭 마사지 가격·후기 | Heart Spa 2와 Sông Hàn 13박 회복 루틴 [7/9]