레슨 3: 복잡한 작업을 워크플로로 분해하기
학습 목표:
- 세 가지 작업 분해 전략 익히기
- 작업 사이의 의존 관계 찾아내기
- 분해 결과를 실행 가능한 워크플로로 옮기기
전제: 레슨 2: 워크플로의 구성 요소: 단계, 상태, 분기, 루프 | 다음: 레슨 4 >>
"어디서 시작할지 모르겠다"에서 명확한 단계로
작업 하나가 책상에 떨어집니다. "우리 모놀리식 Rails 앱을 마이크로서비스 아키텍처로 쪼개 주세요." 이것은 복잡한 작업입니다. 어디서 시작할지, 몇 개의 단계가 필요한지, 각 단계가 무엇을 하는지 알 수 없습니다.
작업 분해는 모호하고 지나치게 큰 작업을 작고 명확한 단계로 쪼개는 방법입니다.1
좋은 분해는 세 가지 기준을 충족합니다.
- 각 하위 작업이 충분히 작다. 에이전트 호출 하나나 함수 하나로 끝낼 수 있을 만큼.
- 하위 작업 사이의 의존 관계가 드러나 있다. 무엇이 순서대로 실행되어야 하고 무엇이 병렬로 실행될 수 있는지 안다.
- 각 하위 작업의 입력과 출력이 명확하다. 한 단계의 출력이 다음 단계로 곧바로 들어갈 수 있다.
분해를 잘하면 워크플로 작성이 레고를 맞추는 것처럼 느껴집니다. 분해를 잘못하면 실행 도중에 단계가 빠졌거나, 순서가 틀렸거나, 데이터가 흘러가지 않는다는 것을 알게 됩니다.2
전략 1: 순차 분해
언제 쓰는가: 작업에 처음부터 끝까지 명확한 순서가 있고, 각 단계가 바로 앞 단계의 결과에 의존할 때.
어떻게 하는가: 끝에서 거꾸로 올라갑니다. "이 단계에는 어떤 입력이 필요한가? 그 입력은 어디서 오는가?"를 물어보세요.
예시: 기술 문서 생성
작업: API의 사용자용 문서를 생성한다.
거꾸로 올라가는 분해:
워크플로로 옮기면:
의존 관계 사슬:
2단계는 1단계와 병렬로 돌 수 있습니까? 아니요. 2단계에는 1단계의 endpoints가 필요합니다.
3단계는 2단계와 병렬로 돌 수 있습니까? 아니요. 3단계에는 2단계의 examples가 필요합니다.
순차 분해의 특징: 의존 관계 사슬이 길고, 병렬화할 기회가 적지만, 로직이 명확합니다.3
전략 2: 병렬 분해
언제 쓰는가: 작업이 서로 의존하지 않는 여러 독립적인 하위 작업으로 나뉠 때.
어떻게 하는가: "모든 X에 대해 Y를 한다" 패턴을 찾아내세요. 각각의 X를 병렬로 처리할 수 있습니다.
예시: 코드베이스 보안 감사
작업: 파일 100개의 보안 문제를 감사한다.
병렬 분해:
모양:
팬아웃-리듀스 패턴: 병렬 분해에서 가장 흔한 모양입니다.4
- 팬아웃: 작업을 여러 병렬 에이전트에 흩뿌린다.
- 리듀스: 모든 결과를 하나의 최종 출력으로 합친다.
병렬 분해의 위력: 파일 100개, 하나를 감사하는 데 2분. 순차 실행은 200분이 걸리지만, 병렬 실행은 2분이면 됩니다(자원 제약이 없다고 가정할 때).
전략 3: 혼합 분해
언제 쓰는가: 현실의 작업 대부분. 어떤 부분은 병렬로 돌고, 어떤 부분은 순서대로 돌아야 합니다.
어떻게 하는가: 먼저 상위 단계를 찾고(이들은 순서대로 돌아야 합니다), 그다음 각 단계 안에서 병렬화할 기회를 찾습니다.
예시: 대규모 리팩터링
작업: 컴포넌트 50개를 Vue 2에서 Vue 3로 업그레이드한다.
혼합 분해:
워크플로로 옮기면:
혼합 분해의 의존 관계 그래프:
혼합 분해의 핵심: 정말로 필요한 순서는 지키면서, 병렬화할 기회는 하나도 남김없이 짜냅니다.3
LLM으로 분해를 돕기
분해를 LLM에게 맡길 수도 있습니다. zero-shot 프롬프팅, chain-of-thought 프롬프팅, few-shot(예시로 이끄는) 프롬프팅 세 가지 모두 잘 작동합니다.1
Zero-shot
Chain-of-thought
Few-shot
LLM 분해의 장점: 첫 계획 초안을 빠르게 뽑아 주고, 놓쳤을 법한 단계를 잡아 줍니다.
LLM 분해의 단점: 너무 추상적인 수준에 머무를 수 있어("각 파일의 순환 복잡도를 계산한다" 대신 "데이터를 분석한다"고 말하는 식으로) 사람이 날을 세워 줘야 합니다.1
의존 관계를 찾아내는 실전 요령
요령 1: "이 단계가 첫 번째 단계보다 먼저 돌 수 있는가?"를 물어보기
답이 "그렇다"면 병렬로 돌 수 있습니다. "아니다, 첫 번째 단계의 결과가 필요하다"면 의존 관계가 있는 것입니다.
요령 2: 의존 관계 그래프 그리기
2단계와 3단계는 병렬로 돌 수 있습니까? 그렇습니다. 둘 다 1단계에만 의존합니다.
3단계와 4단계는 병렬로 돌 수 있습니까? 아니요. 4단계는 2단계에 의존합니다.
화살표가 의존을 뜻하고 시작점으로 되돌아가는 일이 없는 그래프에는 DAG(방향성 비순환 그래프)라는 정식 이름이 있습니다. 1단계는 아무것에도 의존하지 않으므로, 그래프가 가장 먼저 실행할 수 있는 잎입니다. 화살표의 방향을 한 번도 어기지 않도록 모든 단계의 순서를 정하는 일을 위상 정렬이라고 부릅니다.
요령 3: 데이터 흐름 확인하기
각 단계의 입력과 출력을 나열해 보세요.
단계 X의 입력이 단계 Y의 출력에서 온다면, X는 Y에 의존합니다.
흔한 분해 실수
실수 1: 단계가 너무 크다
"데이터 준비"는 무엇을 포함합니까? 파일 읽기? 설정 파싱? 데이터베이스 연결? 너무 모호합니다.
실수 2: 에러 처리 단계가 없다
2단계가 실패하면 어떻게 됩니까? 서비스 A는 이미 배포됐는데 B는 아니고, 시스템은 일관성 없는 상태에 놓입니다.
실수 3: 병렬화할 기회를 놓친다
이렇게 하면 서비스를 한 번에 하나씩 처리합니다. 느립니다.
다음: 레슨 4: 상태 관리와 컨텍스트 전달 — 워크플로의 단계 사이에서 데이터를 올바르게 전달하고 관리하는 방법을 배웁니다.