6장 — 계획 수립

지능적으로 행동하려면 눈앞의 입력에 즉각 반응하는 것만으로는 부족한 경우가 많습니다. 원하는 결과에 도달하려면 앞을 내다보고, 복잡한 작업을 더 작고 관리하기 쉬운 단계로 나누며, 목표를 달성할 전략을 세워야 합니다. 계획 수립의 핵심은 에이전트 또는 여러 에이전트로 이루어진 시스템이 초기 상태에서 목표 상태로 나아가기 위한 일련의 행동 순서를 설계하는 능력입니다.

패턴 개요

AI 맥락에서 계획 수립 에이전트는 복잡한 목표를 위임받는 전문가에 비유하면 이해하기 쉽습니다.

“팀 워크숍을 준비해 달라”고 요청할 때, 사용자가 정의하는 것은 목표와 제약 조건, 즉 ‘무엇을’이지 ‘어떻게’가 아닙니다. 에이전트의 핵심 과제는 목표에 이르는 경로를 자율적으로 설계하는 것입니다. 에이전트는 먼저 초기 상태(예: 예산, 참가 인원, 원하는 일정)와 목표 상태(워크숍 예약 완료)를 파악한 뒤, 이 둘을 연결하는 최적의 동작 순서를 도출해야 합니다. 계획은 미리 정해져 있는 것이 아니라 요청에 응해 만들어집니다.

이 과정에서 두드러진 특징은 적응력입니다. 초기 계획은 출발점일 뿐 고정된 대본이 아닙니다. 에이전트의 진정한 능력은 새로운 정보를 반영하고 장애물을 우회하여 프로젝트를 이끌어 가는 데 있습니다.

예컨대 선호하던 장소를 더 이상 갈 수 없게 되거나 선택한 케이터링 업체의 일정이 꽉 찬 경우, 유능한 에이전트는 그냥 실패로 끝내지 않습니다. 적응합니다. 새로운 제약 조건을 반영하고, 선택지를 재평가한 뒤, 대안 장소나 일정을 제안하는 식으로 새로운 계획을 세웁니다.

유연성과 예측 가능성은 상충한다

이 장에서 가장 중요한 대목입니다. 책은 계획 수립을 권하면서 동시에 이 패턴을 쓰지 말아야 할 때를 분명히 짚습니다.

그러나 유연성과 예측 가능성이 상충한다는 점은 분명히 인식해야 한다. 동적 계획 수립은 특정 상황에 쓰는 도구이지, 모든 문제에 통하는 보편 해법은 아니다.

문제의 해법이 이미 잘 알려져 있고 반복 가능하다면, 에이전트를 미리 정해진 고정 워크플로에 맞추어 움직이게 하는 편이 더 효과적입니다. 이렇게 하면 에이전트의 자율성을 제한해 불확실성과 예측 불가능한 행동의 위험을 줄이고, 신뢰할 수 있고 일관된 결과를 보장할 수 있습니다.

따라서 계획 수립 에이전트를 쓸지, 단순한 작업 실행 에이전트를 쓸지는 결국 한 가지 질문에 달려 있습니다.

‘어떻게’를 새로 찾아내야 하는가, 아니면 이미 알고 있는가?

앞선 장들의 패턴(체이닝, 라우팅, 병렬화)이 대체로 개발자가 미리 짜 두는 구조인 반면, 계획 수립은 그 구조 자체를 에이전트가 런타임에 만들어 내게 하는 패턴입니다. 그만큼 강력하지만 그만큼 예측하기 어렵습니다.

실전 적용과 활용 사례

계획 수립 패턴은 자율 시스템의 핵심 연산 과정으로, 특히 상황이 유동적으로 바뀌거나 복잡한 환경에서 에이전트가 특정 목표를 달성하기 위한 동작 순서를 구성할 수 있게 합니다. 이 과정은 상위 수준의 목표를 개별적으로 실행 가능한 단계로 이루어진 구조화된 계획으로 변환합니다.

영역 계획 수립이 하는 일
절차적 작업 자동화 신규 직원 온보딩 같은 업무 프로세스를 시스템 계정 생성, 교육 과정 배정, 여러 부서와의 조율 등 선후관계가 있는 하위 작업으로 분해한다. 에이전트는 이 단계를 논리적 순서로 실행할 계획을 세우고, 필요한 도구를 호출하거나 여러 시스템과 상호작용해 의존 관계를 관리한다
로보틱스와 자율 주행 상태 공간 탐색(state-space traversal) 의 근간이 된다. 물리적 로봇이든 가상 개체이든, 시스템은 초기 상태에서 목표 상태로 전이하기 위한 경로나 동작 순서를 생성해야 한다. 이 과정에서 시간이나 에너지 소비 같은 지표를 최적화하는 동시에, 장애물 회피나 교통 규칙 준수 같은 환경 제약 조건도 충족해야 한다
구조화된 정보 종합 리서치 보고서 같은 복잡한 산출물을 만들어야 할 때, 에이전트는 정보 수집 → 데이터 요약 → 내용 구조화 → 반복적 개선이라는 별개 단계로 이루어진 계획을 수립할 수 있다
다단계 고객 지원 진단부터 솔루션 적용, 상위 지원팀 이관까지 이어지는 체계적인 계획을 수립하고 이를 따를 수 있다

요컨대 계획 수립 패턴은 에이전트가 단순히 반응하는 수준을 넘어 목표 지향적으로 행동할 수 있게 합니다. 서로 의존하는 일련의 작업을 일관되게 수행해야 하는 문제를 해결하는 데 필요한 논리적 틀을 제공합니다.

실습 코드 (CrewAI)

에이전트가 먼저 복잡한 질의를 해결하기 위한 다단계 계획을 수립한 뒤, 그 계획을 순차적으로 실행하는 구조입니다.

import os
from dotenv import load_dotenv
from crewai import Agent, Task, Crew, Process
from langchain_openai import ChatOpenAI

# 보안을 위해 .env 파일에서 환경 변수를 로드
load_dotenv()

# 1. 언어 모델을 정의
llm = ChatOpenAI(model="gpt-4-turbo")

# 2. 목적이 명확한 에이전트 정의
planner_writer_agent = Agent(
    role='Article Planner and Writer',
    goal='Plan and then write a concise, engaging summary on a specified topic.',
    backstory=(
        'You are an expert technical writer and content strategist. '
        'Your strength lies in creating a clear, actionable plan before writing, '
        'ensuring the final summary is both informative and easy to digest.'
    ),
    verbose=True,
    allow_delegation=False,
    llm=llm  # 에이전트에 특정 LLM을 할당
)

# 3. 더 구조화되고 구체적인 기대 출력을 갖춘 작업 정의
topic = "The importance of Reinforcement Learning in AI"
high_level_task = Task(
    description=(
        f"1. Create a bullet-point plan for a summary on the topic: '{topic}'.\n"
        f"2. Write the summary based on your plan, keeping it around 200 words."
    ),
    expected_output=(
        "A final report containing two distinct sections:\n\n"
        "### Plan\n"
        "- A bulleted list outlining the main points of the summary.\n\n"
        "### Summary\n"
        "- A concise and well-structured summary of the topic."
    ),
    agent=planner_writer_agent,
)

# 명확한 프로세스로 Crew를 생성
crew = Crew(
    agents=[planner_writer_agent],
    tasks=[high_level_task],
    process=Process.sequential,
)

# 작업 실행
print("## Running the planning and writing task ##")
result = crew.kickoff()
print("\n\n---\n## Task Result ##\n---")
print(result)

읽는 포인트

  • 계획 수립을 태스크 설명에 명시적으로 요구합니다. "1. Create a bullet-point plan... 2. Write the summary based on your plan" 처럼, 계획을 먼저 세우고 그 계획을 따라 쓰라고 지시합니다. 핵심 정리에도 나오듯 “계획 수립 단계를 요구하도록 명시적으로 프롬프팅하거나 작업을 설계하면, 에이전트 프레임워크에서 이러한 행동을 유도할 수 있습니다.”
  • expected_output 이 계획과 요약을 별도 섹션으로 강제합니다. ### Plan### Summary 두 절을 요구해 계획이 실제로 산출물에 드러나게 합니다. 계획이 내부에서만 돌고 사라지지 않도록 하는 장치입니다.
  • 에이전트의 배경 설정(backstory)이 “쓰기 전에 명확하고 실행 가능한 계획을 세우는 것이 당신의 강점” 이라고 못 박습니다. 역할·목표·배경 세 층 모두에서 계획 우선을 반복합니다.

구글 딥리서치

구글 제미나이 딥리서치는 자율적으로 정보를 검색하고 종합하도록 설계된 에이전트 기반 시스템입니다. 구글 검색을 동적이고 반복적으로 질의하는 다단계 에이전틱 파이프라인을 통해 복잡한 주제를 체계적으로 탐색합니다. 대규모 웹 기반 소스를 처리하고, 수집된 데이터가 얼마나 주제와 관련 있는지, 부족한 지식은 없는지 평가한 뒤, 후속 검색으로 이를 보완하도록 설계되어 있습니다.

이 시스템의 동작은 단일 질의-응답 이벤트가 아니라 관리·통제하면서 장기간 실행되는 프로세스입니다.

사용자 프롬프트
    ↓
[1] 여러 항목으로 된 연구 계획으로 분해
    ↓
[2] 사용자에게 계획을 제시 → 검토·수정  ← "Edit plan" / "Start research"
    ↓
[3] 반복적인 검색-분석 순환
      · 수집한 정보를 바탕으로 질의를 동적으로 구성하고 다듬음
      · 지식 격차를 적극적으로 파악
      · 정보를 교차 검증하고 불일치를 해소
    ↓
[4] 종합 — 비판적 평가 → 논리적 섹션 분할 → 일관된 서사
    ↓
구조화된 여러 페이지 분량의 보고서 (인용 목록 포함)

그림 6.1~6.3 — 계획 생성 → 구글 검색 도구 실행 → 최종 보고서

2단계에서 계획을 사용자에게 먼저 보여 주고 승인을 받는 것이 이 시스템의 특징입니다. 계획을 실행하기 전에 연구 방향을 사용자와 함께 조율할 수 있습니다.

아키텍처의 핵심 구성 요소 가운데 하나는 이 과정을 비동기적으로 관리하는 능력입니다. 이 설계 덕분에 수백 개의 소스를 분석해야 할 수도 있는 조사 과정이 단일 실패 지점에 흔들리지 않으며, 사용자는 작업 중간에 떠났다가 완료 시 알림을 받을 수 있습니다. 또한 사용자가 제공한 문서를 통합하여 비공개 소스의 정보와 웹 기반 리서치 결과를 결합할 수도 있습니다.

최종 산출물은 단순히 발견 사항을 이어 붙인 목록이 아니라 구조화된 여러 페이지 분량의 보고서입니다. 종합 단계에서 모델은 수집된 정보를 비판적으로 평가하고, 주요 주제를 식별하며, 내용을 논리적 섹션으로 나누어 일관된 서사로 정리합니다. 보고서에는 오디오 개요, 차트, 원본 인용 소스 링크 등이 포함되는 경우가 많습니다.

왜 효율적인가

이 접근 방식이 효율적인 이유는 수동 리서치의 핵심 병목인 반복적 검색-필터링 사이클을 자동화하기 때문입니다. 또한 비슷한 시간 안에 인간 연구자가 처리할 수 있는 범위를 넘어, 더 많은 양과 더 다양한 유형의 정보 소스를 처리할 수 있어 포괄성도 확보됩니다.

이렇게 분석 범위가 넓어지면 선택 편향을 줄이고, 눈에 잘 띄지 않지만 잠재적으로 중요한 정보를 발견할 가능성도 높아져, 주제를 더 견고하고 근거 있게 이해할 수 있습니다.

경쟁사 분석(시장 트렌드·제품 사양·여론·마케팅 전략을 여러 온라인 소스에서 수집·대조)이나 학술 탐색(기초 논문 식별·요약, 개념의 발전 과정 추적, 신규 연구 동향 파악)처럼 여러 영역에 걸친 복잡하고 다면적인 연구 작업에서 가치가 두드러집니다.

오픈AI 딥리서치 API

오픈AI 딥리서치 API는 복잡한 연구 작업을 자동화하도록 설계된 특화 도구입니다. 단순한 질의응답 모델과 달리, 상위 수준의 질의를 받아 자율적으로 하위 질문으로 분해하고, 내장 도구를 사용해 웹 검색을 수행하며, 구조화되고 인용이 풍부한 최종 보고서를 제공합니다.

집필 시점 기준으로 고품질 생성에는 o3-deep-research-2025-06-26, 지연 시간에 민감한 애플리케이션에는 더 빠른 o4-mini-deep-research-2025-06-26 같은 모델을 사용합니다.

주요 이점

이점 설명
구조화된 출력과 인용 소스 메타데이터에 연결되는 인라인 인용이 포함된, 잘 정리된 보고서를 생성한다. 각 주장을 검증할 수 있고 데이터에 근거한 형태로 제시한다
투명성 ChatGPT처럼 과정이 추상화되어 드러나지 않는 방식과 달리, 이 API는 에이전트의 추론·실행한 웹 검색 질의·실행한 코드까지 포함해 모든 중간 단계를 노출한다. 덕분에 상세한 디버깅과 분석이 가능하고, 최종 답변이 어떻게 구성되었는지 더 깊이 이해할 수 있다
확장성 모델 컨텍스트 프로토콜(MCP, 10장 참고)을 지원하므로, 개발자는 에이전트를 비공개 지식 베이스나 내부 데이터 소스에 연결해 공개 웹 조사 결과와 독점적인 정보를 결합할 수 있다

이 API를 사용하려면 client.responses.create 엔드포인트로 요청을 보내고, 사용할 모델·입력 프롬프트·에이전트가 사용할 도구를 지정하면 됩니다. web_search_preview 도구는 반드시 포함해야 하며, 선택적으로 code_interpreter 나 내부 데이터용 커스텀 MCP 도구를 추가할 수 있습니다.

from openai import OpenAI

# API 키로 클라이언트를 초기화
client = OpenAI(api_key="YOUR_OPENAI_API_KEY")

# 에이전트의 역할과 사용자의 리서치 질문을 정의
system_message = """You are a professional researcher preparing a structured, data-driven report.
Focus on data-rich insights, use reliable sources, and include inline citations."""

user_query = "Research the economic impact of semaglutide on global healthcare systems."

# 딥리서치 API 호출 생성
response = client.responses.create(
    model="o3-deep-research-2025-06-26",
    input=[
        {
            "role": "developer",
            "content": [{"type": "input_text", "text": system_message}]
        },
        {
            "role": "user",
            "content": [{"type": "input_text", "text": user_query}]
        }
    ],
    reasoning={"summary": "auto"},
    tools=[{"type": "web_search_preview"}]
)

# 응답에서 최종 보고서를 추출하여 출력
final_report = response.output[-1].content[0].text
print(final_report)

# --- 인라인 인용 및 메타데이터 접근 ---
print("--- CITATIONS ---")
annotations = response.output[-1].content[0].annotations
if not annotations:
    print("No annotations found in the report.")
else:
    for i, citation in enumerate(annotations):
        # 인용이 참조하는 텍스트 범위
        cited_text = final_report[citation.start_index:citation.end_index]
        print(f"Citation {i+1}:")
        print(f"  Cited Text: {cited_text}")
        print(f"  Title: {citation.title}")
        print(f"  URL: {citation.url}")
        print(f"  Location: chars {citation.start_index}-{citation.end_index}")
    print("\n" + "=" * 50 + "\n")

# --- 중간 단계 검사 ---
print("--- INTERMEDIATE STEPS ---")

# 1. 추론 단계: 모델이 내부에서 생성한 계획과 요약
try:
    reasoning_step = next(item for item in response.output if item.type == "reasoning")
    print("\n[Found a Reasoning Step]")
    for summary_part in reasoning_step.summary:
        print(f"  - {summary_part.text}")
except StopIteration:
    print("\nNo reasoning steps found.")

# 2. 웹 검색 호출: 에이전트가 실행한 검색 질의
try:
    search_step = next(item for item in response.output if item.type == "web_search_call")
    print("\n[Found a Web Search Call]")
    print(f"  Query Executed: '{search_step.action['query']}'")
    print(f"  Status: {search_step.status}")
except StopIteration:
    print("\nNo web search steps found.")

# 3. 코드 실행: 에이전트가 코드 인터프리터를 사용해 실행한 코드
try:
    code_step = next(item for item in response.output if item.type == "code_interpreter_call")
    print("\n[Found a Code Execution Step]")
    print("  Code Input:")
    print(f"  ```python\n{code_step.input}\n  ```")
    print("  Code Output:")
    print(f"  {code_step.output}")
except StopIteration:
    print("\nNo code execution steps found.")

코드의 후반부가 투명성이라는 이점을 그대로 구현합니다. 최종 보고서만 꺼내는 것이 아니라, annotations 로 인용(인용된 문장·제목·URL·보고서 내 위치)을 읽고, response.output 을 뒤져 추론 단계·웹 검색 호출·코드 실행 단계를 각각 꺼내 봅니다. 모델이 어떤 계획을 세우고 어떤 질의를 실행했는지 사후에 검증할 수 있습니다.

정리

계획 수립 패턴이란 무엇인가?

복잡한 문제는 한 번의 작업만으로 해결되지 않는 경우가 많고, 원하는 결과에 도달하려면 앞을 내다보는 능력이 필요합니다. 구조화된 접근이 없으면 에이전틱 시스템은 여러 단계와 의존 관계가 얽힌 다면적 요청을 처리하기 어렵습니다. 상위 수준의 목표를 더 작고 실행 가능한 작업 순서로 체계적으로 분해하기 어려워지는 것입니다. 결과적으로 복잡한 목표에 직면했을 때 시스템이 효과적으로 전략을 수립하지 못해 불완전하거나 부정확한 결과로 이어집니다.

왜 사용하는가?

계획 수립 패턴은 에이전틱 시스템이 목표를 달성하기 위한 일관된 계획을 먼저 수립하도록 함으로써 표준화된 해법을 제공합니다. 상위 수준의 목표를 더 작고 실행 가능한 단계 또는 하위 목표 순서로 분해하는 것이 핵심입니다. 이를 통해 시스템은 복잡한 워크플로를 관리하고, 다양한 도구를 오케스트레이션하며, 의존 관계를 논리적 순서로 처리할 수 있습니다.

대규모 언어 모델은 이러한 역할에 특히 잘 맞는데, 방대한 학습 데이터를 바탕으로 개연성 있고 효과적인 계획을 생성할 수 있기 때문입니다. 이러한 구조화된 접근은 단순한 반응형 에이전트를, 복잡한 목표를 향해 주도적으로 작업하고 필요하면 계획을 조정할 수도 있는 전략적 실행자로 변모시킵니다.

언제 사용해야 하는가?

사용자의 요청이 단일 조치나 도구로 처리하기에 너무 복잡할 때 이 패턴을 사용합니다. 상세한 조사 보고서 생성, 신규 직원 온보딩, 경쟁사 분석 실행 등 다단계 프로세스를 자동화하는 데 적합합니다. 최종적으로 종합된 결과에 도달하려면 서로 의존하는 일련의 작업이 필요한 과제에 계획 수립 패턴을 적용합니다.

계획 수립 패턴 개요도

                                        ┌──────────────┐
                                        │   계획 1     │
  사용자 ──► 프롬프트 ──► 에이전트 ⇄───►│   계획 2     │
     ▲                        │         │   계획 4     │
     │                        ▼         │   계획 …     │
     └──────────────────── 출력         └──────────────┘

그림 6.4 — 계획 수립 디자인 패턴

핵심 정리

  • 계획 수립은 에이전트가 복잡한 목표를 실행 가능한 순차적 단계로 분해하도록 합니다.
  • 다단계 작업 처리, 워크플로 자동화, 복잡한 환경 탐색에 필수적입니다.
  • 대규모 언어 모델은 작업 설명을 바탕으로 단계별 접근 방식을 생성하여 계획 수립을 수행할 수 있습니다.
  • 계획 수립 단계를 요구하도록 명시적으로 프롬프팅하거나 작업을 설계하면, 에이전트 프레임워크에서 이러한 행동을 유도할 수 있습니다.
  • 구글 딥리서치는 구글 검색을 도구로 활용하여 확보한 소스를 대신 분석하는 에이전트입니다. 리플렉션을 수행하고, 계획을 수립하며, 실행합니다.

결론

계획 수립 패턴은 에이전틱 시스템을 단순한 반응형 시스템에서 전략적이고 목표 지향적인 실행 주체로 끌어올리는 기반이 되는 구성 요소입니다. 현대의 대규모 언어 모델은 상위 수준의 목표를 일관되고 실행 가능한 단계로 자율적으로 분해할 수 있으며, 바로 이 능력이 계획 수립 패턴의 핵심을 이룹니다.

이 패턴은 CrewAI 에이전트가 문서 작성 계획을 수립하고 이를 따르는 사례에서 보여 준 것처럼 비교적 단순한 순차 작업 실행부터, 더 복잡하고 동적인 시스템까지 확장됩니다. 구글 딥리서치 에이전트는 이러한 고도화된 적용을 잘 보여 주는데, 지속적으로 정보를 수집하면서 적응하고 발전하는 반복적 조사 계획을 수립합니다.

궁극적으로 계획 수립은 복잡한 문제를 다룰 때 인간의 의도와 자동화된 실행을 이어 주는 핵심 연결고리입니다. 문제 해결 방식을 구조화함으로써 이 패턴은 에이전트가 복잡한 워크플로를 관리하고 포괄적으로 취합한 결과를 도출하게 합니다.

참고 문헌