저는 3년간 AI Agent 시스템을 프로덕션 환경에서 운영하며 두 가지 핵심 계획 아키텍처의 장단점을 체감해왔습니다. 오늘은 ReAct와 Plan-and-Execute의 내부 동작 원리부터 실제 벤치마크 데이터, 그리고 HolySheep AI 게이트웨이 기반 비용 최적화 전략까지 완전 공개합니다.

ReAct vs Plan-and-Execute: 핵심 개념 이해

ReAct (Reason + Act) 아키텍처

ReAct는 추론(Reasoning)과 실행(Action)을 단일 루프 내에서 번갈아 수행하는 접근법입니다. 각 단계에서 모델이 현재 상황을 판단하고, 바로 행동을 취한 후 결과를 다시 관찰합니다.

# HolySheep AI 기반 ReAct Agent 구현
import httpx
import json
from typing import List, Dict, Any

HOLYSHEEP_API_KEY = "YOUR_HOLYSHEEP_API_KEY"
HOLYSHEEP_BASE_URL = "https://api.holysheep.ai/v1"

class ReActAgent:
    def __init__(self, model: str = "gpt-4.1"):
        self.model = model
        self.max_iterations = 10
        self.conversation_history = []
    
    def think(self, system_prompt: str, user_query: str) -> Dict[str, Any]:
        """HolySheep AI를 통한 추론 단계"""
        messages = [
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_query}
        ]
        
        response = httpx.post(
            f"{HOLYSHEEP_BASE_URL}/chat/completions",
            headers={
                "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.model,
                "messages": messages,
                "temperature": 0.3,
                "max_tokens": 2000
            },
            timeout=30.0
        )
        return response.json()
    
    def execute_loop(self, task: str, tools: List[callable]) -> str:
        """ReAct 실행 루프: 추론 → 행동 → 관찰"""
        iteration = 0
        current_state = {"task": task, "observations": [], "actions": []}
        
        while iteration < self.max_iterations:
            # 1단계: 현재 상태 기반 추론
            reasoning_prompt = f"""
현재 상태: {current_state}
Task: {task}

다음 중 하나만 선택하여 응답하세요:
1. FINAL_ANSWER: [최종 답변]
2. ACTION: [액션 이름] | PARAM: [파라미터] | REASONING: [이유]
"""
            
            result = self.think(
                "당신은 ReAct 에이전트입니다. 추론 후 즉시 행동하세요.",
                reasoning_prompt
            )
            
            response_text = result["choices"][0]["message"]["content"]
            
            # 2단계: 응답 파싱 및 행동 실행
            if "FINAL_ANSWER" in response_text:
                return response_text.split("FINAL_ANSWER:")[1].strip()
            
            if "ACTION:" in response_text:
                parts = response_text.split("ACTION:")[1].split("|")
                action_name = parts[0].strip()
                params = parts[1].replace("PARAM:", "").strip()
                
                # 도구 실행 (시뮬레이션)
                observation = f"Executed {action_name} with {params}"
                current_state["observations"].append(observation)
                current_state["actions"].append(action_name)
            
            iteration += 1
        
        return f"Max iterations ({self.max_iterations}) reached"

사용 예시

agent = ReActAgent(model="gpt-4.1") result = agent.execute_loop( task="사용자님의 월별 지출 보고서를 생성해주세요", tools=[] ) print(result)

Plan-and-Execute 아키텍처

Plan-and-Execute는 먼저 전체 작업의 계획(Plan)을 수립한 후, 순차적으로 실행(Execute)하는两步 접근법입니다. 복잡한 다단계 작업에서 더 나은 일관성과 비용 효율성을 제공합니다.

# HolySheep AI 기반 Plan-and-Execute Agent 구현
import httpx
import asyncio
from typing import List, Dict, Any
from dataclasses import dataclass
from enum import Enum

@dataclass
class PlanStep:
    step_id: int
    action: str
    params: Dict[str, Any]
    dependencies: List[int]
    status: str = "pending"

class PlanAndExecuteAgent:
    def __init__(self, planner_model: str = "gpt-4.1", 
                 executor_model: str = "gpt-4.1"):
        self.planner_model = planner_model
        self.executor_model = executor_model
        self.plans: List[PlanStep] = []
    
    async def plan(self, task: str) -> List[PlanStep]:
        """1단계: 전체 작업 플래닝 (1회 LLM 호출)"""
        planning_prompt = f"""
Task: {task}

이 작업을 완료하기 위한 세부 단계별 계획을 JSON 배열로 작성하세요.
각 단계는 다음 필드를 포함해야 합니다:
- step_id: 단계 번호 (0부터 시작)
- action: 실행할 액션 이름
- params: 액션 파라미터
- dependencies: 선행 단계 ID 배열

응답은 유효한 JSON 배열만 반환하세요.
"""
        
        response = httpx.post(
            f"{HOLYSHEEP_BASE_URL}/chat/completions",
            headers={
                "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.planner_model,
                "messages": [{"role": "user", "content": planning_prompt}],
                "temperature": 0.2,
                "max_tokens": 1500
            },
            timeout=30.0
        )
        
        plan_text = response.json()["choices"][0]["message"]["content"]
        plan_data = json.loads(plan_text)
        
        self.plans = [
            PlanStep(
                step_id=p["step_id"],
                action=p["action"],
                params=p["params"],
                dependencies=p.get("dependencies", [])
            ) 
            for p in plan_data
        ]
        return self.plans
    
    async def execute_step(self, step: PlanStep, 
                          context: Dict[str, Any]) -> Dict[str, Any]:
        """단일 단계 실행 (병렬화 가능)"""
        execution_prompt = f"""
Plan Step {step.step_id}: {step.action}
Parameters: {step.params}
Context: {context}

이 단계를 실행하고 결과를 JSON으로 반환하세요:
{{"status": "success|failed", "result": "...", "next_context": {{}}}}
"""
        
        response = httpx.post(
            f"{HOLYSHEEP_BASE_URL}/chat/completions",
            headers={
                "Authorization": f"Bearer {HOLYSHEEP_API_KEY}",
                "Content-Type": "application/json"
            },
            json={
                "model": self.executor_model,
                "messages": [{"role": "user", "content": execution_prompt}],
                "temperature": 0.1,
                "max_tokens": 800