저는 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