AI 에이전트 18개로 2021년 글 67편을 병렬 보강한 방법

2021년에 쓴 강좌 글 67편을 AI 서브 에이전트 18개로 검증된 한·영·일 글로 보강했다. 공통 브리프에 넣은 것, 웨이브 나누는 법, 모두가 통과한 검증 도구, 빌드·배포를 한 번으로 모은 병합, 사람이 확인한 것까지 정리했다.

블로그를 몇 년 운영하다 보면, 옛날에 쓴 강좌 글이 검색에는 걸리는데 내용은 낡아서 손대기 겁나는 상태가 됩니다. 이 글은 그런 글 수십 편을 AI 서브 에이전트로 한꺼번에 고치고 싶은데, 병렬로 돌렸다가 엉망이 될까 걱정하는 분을 위한 기록입니다. 저희는 2021년에 쓴 강좌 글 67편을 모두 검증된 한국어·영어·일본어 글로 보강했고, 마지막 54편은 에이전트 18개를 병렬로 돌려 한 번에 배포했습니다. 잘된 이유는 네 가지뿐입니다. 공통 브리프, 철저한 파일 담당 구분, 모든 에이전트가 통과해야 하는 검증 도구, 그리고 에이전트에게는 맡기지 않은 단 한 번의 병합입니다.

운영 서버를 에이전트에게 맡길 때의 안전장치는 AI 코딩 에이전트에게 운영 서버를 맡겼을 때 실제로 버틴 안전장치에 정리했습니다. 이번 글은 그다음 이야기로, 에이전트 여러 개가 저장소 하나를 같이 쓰면서도 충돌하지 않게 한 방법입니다.

숫자로 본 전체 작업

아래 숫자는 모두 작업 중 도구 출력이나, 나중에 파일을 다시 세어 본 결과입니다.

항목 값
보강한 2021년 글 67편 (전부)
병렬 웨이브로 처리한 글 54편
웨이브에 쓴 서브 에이전트 18개 (웨이브당 6개)
에이전트 하나당 글 2~4편
에이전트 작업 시간 합계 약 349분
첫 실행부터 마지막 완료까지 실제 시간 약 50분
에이전트 18개의 도구 호출 수 1,313번
54편에 새로 넣은 그림 91개 (67편 전체로는 108개)
마지막 배포에서 바뀐 파일 1,368개 중 839개
옛 이미지 백업 후 서버에서 삭제 85개 (11 + 74)
배포 전 콘텐츠 검사 오류 0건, 경고 0건

이 배포 뒤 글 수는 세 언어 모두 86편, 사이트맵 주소는 326개가 됐습니다.

처음부터 18개는 아니었다: 먼저 13편

처음부터 에이전트 18개를 돌린 것은 아닙니다. 첫 13편은 작게 나눠 진행했고, 단계마다 브리프에 들어가야 할 내용을 하나씩 배웠습니다.

  • 1편은 메인 세션 혼자 써서 형식을 정했습니다. 한국어 원문을 그 자리에서 고쳐 쓰고, 영어판과 일본어판을 새로 만드는 방식입니다.
  • 3편은 메인 세션이 한 편씩 했습니다. "2021년 예제를 전부 다시 돌린다"는 원칙의 효과가 여기서 드러났습니다. 정렬 예제는 2 3 4 5 7이 아니라 23457을 출력했고, 2021년 퀵 정렬은 이미 정렬된 입력에서 스택 오버플로로 죽었습니다.
  • 3편은 서브 에이전트 하나에게 맡겨, 혼자서도 형식을 지키는지 시험했습니다. 17.3분 걸렸습니다.
  • 6편은 에이전트 3개가 동시에 2편씩 했습니다. 13.9분, 14.6분, 15.4분이 걸렸습니다. 여러 에이전트가 그림 폴더와 검증 도구를 같이 쓴 첫 경험이었고, 문제도 두 가지 나왔습니다. 옛 스크린샷에 Windows 계정 이름이 찍혀 있었던 것, 그리고 다른 에이전트의 그림 때문에 경고가 뜬 것입니다.

운영자가 "나머지는 하나하나 묻지 말고 전부 보강해 달라"고 했을 때 남은 글은 54편이었습니다. 무엇이든 실행하기 전에 브리프부터 썼습니다.

공통 브리프에 넣은 것

에이전트마다 주는 프롬프트는 짧게 했습니다. "이 브리프를 그대로 따를 것", 맡을 글 목록, 범위에 대한 짧은 메모가 전부입니다. 나머지는 마크다운 파일 하나에 모아 모든 에이전트가 읽게 했습니다. 이렇게 하면 프롬프트 18개가 서로 어긋나지 않고, 규칙을 고칠 때도 한 곳만 고치면 됩니다.

브리프 내용은 이렇습니다.

  • 글마다 만들 것. 2021년 한국어 파일을 그 자리에서 고쳐 쓴다(slug, 원래 날짜, 워드프레스 시절 항목은 유지). 영어판과 일본어판을 만든다. 그림을 1~2개 넣는다. 줄 단위 번역이 아니라 각 언어 독자에 맞춰 쓴다.
  • 핵심은 검증. 예제 코드를 모두 꺼내 C#은 .NET 10, C/C++는 clang으로 컴파일하고 실행한다. 실제 출력과 코드 번호가 붙은 실제 경고를 싣는다. 2021년의 틀린 내용은 고치고, 고쳤다고 글에 밝힌다. "C# N에서 추가"라는 주장은 낮은 언어 버전으로 컴파일해서 확인한다.
  • Windows 전용 코드. WinForms와 Win32는 Mac에서 컴파일은 되지만 실행은 안 된다. 컴파일만 하고 "컴파일만 확인, 실행하지 않음"이라고 분명히 적는다. 출력을 지어내지 않는다.
  • 옛 이미지. 글이 참조하는 이미지는 모두 연다. 개인정보가 찍힌 것, 낡은 것, 남의 자료에서 가져온 것으로 보이는 것은 뺀다.
  • 본문 속 개인정보. 붙여 넣은 컴파일러 출력에 남은 Windows 사용자 폴더, 예제 데이터로 쓴 실명을 찾는다.
  • 파일 담당 구분. 쓸 수 있는 것은 자기 content/*/<slug>.md와 data/figures/<slug>.yaml뿐이다. 다른 글, 스크립트, 템플릿, 서버는 건드리지 않는다.
  • 빌드와 배포는 하지 않는다. 다른 에이전트가 병렬로 작업 중이기 때문이다.
  • 보고 전에 통과할 검증 도구와 정해진 보고 형식(제목, 분량, 소제목, 그림 id, 고친 2021년 오류, 실측값, 뺀 이미지, 검증 도구의 마지막 줄).

브리프는 작업 도중에도 바뀌었습니다. 웨이브 1에서 한 에이전트는 교재에서 가져온 것으로 보이는 그림을 뺐고, 다른 에이전트는 예제 데이터에 운영자 이름이 쓰인 것을 찾았습니다. 이 두 가지 검사를 웨이브 2·3 시작 전에 브리프에 추가했기 때문에, 뒤쪽 36편은 처음부터 그 검사를 거쳤습니다.

6단계 흐름도. 규칙, 검증 항목, 맡을 파일을 적은 공통 브리프가 세 번의 웨이브로 나뉜 에이전트 18개(하나당 글 2~4편)에게 간다. 각 에이전트는 모든 코드를 컴파일·실행하고 그림과 YAML 검사를 통과한다. 이어서 메인 세션이 개인정보 grep과 안 쓰는 이미지 목록으로 검토한다. 그다음 빌드를 한 번 하고 콘텐츠 검사가 오류 0건인지 확인한다. 마지막으로 배포를 한 번 하면서 지운 이미지를 서버에서도 삭제하고 404를 확인한다.
2021년 글 54편이 한 번의 배포에 이르기까지. 에이전트는 각자 맡은 파일만 검증했고, 빌드와 배포는 메인 세션만 했다.

웨이브는 이렇게 나눴다

글은 분량이 아니라 주제로 묶었습니다. 내용이 겹치는 글을 같은 에이전트에게 주기 위해서입니다.

  • 웨이브 1: C# 기초 18편. 에이전트 6개가 3편씩.
  • 웨이브 2: 19편. 컬렉션, LINQ 쿼리 구문과 리플렉션·파일 입출력, 레지스트리와 WinForms(이 에이전트만 4편), Win32 API 두 묶음, 정규식 입문.
  • 웨이브 3: 17편. 정규식 문자 집합과 수량자 등(4편), 스택과 큐, 연결 리스트, 트리·힙·이진 탐색 트리, BFS와 DFS, 탐욕 알고리즘과 순차 탐색.

일을 고르게 나누는 것보다 주제로 묶는 것이 더 중요했습니다. 2021년 컬렉션 글 3편은 내용이 많이 겹쳐서, 한 에이전트에게 몰아 주고 "각 글의 범위를 분명히 나누고 서로 링크하라"고 지시했습니다. 관련 글을 다른 에이전트에게 나눠 줄 수밖에 없을 때는 프롬프트에 그렇게 적었습니다. 웨이브 3의 정규식 담당에게는 입문 글을 다른 에이전트가 동시에 쓰고 있으니, 반복하지 말고 링크하라고 알려 줬습니다.

웨이브 2는 웨이브 1 에이전트 3개가 아직 돌고 있을 때 시작했고, 웨이브 3은 그 4분 뒤에 시작했습니다. 그때부터 끝날 때까지 에이전트 12개가 동시에 돌았습니다. 에이전트 하나가 걸린 시간은 2편을 맡은 경우 13.1분부터, 정규식 엔진 네 가지로 4편을 시험한 경우 26.0분까지였습니다.

막대그래프. 웨이브 1 에이전트 6개의 작업 시간 합계는 112.4분, 웨이브 2는 121.6분, 웨이브 3은 115.2분이다. 첫 실행부터 마지막 에이전트가 끝날 때까지의 실제 시간은 약 50분이다.
웨이브별 에이전트 작업 시간 합계(완료 알림 기록 기준)와, 첫 실행부터 마지막 완료까지 걸린 실제 시간. 웨이브 2와 3은 겹쳐서 돌았다.

진행 상황은 에이전트 출력을 읽지 않고 파일 자체로 셌습니다. 한국어 파일이 legacy: false이고 영어판과 일본어판이 모두 있으면 완료로 봅니다. 이 글을 쓰면서 같은 루프를 다시 돌렸습니다(zsh).

n=0
for f in content/ko/_legacy/*.md; do
  s=$(basename $f .md)
  if grep -q "^legacy: false" $f && [ -f content/en/$s.md ] && [ -f content/ja/$s.md ]; then
    n=$((n+1))
  fi
done
echo "revised $n / $(ls content/ko/_legacy/*.md | wc -l | tr -d ' ')"
revised 67 / 67

작업 중에는 같은 루프가 한 번은 완료 38 / 67을, 10분 뒤에는 완료 64 / 67을 출력했습니다. 공유된 사실은 파일 시스템에 있고, 이렇게 세면 어떤 에이전트의 말에도 기대지 않아도 됩니다.

에이전트마다 예제를 전부 실행시킨 이유

2021년 강좌를 한 줄도 돌리지 않고 읽기 좋게 고쳐 쓰는 일은 에이전트도 할 수 있습니다. 겉보기는 멀쩡해도 내용은 틀린 채로 남습니다. 보고서를 보면 "읽어 보니 괜찮다"로는 놓쳤을 것들이 분명히 보입니다.

  • C# 컬렉션 글에는 Colsole 오타가 있어 오류 CS0103이 납니다. 공개돼 있던 예제는 한 번도 컴파일되지 않는 상태였습니다.
  • C++ 힙 구현은 논리 자체는 맞았습니다. 무작위 연산 40만 번의 결과가 std::priority_queue와 같았습니다. 그런데 힙 객체를 복사하면 이중 해제가 일어났고, AddressSanitizer가 이를 보고했습니다.
  • Win32 예제는 한국어 창 제목으로 FindWindowA를 불렀습니다. GCC로 빌드하면 문자열이 UTF-8로 실행 파일에 들어가서, 한국어 Windows에서는 이 ANSI 호출이 절대 일치하지 않습니다.
  • 2021년 예제 하나에는 닫는 중괄호 뒤에 보이지 않는 U+200B가 들어 있었습니다. 그대로 붙여 넣으면 error: '\U0000200b' does not name a type이 납니다.

모두 읽기만 해서는 안 보이고, 컴파일하면 전부 나옵니다. 그래서 브리프에서 코드 실행을 핵심 업무로, 글쓰기를 그다음으로 뒀습니다. 실제 오류 번호, 실제 출력, 무엇을 왜 고쳤는지. 검색 요약이 대신해 줄 수 없는 부분도 바로 여기입니다.

에이전트가 통과해야 한 검증 도구

보고하기 전에 에이전트는 다음을 보여 줘야 했습니다.

  1. check_figures.py 오류 0건, 자기 그림에는 경고 없음. 그림을 세 언어와 휴대폰용 세로 배치로 그려 보고, 가로 1000px을 넘으면 경고합니다.
  2. 한국어·일본어 그림을 실제로 그려서 눈으로 확인. qlmanage로 SVG를 PNG로 바꿔 열어 봤고, 라벨 겹침을 이렇게 찾아 고친 에이전트가 여럿이었습니다.
  3. 프론트매터가 YAML로 읽히는지, 제목·설명 길이는 짧은 스크립트로 확인.
  4. 자기 파일에 개인 경로나 이름이 남았는지 본문 검사.

공유 검증 도구에는 약점이 하나 있었습니다. check_figures.py는 폴더 안의 모든 그림을 그리기 때문에, 각 에이전트에게 다른 에이전트가 작업 중인 그림의 경고까지 보였습니다. 한 보고서에는 "경고 12건은 모두 다른 에이전트의 그림이고, 내 그림 6개에는 경고가 없다"고 적혀 있었습니다. 맞는 말이지만, 모든 에이전트가 출력을 담당자별로 골라내는 수고를 했습니다. 다시 한다면 검증 도구가 기본으로 지정한 slug만 보고하게 하겠습니다.

병합: 빌드 한 번, 검사 한 번, 배포 한 번

마지막 에이전트가 끝난 뒤 메인 세션 혼자 다음 순서로 병합했습니다.

  1. 개인 이름과 경로 검사를 바뀐 파일만이 아니라 사이트 전체, 모든 언어에 대해 실행.
  2. 어느 글에서도 참조하지 않는 옛 이미지 목록 작성.
  3. 그 이미지를 로컬 백업 폴더로 이동.
  4. 빌드 한 번, 콘텐츠 검사, 그림 검사.
  5. --prune을 붙여 배포 드라이런을 하고, 지울 대상이 이미지뿐인지 확인.
  6. 실제 배포 후 공개 주소를 골라서 확인. 지운 이미지 하나가 404를 돌려주는 것도 봤습니다.

그때 출력에서 관련 줄만 옮깁니다.

build ok → …/public  (posts: en 86, ja 86, ko 86, sitemap urls: 326)
검사: 파일 1368개, HTML 330개 → 오류 0건, 경고 0건
그림 144개 · 오류 0 · 경고 0
prune would delete: 74 | non-image: []
빌드 파일 1368개 중 변경 839개
404 /static/img/legacy/2021/06/20190404_171228_204.png
8/8 통과

바뀐 파일이 800개를 넘어서 배포에 15분 정도 걸렸습니다. 마지막에 한 번만 빌드하면 놓치기 쉬운 사고도 막을 수 있습니다. 보강 중인 글은 절대 공개되면 안 되는데, 글쓴이가 18명인 상황에서 이를 보장하는 방법은 아무에게도 배포를 맡기지 않는 것뿐입니다.

그래도 사람이 확인한 것

병렬 에이전트로 글 쓰는 시간은 줄지만, 검토 시간이 0이 되지는 않습니다. 실제로 든 검토 비용은 이렇습니다.

  • 보고서 18개 읽기. 보고서마다 제목, 분량, 소제목, 고친 2021년 오류, 뺀 이미지가 적혀 있습니다. 에이전트를 넘나드는 발견은 여기서 나왔습니다. Windows 계정 이름을 언급한 첫 보고서를 보고 사이트 전체를 검색해서, 같은 경로가 남은 글 2편을 담당 에이전트가 시작하기 전에 찾았습니다.
  • 지적된 이미지 뒷정리. 앞선 에이전트는 로컬 사용자 경로가 찍힌 스크린샷을 글에서 뺐지만, 파일은 서버에 그대로 있었습니다. 참조를 지운다고 파일이 지워지지는 않습니다.
  • 에이전트의 자진 신고 확인. 한 에이전트는 경로를 잘못 입력해 쓸데없는 파일을 만들었다가 바로 지웠다고 보고했습니다. 그 폴더가 정말 없어졌는지 확인했습니다.
  • 우리 쪽 검색 패턴 넓히기. 운영자 이름을 단어 경계로 찾던 grep이, 이름이 다른 단어에 붙은 표기를 놓쳤습니다. 본문에서 찾아낸 것은 에이전트였고, 저희는 패턴을 넓혀 전체를 다시 검색했습니다.
  • 삭제 목록 읽기. prune 목록을 한 줄씩 읽었고, 이미지가 아닌 파일이 없는지도 스크립트로 확인했습니다.
  • 운영자만 할 수 있는 일. 전체 실행 승인, 그리고 그 뒤 운영자에게 넘긴 두 가지입니다. 지운 이미지가 캐시에서 계속 나가지 않도록 호스팅 관리 화면에서 CDN 캐시 비우기, 새 주소의 Search Console 색인 요청(대기 183개, 하루 10개 정도).

검토에서 놓친 것도 하나 있고, 이 글을 쓰려고 다시 세다가 찾았습니다. 셸 루프 버그 때문에 안 쓰는 이미지 하나가 옮겨지지 않은 것입니다. 그 경위는 AI 에이전트의 첫 진단이 틀렸을 때에, 이미지 점검은 옛 블로그 글 개인정보·저작권 점검에 썼습니다.

병렬 에이전트가 도움이 될 때, 해가 될 때

상황 병렬로? 이유
작업마다 자기 파일만 쓴다(글 하나, 그 번역, 그 그림 파일) 예 병합 충돌이 없고, 공유 단계는 빌드뿐
작업끼리 파일을 같이 쓴다(주제 목록, 템플릿, 설정) 아니오, 또는 한 에이전트에게 소유권 둘이 같은 파일을 고치면 한쪽 작업이 사라진다
B가 A의 결과를 필요로 한다(목차 페이지, 완성된 글로의 링크) 웨이브로 이미 보강한 관련 글에 링크하는 글처럼 B를 다음 웨이브로
모든 작업을 스크립트로 확인할 수 있다(컴파일, 렌더링, 파싱) 예 에이전트가 보고 전에 스스로 증명할 수 있다
품질이 스크립트로 안 되는 판단이다(문체, 법적 문구) 적게, 검토는 두껍게 검토 비용이 에이전트 수만큼 늘어난다
공유 상태를 바꾸는 단계(빌드, 배포, 삭제) 절대 병렬로 하지 않음 모두 끝난 뒤 한 세션에서
주제가 겹치는 글 한 에이전트에게 묶어서 겹침은 둘 사이보다 한 에이전트 안에서 정리하기 쉽다
판단 그림. 먼저 각 작업이 자기 파일만 가지는가. 아니면 한 세션에서 한다. 그렇다면 순서가 중요한가. 중요하면 의존하는 작업을 다음 웨이브로 미룬다. 중요하지 않다면 각 에이전트가 자기 작업을 검증할 수 있는가. 못 하면 검증 도구부터 만든다. 할 수 있으면 병렬로 돌린다.
작업을 에이전트에게 나누기 전에 확인하는 질문. 공유 파일과 순서 의존이 병렬 작업을 병합 작업으로 바꿔 버린다.

솔직한 한계

  • 가장 큰 성과는 속도가 아닙니다. 349분 분량의 작업이 약 50분에 끝난 것은 눈에 띄지만, 글의 품질은 검사의 품질만큼입니다. 컴파일과 실행이 없었다면 빨라지는 것은 틀리기까지의 시간뿐입니다.
  • Windows 전용 코드는 컴파일만 했고 실행하지 않았습니다. WinForms, 레지스트리, Win32를 쓰는 글에는 그렇게 밝혔습니다. 실행 시 동작은 문서에 근거한 설명이지 저희가 잰 값이 아닙니다.
  • "가져온 것 같다"는 판단입니다. 교재 그림과 비슷한 것은 뺐지만, 하나하나 출처를 증명한 것은 아닙니다. 안전한 쪽을 골랐습니다.
  • 검증 도구는 확인하는 것만 확인합니다. 모든 글이 그림·콘텐츠 검사를 통과했는데도 셸 루프 버그는 빠져나갔습니다. 개수를 비교했다면 잡혔을 것이고, 지금은 점검 목록에 들어 있습니다.

다음에도 쓸 방식은 이렇습니다. 브리프를 먼저 쓰고, 에이전트마다 파일을 나누고, 모두에게 스크립트로 작업을 증명하게 하고, 빌드·배포·삭제는 한곳에 모은다.

자주 묻는 질문

에이전트를 몇 개 동시에 돌렸고, 얼마나 걸렸나요?

마지막 54편은 6개씩 세 웨이브, 모두 18개의 서브 에이전트에게 2~4편씩 맡겼습니다. 작업 시간을 더하면 약 349분이지만, 웨이브 2와 3을 겹쳐 돌려서 첫 실행부터 마지막 완료까지 실제로 걸린 시간은 약 50분이었습니다.

에이전트마다 직접 빌드·배포하게 하지 않은 이유는요?

빌드는 공개 폴더 전체와 사이트맵을 다시 쓰고, 배포는 더 이상 참조되지 않는 파일을 지웁니다. 둘 다 공유 상태입니다. 쓰다 만 글이 공개되지 않도록, 빌드와 배포는 모두 끝난 뒤 메인 세션이 한 번만 했습니다.

사람은 무엇을 확인했나요?

메인 세션이 에이전트 보고서를 모두 읽고, 사이트 전체 개인정보 검사를 다시 돌리고, 지적된 이미지를 확인하고, 배포 때 지워질 파일 목록을 한 줄씩 봤습니다. 운영자는 전체 실행을 승인했고, 계정 주인만 할 수 있는 일(CDN 캐시 비우기, 새 주소 색인 요청)을 넘겨받았습니다.

  • #AI에이전트
  • #Claude Code
  • #서브에이전트
  • #글보강
  • #병렬처리
  • #검증

t.laboratory

직접 만들고 운영하는 앱·서버·서비스에서 겪은 문제와, 그 해결에 쓴 코드를 기록하는 기술 블로그입니다.

운영자 소개 · 앱

↑