TL;DR — 플래닝(Planning)은 에이전트가 복잡한 목표를 실행 가능한 단계의 시퀀스로 스스로 분해하는 패턴입니다. 핵심 질문은 하나 — “방법(HOW)이 이미 알려져 있는가?” 알려져 있으면 고정 워크플로우(Task Execution), 모르면 플래닝입니다. 구조는 Plan-and-Execute — Planner(목표→계획) → Executor(단계 실행) → Replanner(평가→계속/완료). 진짜 힘은 적응성에 있습니다. 계획은 고정 스크립트가 아니라 시작점일 뿐, 실패하면 재계획(Replanning)하죠 — “에이전트는 실패하지 않고 적응한다.” LangGraph(StateGraph)·CrewAI(planning=True)·Google ADK(Sequential/Parallel/Loop)로 구현하고, 킬러 앱은 Deep Research입니다. 엔터프라이즈(CRM·ERP·Groupware)에 적용하면 연간 순효과 $840K·ROI 280% — 단, Human-in-the-Loop(HITL)과 롤백 전략이 필수입니다.
1. 왜 플래닝인가 — 도구를 줬는데 순서를 모른다
앞선 다섯 편을 빠르게 되짚어 봅시다. 1편 프롬프트 체이닝은 작업을 순서대로 쪼갰고, 2편 라우팅은 입력에 따라 길을 나눴으며, 3편 병렬화는 독립 작업을 동시에 던졌고, 4편 리플렉션은 쓴 결과를 다시 읽고 고쳤습니다. 그리고 5편 도구 사용은 LLM에게 손과 발을 달아 바깥세상과 연결했죠. 그런데 여기서 결정적인 질문이 하나 남습니다 — “도구를 줬는데, 그걸 언제·어떤 순서로 쓸지는 누가 정하지?”
사용자가 “신규 직원 온보딩 끝내줘” 한마디를 던졌다고 합시다. 여기엔 정답 레시피가 없습니다. 계정을 먼저 만들지 권한부터 줄지, 장비는 언제 신청하고 교육은 어느 시점에 배정할지 — 목표(WHAT)는 명확하지만 방법(HOW)은 비어 있습니다. 플래닝은 바로 이 빈칸을 에이전트가 스스로 채우게 하는 패턴입니다. 형식적으로는 초기 상태(Initial State)에서 목표 상태(Goal State)까지 도달하는 행동의 시퀀스를 자율적으로 설계하는 것이죠.
비유하자면 이렇습니다. 레시피를 그대로 따라 하는 건 요리(실행)지만, “냉장고 재료로 손님 4명 코스를 차려줘”는 메뉴를 먼저 짜는 일(계획)입니다. 재료를 확인하고, 코스 순서를 정하고, 조리 시간을 역산하고, 빠진 재료가 있으면 대체하죠. 플래닝 에이전트가 하는 일이 정확히 이것 — 생각(Reasoning)을 행동의 청사진으로 바꾸는 것입니다.
2. Planning vs 작업 실행 — 단 하나의 질문
모든 작업에 플래닝이 필요한 건 아닙니다. 오히려 대부분의 작업엔 과합니다. 플래닝을 쓸지 말지는 단 하나의 질문으로 갈립니다 — “방법(HOW)이 이미 알려져 있는가?” 답이 “예”면 굳이 계획을 세울 필요 없이 정해진 절차를 실행(Task Execution)하면 되고, “아니오”면 방법을 발견(Planning)해야 합니다.
이 차이를 기존 RPA/규칙 기반 자동화와 견주면 더 선명해집니다. RPA는 IF 불만유형=배송지연 THEN 사과메시지 발송처럼 모든 분기를 사람이 미리 정의해야 합니다. 정의되지 않은 상황이 오면 그대로 멈춥니다. 플래닝은 “VIP 불만을 해결하라”는 목표를 받아 고객 특성·이력·불만 유형을 고려해 해결 계획을 그때그때 생성합니다.
| 항목 | 기존 RPA / 워크플로우 | Planning Pattern |
|---|---|---|
| 유연성 | 낮음 | 높음 |
| 예외 처리 | 수동 정의 | 자동 적응 |
| 복잡한 작업 | 제한적 | 우수 |
| 유지보수 | 규칙 업데이트 | 자가 학습 가능 |
| 초기 구현 비용 | 낮음 | 중간 |
| 장기 TCO | 중간 | 낮음 (적응성으로 절감) |
정리하면 — 이미 길이 닦여 있으면 RPA가 빠르고 싸고 안전합니다. 플래닝은 길이 없거나, 매번 길이 바뀌거나, 길 위에서 돌발 상황이 생기는 문제에서 비로소 값을 합니다. 초기 비용은 조금 더 들지만, 규칙을 끝없이 손보지 않아도 되니 장기 TCO는 오히려 낮아집니다.
3. 적응성과 재계획 — “에이전트는 실패하지 않는다”
플래닝에서 가장 흔한 오해가 “계획을 한 번 세우고 그대로 따른다”는 것입니다. 진짜 힘은 정반대에 있습니다. 초기 계획은 고정된 스크립트가 아니라 ‘시작점’일 뿐이고, 실행 중 새로운 정보가 나오면 계획을 다시 짭니다(Replanning). 이 적응성(Adaptability)이야말로 플래닝을 RPA와 가르는 본질입니다.
예를 들어 “팀 오프사이트 행사를 준비하라”는 목표를 받았다고 합시다. 첫 단계가 “A 호텔 예약 확인”인데 막상 예약이 불가하다면? RPA라면 여기서 멈추거나 오류를 던집니다. 플래닝 에이전트는 다릅니다 — 제약을 새 정보로 등록하고, 옵션을 재평가해 B 호텔로 경로를 갈아탑니다.
2. 케이터링 업체 연락 (대기)
3. 참가자 확정 (대기)
NEW B 호텔 예약 진행
3. 케이터링 연락 (B 기준 조정)
4. 참가자 확정 및 일정 안내
4. Plan-and-Execute — 플래닝의 표준 아키텍처
플래닝을 구현하는 가장 널리 쓰이는 구조가 Plan-and-Execute입니다. 역할이 셋으로 나뉩니다 — 목표를 계획으로 바꾸는 Planner, 계획의 한 단계를 실행하는 Executor, 결과를 보고 계속할지 끝낼지 정하는 Replanner. 이 셋이 루프를 이루는 게 핵심입니다.
의존성 정렬
도구 호출 · 결과 수집
계속 / 완료 결정
| 컴포넌트 | 역할 | 입력 | 출력 |
|---|---|---|---|
| Planner | 목표를 분석해 실행 계획 생성 | 사용자 목표 | Plan (단계 목록) |
| Executor | 현재 단계를 실행하고 결과 수집 | 현재 단계, 컨텍스트 | 실행 결과 |
| Replanner | 결과 평가 및 계획 조정/완료 판단 | 실행 결과, 남은 계획 | 계속/완료 결정 |
왜 Planner와 Executor를 분리할까요? 한 모델이 “생각하면서 동시에 실행”하면 긴 작업에서 길을 잃기 쉽습니다. 계획을 먼저 통째로 세워 두면 전체 그림을 잃지 않고, 각 단계는 작고 검증 가능한 단위가 되며, 실패해도 그 단계만 다시 짜면 됩니다. “설계도와 시공을 나누는” 셈이죠.
5. 구현 ① LangGraph — StateGraph로 짓는 Plan-and-Execute
LangGraph는 플래닝을 상태 그래프(StateGraph)로 표현합니다. 노드 셋(planner · executor · replanner)을 만들고, Replanner 뒤에 조건부 엣지를 달아 “Executor로 되돌릴지, 끝낼지”를 가릅니다. 가장 먼저 볼 것은 상태 정의입니다.
한 줄이 마법입니다. Annotated[..., lambda x, y: x + y]는 리듀서(Reducer)입니다 — past_steps에 새 값이 들어오면 덮어쓰지 않고 기존 리스트에 이어 붙여 실행 이력을 자동 누적합니다. 덕분에 노드는 “이번에 한 일”만 반환하면 됩니다. 이제 노드 세 개를 봅시다.
마지막 퍼즐은 종료 판정입니다. should_end가 조건부 엣지로 들어가 response가 채워졌거나 plan이 비면 끝내고, 아니면 Executor로 되돌립니다.
상태가 TypedDict로 명시되고 흐름이 그래프로 보여 디버깅·시각화가 쉽고, 조건부 엣지로 재계획 루프를 자유롭게 그릴 수 있습니다. 복잡한 조건부 로직과 프로덕션급 제어가 필요할 때 LangGraph가 빛납니다. 단, should_end의 종료 조건을 분명히 두지 않으면 무한 루프에 빠지니, 반복 횟수 상한도 함께 거는 게 정석입니다.
6. 구현 ② CrewAI — 역할 기반 협업과 자동 계획(planning=True)
CrewAI는 발상이 다릅니다. 그래프를 그리는 대신 “전문가 팀을 꾸린다”는 메타포로 접근하죠. Agent(역할 전문가)와 Task(작업)를 정의해 Crew로 묶으면 됩니다. 그리고 옵션 한 줄이 플래닝을 켭니다 — planning=True.
두 가지가 핵심입니다. 첫째, context=[plan_task] — 이전 Task의 결과를 다음 Task로 명시적으로 흘려보내 정보 흐름을 코드로 박습니다. 둘째, planning=True — 켜는 순간 CrewPlanner가 실행 전에 Task들의 의존성을 분석해 전체 실행 계획을 미리 생성합니다. 실행 방식은 둘 중 하나를 고릅니다.
정해진 순서대로, 이전 완료 후 다음 시작
manager_llm이 적절한 Agent에게 배분
Process.hierarchical에 manager_llm을 주면 매니저 에이전트가 전체를 조율하며 하위 Agent에게 일을 나눠 줍니다(7편 멀티 에이전트의 계층 구조와 직결됩니다). 학습 곡선이 가장 낮고 역할 기반 분업이 네이티브라, “사람 팀이 일하듯” 협업 시뮬레이션을 빠르게 만들 때 제격입니다. 대신 LangGraph만큼 정교한 조건부 분기·재계획 제어는 제한적입니다.
7. 구현 ③ Google ADK — Sequential·Parallel·Loop Agent
Google ADK는 워크플로우 에이전트를 조립식 블록으로 제공합니다. 개별 LlmAgent를 만든 뒤 SequentialAgent·ParallelAgent·LoopAgent로 감싸 순차·병렬·반복을 표현하죠. 상태 전달의 핵심은 output_key 단 하나입니다.
진짜 일은 output_key가 합니다. Agent 결과가 세션 상태에 자동 저장되고, 다음 Agent의 instruction에서 {변수}로 쓰면 알아서 치환됩니다 — 상태를 손으로 넘기는 코드가 사라지죠. 나머지 두 블록도 직관적입니다.
ParallelAgent는 기술·비즈니스·리스크 분석을 동시에 돌려 시간을 줄이고, LoopAgent는 max_iterations 한도 안에서 품질 기준이 충족될 때까지 같은 단계를 반복합니다(4편 리플렉션의 LoopAgent와 같은 부품). 세 블록은 서로 중첩할 수 있어 — Sequential 안에 Parallel을, 그 안에 Loop를 — 복잡한 오케스트레이션을 레고처럼 쌓습니다. Gemini 네이티브 통합과 표준화된 워크플로우 블록이 ADK의 매력입니다.
8. 세 프레임워크 — 같은 계획, 다른 철학
셋 다 “목표를 단계로 쪼개 실행한다”는 본질은 같습니다. 다른 건 무엇을 일급 시민으로 보느냐입니다 — LangGraph는 그래프(상태·흐름), CrewAI는 에이전트(역할), ADK는 워크플로우 블록이 주인공입니다.
| 특성 | LangGraph | CrewAI | Google ADK |
|---|---|---|---|
| 상태 관리 | TypedDict + 리듀서 | Task Context | output_key 자동 |
| 계획 생성 | Planner 노드 | planning=True 자동 | LlmAgent 수동 |
| 병렬 실행 | 수동 구현 | 제한적 | ParallelAgent |
| 반복 실행 | 조건부 엣지 | 제한적 | LoopAgent |
| 재계획 지원 | Replanner 노드 | 제한적 | 수동 구현 |
| 역할 기반 분업 | 수동 구현 | 네이티브 지원 | 수동 구현 |
| 학습 곡선 | 중간 | 낮음 | 낮음 |
| 유연성 | 매우 높음 | 중간 | 높음 |
| 추천 환경 | 복잡한 워크플로우 | 팀 협업 시뮬레이션 | 표준 오케스트레이션 |
고르는 법은 간단합니다. 복잡한 조건부 로직·세밀한 재계획이 필요하면 LangGraph, 역할을 나눈 팀 협업을 빠르게 시뮬레이션하려면 CrewAI, 순차·병렬·반복을 표준 블록으로 쌓고 Gemini를 쓰면 Google ADK. 그리고 “웹을 뒤져 보고서를 쓰는” 딥 리서치라면 별도의 길이 있습니다 — 바로 다음 장입니다.
9. Deep Research — 플래닝의 킬러 앱
플래닝이 가장 화려하게 빛나는 실제 제품이 Deep Research입니다(Google Gemini DeepResearch, OpenAI Deep Research API). 사용자가 “유럽 VC 투자 현황과 성장 국가를 분석해줘” 한 줄을 던지면, 에이전트가 연구 계획을 먼저 세우고 수백 개 소스를 오가며 검색-분석을 반복해 인용이 달린 보고서를 내놓습니다. Plan-and-Execute에 리플렉션(지식 갭 식별)이 결합된 형태죠.
OpenAI는 이걸 API로 열어 두어 코드로 호출할 수 있습니다. 모델에 web_search_preview 도구를 주면, 모델이 알아서 검색 쿼리를 만들고 추론하며 인용 보고서를 작성합니다.
MCP로 사내 데이터 소스까지 붙이면, 공개 웹을 넘어 우리 회사 지식으로 리서치하는 에이전트가 됩니다.10. 엔터프라이즈 적용 — CRM · ERP · Groupware
기업 업무의 대부분은 여러 시스템을 넘나드는 다단계 절차입니다 — 정확히 플래닝이 노리는 지점이죠. 고정 규칙으로 박아 둔 RPA를 목표 기반 플래닝 에이전트로 바꾸면, 효과는 숫자로 분명해집니다.
기술적으로는 레거시를 그대로 두고 위에 얹는 계층 구조가 정석입니다. 모든 요청은 API Gateway(인증·라우팅·속도 제한·로깅)를 지나, Orchestration(요청 파싱 → 계획 생성 → 실행 관리)이 지휘하고, Domain Agent(CRM/ERP/GW)가 Integration Adapter(Salesforce·SAP·MS365·Legacy)를 통해 실제 시스템을 두드립니다. 상태·이력·감사 로그는 Data & State Layer가 보관하죠.
11. 케이스 스터디 — Cross-Domain 온보딩과 안전장치
하나의 목표가 세 시스템에 걸치는 실제 시나리오를 봅시다. “신규 VIP 고객을 온보딩하라” — 플래너는 이 한 줄을 CRM·ERP·Groupware를 가로지르는 통합 계획으로 펼칩니다.
안전장치 ① Human-in-the-Loop — 어디까지 자동인가
자율성이 높을수록 고삐가 중요합니다. 무엇을 자동으로 하고, 무엇을 사람이 승인하고, 언제 사람을 부를지(에스컬레이션)를 임계값으로 못 박습니다.
계획 초안 생성
저위험·되돌릴 수 있는 작업
고객 데이터 수정/삭제
외부 시스템 데이터 변경
영향 범위 > 100 고객/거래
재계획 3회 이상 발생
안전장치 ② 실패는 어떻게 되돌리나 — 5단계 롤백
다단계 작업은 3번 단계에서 터지면 1~2번을 어떻게 되돌릴지가 관건입니다. 각 단계마다 Savepoint를 찍어 두고, 실패 시 점진적으로 대응합니다.
도입은 한 번에 하지 않는다 — 3단계 로드맵
→ 처리 -50% · 만족도 4.0/5.0 · 가용성 99.5%
→ 프로세스 10개+ · 월 $50K+ 절감 · 생산성 +30%
→ 계획 품질 모니터링 · 선제적 실행
12. 베스트 프랙티스 & 트레이드오프
플래닝을 쓸지 말지 — 의사결정
- 복잡한 다단계·의존성 있는 작업
- 동적 환경(실행 중 새 정보 발생)
- 연구/분석(Deep Research·경쟁사 분석)
- 비즈니스 프로세스 자동화(온보딩·주문)
- 목표는 명확하나 방법이 불명확할 때
- 단순 Q&A (오버헤드가 가치보다 큼)
- 고정 워크플로우가 이미 정의된 경우
- 실시간 응답이 필수인 경우
- 비용에 매우 민감한 대용량 처리
트레이드오프 — 자율성엔 대가가 따른다
플래닝은 복잡한 목표를 풀어 주는 대신 계획 생성 오버헤드(지연), 다단계 LLM 호출 비용, 계획 품질 변동(할루시네이션), 무한 루프 위험, 다단계 추적의 디버깅 복잡성을 떠안깁니다. 그래서 “계획할 수 있다”가 아니라 “이 작업에 계획이 정말 필요한가”를 먼저 물어야 합니다. 무한 루프는 max_iterations와 명확한 종료 조건으로, 품질 변동은 리플렉션(Critic)으로 막는 게 정석입니다.
다른 패턴과의 조합
플래닝은 단독으로 쓰이기보다 다섯 패턴의 지휘자로 작동할 때 가장 강합니다. 계획을 세우고, 각 단계에서 도구를 부르고, 독립 단계는 병렬로, 결과는 리플렉션으로 검증하죠.
| 조합 | 활용 |
|---|---|
| Planning + 라우팅(2편) | 라우터가 복잡한 작업만 Planning Agent로 전달 |
| Planning + 병렬화(3편) | 독립 단계를 병렬 실행(LLMCompiler 아키텍처) |
| Planning + 리플렉션(4편) | Critic이 계획 품질을 검증 후 개선 |
| Planning + 도구 사용(5편) | 각 단계에서 적절한 도구 호출 |
| Planning + 멀티 에이전트(7편) | 각 단계를 전문 Agent가 담당(Hierarchical) |
체크리스트
- ✅ 각 단계는 독립 실행·검증 가능하게 · 단계 간 의존성과 완료 기준을 명확히
- ✅ 재계획 판정을 키워드로 —
ACTION: complete/continue+max_iterations로 무한 루프 차단 - ✅ 실행 이력(past_steps) 축적 +
output_key명명 일관성 · 컨텍스트 압박 시 요약 - ✅ 에러 처리 — 단계 실패 시 대안 경로 + 롤백 전략(Saga) + 에스컬레이션
- ✅ Human-in-the-Loop — 신뢰도 < 70%·금액 임계값 초과 시 사람 승인
체이닝(1편)이 “순서대로 쪼개기”, 라우팅(2편)이 “입력에 따라 길 나누기”, 병렬화(3편)가 “독립 작업 동시에”, 리플렉션(4편)이 “쓴 다음 읽고 고치기”, 도구 사용(5편)이 “못 하면 도구를 써라”였다면, 플래닝은 “목표만 주면 길은 내가 그린다”입니다. 여기서 에이전트는 비로소 반응형을 넘어 목표 지향적으로 행동하죠. 핵심은 셋 — 목표를 검증 가능한 단계로 분해하고, 실패를 재계획의 신호로 삼으며(에이전트는 실패하지 않고 적응한다), 자율성이 커진 만큼 Human-in-the-Loop(HITL)과 롤백을 처음부터 설계하는 것. 그리고 플래닝의 진짜 위력은 다른 패턴을 지휘할 때 나옵니다 — 계획의 각 단계에서 도구를 부르고, 독립 단계는 병렬로, 결과는 리플렉션으로 검증합니다. 다음 7편에서는 한 발 더 나아가, 계획의 각 단계를 서로 다른 전문 에이전트들이 나눠 맡는 멀티 에이전트 협업(Multi-Agent Collaboration)을 다룹니다 — 플래너가 그린 청사진을, 한 팀이 함께 짓는 이야기입니다.
'Agentic AI Design Patterns' 카테고리의 다른 글
| CH08-기억하는 AI — 메모리 관리(Memory Management) 완벽 정리 (0) | 2026.06.05 |
|---|---|
| CH07-혼자보다 팀 — 멀티 에이전트 협업(Multi-Agent Collaboration) 완벽 정리 (0) | 2026.06.04 |
| CH05-AI 에이전트 도구 사용 입문 | @tool·ReAct·FunctionTool로 외부 API·DB 연동하기 (0) | 2026.06.03 |
| CH04-스스로 고쳐 쓰는 AI — 리플렉션(Reflection) 패턴 완벽 정리 (0) | 2026.06.02 |
| CH03-AI 에이전트 병렬화 입문 | RunnableParallel·LangGraph·ParallelAgent·asyncio로 동시 실행 구현하기 (0) | 2026.06.01 |