자동화된 에이전트를 밤새 방치한 결과: 새벽 3시에 고객 400명에게 잘못된 이메일을 보냈습니다.
요약
자동화된 에이전트가 결제 데이터의 미묘한 간극을 포착하여 400명의 고객에게 잘못된 실패 이메일을 발송하는 경험담입니다. 이는 반복적인 '노동'뿐만 아니라, 사람이 개입해 이상함을 감지하는 '판단력'까지 자동화 과정에서 제거할 위험성을 경고합니다.
핵심 포인트
- 자동화는 단순한 노동을 넘어 인간의 판단력까지 대체할 수 있다.
- 반복 작업에 대한 과도한 의존은 시스템적 오류를 초래한다.
- 진정한 자동화 설계에는 '인간의 개입(Human Judgment)' 지점을 반드시 포함해야 한다.
오전 9시에 제가 오전 3시에 어떤 일을 했는지 알게 되었습니다. 이것이 원격 자동화(unattended automation)의 전체 이야기이며, 저는 믿기 전에 이 경험을 살아야 했습니다.
그 자동화는 책임감 있는 종류여야 했습니다. 매일 밤 저희 프로세서와 그날의 결제 내역을 대조하고, 실제로 실패한 청구 건을 찾아내어 고객 계정이 만료되기 전에 해당 고객들에게 "결제가 완료되지 않았습니다. 수정 방법은 다음과 같습니다"라는 정중한 이메일을 보내는 것이었습니다. 지루하고 필수적이며 반복적인 작업—모두가 자동화하라고 말하는 정확한 형태의 일입니다. 그래서 저는 그것을 자동화했습니다. 프로세서 데이터가 정리되는 오전 3시에 실행되도록 설정했습니다. 그리고 — 지금 우리 모두가 움찔해야 할 문구인 '잊어버리는 것'을 했습니다.
어느 날 밤, 대충 작성된 원장(ledger)을 대상으로 조정 작업이 실행되었습니다. 결제 배치 건들이 저희 쪽 행(row)이 실제로 영속화(persist)되기도 전에 프로세서의 웹훅(webhook)에 의해 승인된 상태였습니다. 저장 과정이 몇 초 늦게 이루어졌고, 오전 3시 작업은 이 간극을 "이 결제 건들은 실패했다"고 읽었습니다. 그것은 제가 만들도록 의도한 대로 정확히 작동했습니다. 지치지 않고, 올바르게, 정시에, 결제가 실패했다고 알려주는 이메일을 400명의 유료 고객에게 보냈습니다. 아무도 그 배치 건을 목격하지 못했고, 아무도 발송 과정을 목격하지 못했습니다. 저는 오전 9시에 지원 대기열(support queue)에서 이미 200건이 넘는 티켓들을 발견했는데, 이들은 우리에게 돈을 지불했지만 저희 자체 소프트웨어로부터 결제에 실패했다는 통보를 받은 사람들이었습니다.
그 자동화의 어느 부분도 고장 난 것이 아니었습니다. 모든 줄은 제 역할을 했습니다. 문제가 된 것은 코드가 아니었습니다. 아무도 자리에 없는 상태에서 400명의 실제 사람들에게 도달하는 단 하나의 단계를 실행하도록 결정한 것입니다.
"설정하고 잊어버리기"라는 문구가 조용히 두 가지 다른 것을 교체하다
이 구절에 숨겨진 속임수가 있었고, 저는 오전 9시의 지원 사태를 통해 그것을 알게 되었습니다.
반복적인 작업(recurring job)은 사실 두 가지가 합쳐진 것입니다. 하나는 **노동(labor)**입니다. 데이터를 가져오고, 행들을 일치시키고, 숫자를 조정하고, 메시지를 초안 작성하며, 보고서를 조립하는 과정이죠. 지루하고 기계적이며, 매일 밤 똑같아서, 인간의 저녁 시간을 진정으로 낭비하게 만듭니다. 그리고 다른 하나는 **판단(judgment)**입니다. 누군가가 결과물을 보고 '잠깐, 이 중 200개는 분명히 결제한 고객들을 위한 건데, 뭔가 이상해. 보내지 마.'라고 생각하는 반 초간의 순간이죠. 이 두 가지 중 어느 것이 작업에 지루함을 느끼게 하는 요소인지가 중요합니다. 다른 하나는 당신을 보호해 온 유일한 것이었습니다.
'설정하고 잊어버리기(Set it and forget it)'라는 개념은 첫 번째 것, 즉 노동을 자동화하는 것에 매료시키고, 동시에 두 번째 것인 판단력까지 조용히 자동화해 버립니다. 당신은 지루함만 제거한다고 생각하지만, 사실 반쯤 작성된 원장(ledger)을 잡아냈을 그 한 번의 시선도 함께 삭제하고 있는 것입니다. 이 둘은 합쳐져 있었는데 — 지루한 조정 작업을 하던 사람이 무료로 배치(batch)가 이상하다는 것을 알아차리는 사람 역할까지 겸했었죠 — 자동화는 이들을 분리시키고 둘 다 버려버립니다.
이것이 문제입니다. 아무도 '내 결제 메일에서 인간의 판단력을 제거해야겠다'라고 결정하지 않습니다. 당신은 그저 '밤에 조정 작업하는 데 시간을 낭비하고 싶지 않다'라고만 결정하는데, 이는 완전히 합리적입니다. 하지만 이 경우, 판단력은 지루함과 같은 상자에 담겨 버립니다. 왜냐하면 당신은 이 둘이 서로 다른 것이라는 사실을 결코 알아차리지 못했기 때문입니다.
위험했던 부분은 노동 자체가 아니었습니다. 그곳에 인간이 존재하는 목적은 바로 '판단'이었고, 그것은 지루함과 같은 상자에 담겨 버렸습니다.
무인 상태가 실패 모드가 적다는 것을 의미하지는 않습니다. 밤 3시에 아무도 없을 때도 똑같은 실패 모드를 의미합니다.
자동화된 에이전트에 대한 매혹적인 이야기는 그것이 '더 안전하다'는 것입니다. 자정의 피곤한 인간이 숫자를 잘못 입력하거나, 월요일에 깜빡하는 작업이나, '아, 인보이스를 보내지 않았네'와 같은 실수가 없을 것이라고 말이죠. 그리고 이것은 사실입니다. 자동화는 실제로 한 종류의 인간 오류 전체를 제거합니다.
제거하지 못하는 것은 다른 종류의 입력입니다: 미묘하게 잘못된 입력, 절반만 작성된 상태, 스케줄이 우연히 도달하는 엣지 케이스(edge case) 같은 것들입니다. 오후 2시에 책상에서 조정 작업(reconciliation)을 수행하는 사람은 정확히 같은 절반만 작성된 원장(ledger)에 도달하며 — 그리고 멈춥니다. 왜냐하면 자신이 아는 고객들에게서 온 '결제 실패' 이메일 400개를 보는 사람이라면, 논리보다 먼저 잘못되었다는 느낌을 받기 때문입니다. 새벽 3시에 작동하는 에이전트는 같은 나쁜 상태에 도달하지만 그런 망설임(flinch)이 없습니다. 멈추지 않습니다. 아무것도 느끼지 못합니다. 그냥 발송합니다.
따라서 무인 자동화는 실패할 방법이 적은 시스템을 제공하지 않습니다. 그것은 여전히 같은 방식으로 실패하는 시스템을, 가장 적은 사람이 지켜보는 시간에 작동하게 만들고, 가장 실제 세계와 접촉하는 단계에 겨냥하며, 유일한 안전장치 — '저건 말이 안 돼'라고 말할 수 있는 인간 — 를 특별히 제거합니다. 우리는 우리가 신뢰성(reliability)을 사고 있다고 스스로에게 속삭입니다. 하지만 그것은 연기 감지기를 내린 것과 같은 위험을 사는 것입니다.
자동화하려고 애쓰지 않았던 단계가 되돌릴 수 없는 단계이다
제 새벽 3시 작업을 거슬러 올라가서, 제가 실제로 처리하고 싶었던 부분과 실수로 넘겨준 부분을 분리해 보겠습니다.
데이터를 가져오고(pulling), 일치시키고(matching), 조정하고(reconciling), 초안을 작성하는 것 — 이것들은 제발요, 저는 책상에서 그 어떤 것도 하고 싶지 않았습니다. 하지만 전송(send) — 우리 서버에서 나와 400개의 수신함에 도착하는 400개의 이메일 — 이것은 제가 없애려고 했던 부분이 결코 아니었습니다. 그 부분은 사소합니다. 단 하나의 버튼입니다. 인간에게는 반 초의 시간이 걸립니다. 저는 전송 과정이 힘들기 때문에 자동화한 것이 아닙니다. 그것은 제가 제거하고 싶었던 작업에 붙어 있었기 때문에 자동화했고, 마지막 연결 고리가 체인 안에 속해야 하는지 묻지도 않고 전체 과정을 끝까지 실행하게 내버려 두었습니다.
그리고 마지막 링크가 항상 가장 위험합니다. 그것은 현실 세계에 닿고 되돌릴 수 없는 단계입니다: 발송되는 메시지, 움직이는 결제, 라이브로 배포되는 과정, 삭제되는 기록. 그 이전의 모든 것은 가역적입니다 — 잘못된 초안은 아무것도 아니며, 잘못된 조정(reconciliation)은 다시 계산할 수 있는 숫자일 뿐입니다. 그것이 건물 밖으로 나가는 순간, 다른 네백 명 사람들의 삶에서 사실이 됩니다. 이것이 바로 단계이며, 인간에게 거의 비용이 들지 않는 유일한 단계입니다. 왜냐하면 소유하는 것이 단 한 번의 시선과 단 한 번의 터치이기 때문입니다.
'설정하고 잊어버리는(set it and forget it)' 것의 비극은 그것이 정확히 잘못된 절반만을 자동화한다는 것입니다. 값싸고 안전하며 가역적인 노동 — 좋습니다 — 그리고 그런 다음, 같은 상자에 담겨왔기 때문에, 사람이 루프 안에 있어야 했던 모든 이유였던 그 하나의 비싼, 비가역적인 단계를 또한 가져갑니다.
명확히 하자면 — 이것은 '자동화하지 마라'는 것이 아니다
저는 신중하고 싶습니다. 왜냐하면 이 주제의 게으른 버전은 '자동화는 위험하니, 모든 것을 수동으로 하라'이고, 그렇게 하면 자정까지 결제를 사람이 직접 조정하는 상황에 놓이게 되는데, 이는 비참할 뿐만 아니라 덜 오류가 생기는 것이 아니라 더 오류가 많이 발생하게 만듭니다.
공격적으로 자동화하세요. 저는 그렇습니다. 주기적인 보고서는 스스로 구축되어야 합니다. 데이터는 스스로 가져와져야 합니다. 초안은 스스로 작성되어야 합니다. 조정(reconciliation)은 매일 새벽 3시에 정확히 제가 했던 것처럼 실행되어야 합니다 — 저는 절대 그것을 수동으로 다시 하지는 않을 것이며, 반복되는 노동을 두려움 때문에 자동화하기를 거부하는 팀은 신중한 것이 아니라, 그저 느리고 지친 것입니다. 노동은 당신이 잠자는 동안 실행되어야 합니다. '설정하고 잊어버리는' 것의 그 부분은 선물입니다.
반복되는 작업과 되돌릴 수 없는 단계는 두 가지 다른 업무이며, 스케줄러는 그중 하나만 담당해야 합니다. 에이전트(agent)가 밤새 모든 것을 처리하게 하세요. 지루하고 복잡한 일련의 과정 전체를 감시 없이 진행하게 하십시오. 그리고 현실 세계와 연결되어 되돌릴 수 없는 단 하나의 단계에서 멈추게 하고, 그 결정을 아침까지 당신 책상 위에 남겨두세요. 잠자는 동안 네 개의 인박스에 자동으로 발송하는 것이 아닙니다. 이것은 자동화가 아닌, 출퇴근길을 자동화하고 서명(signature)을 지키는 것입니다.
비싼 경험을 통해 배운 현재의 방식
이메일을 밤 3시에 무차별적으로 보내던 습관은 제가 모든 반복적인 시스템을 구축하는 방식을 바꾸어 놓았습니다.
- 모든 자동화를 되돌릴 수 없는 경계에서 분리했습니다. "곧 발송될 결과물을 조립하는" 단계까지는 스케줄에 따라 감시 없이 실행됩니다. 실제로 전송하거나, 결제하거나, 배포하거나, 삭제하는 단계는 자동으로 실행되지 않습니다. 대신 _"현실 세계에 무엇을 할지 여기 있습니다. 승인하시겠습니까?"_라는 메시지와 함께 큐(queue)에 남게 됩니다. 노동은 새벽 3시에 진행됩니다. 결정은 오전 9시까지 기다립니다.
- 에이전트가 그 영향 범위(blast radius)를 보여주도록 했습니다. 승인 요청이 "이메일을 보낼까요?"라고만 말하지 않습니다. 대신 "400개의 이메일을 보낼 것입니다. 여기 세 개가 있고, 여기에 기반한 원장 조회 결과입니다."라고 말합니다. 바로 이 숫자—400—가 모든 것을 지킵니다. 절반만 작성된 원장은 사람이 그 수를 보는 순간 시각적으로, 명백하게 잘못되었다는 것을 보여주며, 인간이 단 하나의 이메일이 발송되기 전에 이미 그 수치를 확인하게 합니다.
- "깨끗하게 실행됨(ran clean)"을 "올바르게 실행됨(ran right)"으로 신뢰하는 것을 멈췄습니다. 제 밤 3시 작업은 지원 큐를 망가뜨렸던 날을 포함하여 매일 완벽하게 깨끗하게 실행되었지만, 녹색 상태는 정확한 상태와 같지 않습니다. 그리고 감시되지 않는 시스템에는 그 차이를 알려줄 사람이 없습니다. 따라서 제가 진정으로 감시 없이 실행하도록 허용한 것은 잘못되었을 경우 되돌릴 수 있는 작업뿐입니다.
이것이 제가 이렇게 구축하는 정확한 이유
한 단계 위로 보면, 이 문제점은 동일하며, 이것이 제가 에이전트 플랫폼을 구축하는 방식의 근거가 됩니다.
지금 자율 에이전트를 판매하는 모든 사람들은 '새벽 3시의 꿈'을 팔고 있습니다. 즉, 당신이 잠자는 동안 작동하고, 전체 작업을 처리하며, 당신이 일어나면 완료되어 있는 것입니다. 그리고 시연은 항상 아무도 지켜보지 않는 밤에 실제 사람들에게 400개의 이메일을 보내는 부분 바로 직전에 멈춥니다. 에이전트의 인상적인 부분—즉, 모든 과정을 감시 없이, 지치지 않고, 스케줄에 따라 실행할 수 있다는 점—은 또한 아무도 움찔거릴 새도 없이 현실 세계에 돌이킬 수 없는 무언가를 수행하는 정확한 메커니즘이기도 합니다.
그래서 저는 스케줄이 그 돌이킬 수 없는 단계를 소유하도록 절대 내버려두지 않습니다. 에이전트는 밤새 전체 반복 작업을 실행할 수 있습니다—조정(reconcile), 초안 작성(draft), 구축(build), 조립(assemble)—마치 지치지 않고 새벽 3시에 생산하는 **작성자(author)**처럼 말입니다. 두 번째 회의론자(skeptic) 에이전트는 결과물을 감탄하기보다는 깨뜨리려고 시도하며, 그래서 절반만 작성된 원장(ledger)은 의심하는 것이 전체 임무인 무언가에 의해 포착됩니다. 그리고 현실 세계에 도달하는 모든 단계—발송(send), 결제(payment), 배포(deploy), 삭제(delete)—는 멈춰서 버튼 위의 인간을 기다립니다. 이 사람은 스케줄이 절대 알지 못할 '폭발 반경(blast radius)'을 인지합니다. 노동은 당신이 잠자는 동안 실행됩니다. 서명은 당신이 깨어날 때까지 기다립니다. 이것이 xenition의 형태이며, 오전 9시에 지원 대기열(support queue)이 저에게 가르쳐준 것과 같은 교훈입니다. 작업을 자동화하는 것은 항상 괜찮았습니다. 400명에게 도달하는 단 하나의 결정을 자동화하는 것은 제가 실제로 원했던 것이 아니었습니다.
저는 그것을 설정하고 잊어버렸습니다. 소프트웨어는 잊지 않았습니다. 아무도 방에 없는데도, 저에게 지시한 대로 정확히 새벽 3시에 400명에게 실행했습니다. 노동 자체가 제가 그곳에 있어야 할 필요가 있는 것은 아니었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기