개요

AI 에이전트가 단순한 프롬프트 응답을 넘어 복잡한 작업을 자율적으로 수행하려면, 검증된 디자인 패턴이 필요합니다. ReAct, Tool Use, Multi-Agent 등의 패턴은 에이전트의 추론 능력과 실행 능력을 체계적으로 결합합니다.

이 글에서는 실무에서 가장 많이 사용되는 AI 에이전트 디자인 패턴을 분류하고, 각 패턴의 구현 방법과 적합한 사용 시나리오를 설명합니다.

핵심 개념: 에이전트 디자인 패턴 분류

AI 에이전트 패턴은 크게 네 가지로 분류됩니다.

  • ReAct (Reasoning + Acting): 추론과 행동을 교대로 수행. "생각 -> 행동 -> 관찰 -> 생각" 루프
  • Plan-and-Execute: 먼저 전체 계획을 수립하고, 각 단계를 순차 실행
  • Tool Use: LLM이 적절한 외부 도구를 선택하고 호출하여 작업 수행
  • Multi-Agent: 여러 전문 에이전트가 협력하여 복잡한 작업 해결

실전 예제: 주요 패턴 구현

1. ReAct 패턴

from anthropic import Anthropic

client = Anthropic()

REACT_SYSTEM = """당신은 ReAct 에이전트입니다.
항상 다음 형식으로 응답하세요:

Thought: [현재 상황 분석과 다음 단계 추론]
Action: [실행할 도구와 파라미터]
Observation: [도구 실행 결과 - 시스템이 채워줌]
... (반복)
Thought: [최종 분석]
Answer: [최종 답변]

사용 가능한 도구:
- search(query): 웹 검색
- calculate(expression): 수학 계산
- lookup(topic): 지식베이스 조회"""

def react_loop(question, max_iterations=5):
    messages = [{"role": "user", "content": question}]

    for i in range(max_iterations):
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            system=REACT_SYSTEM,
            max_tokens=2048,
            messages=messages
        )

        text = response.content[0].text

        if "Answer:" in text:
            return text.split("Answer:")[-1].strip()

        if "Action:" in text:
            action = parse_action(text)
            observation = execute_action(action)
            messages.append({"role": "assistant", "content": text})
            messages.append({"role": "user", "content": f"Observation: {observation}"})

2. Multi-Agent 패턴 (Orchestrator-Worker)

class OrchestratorAgent:
    """작업을 분해하고 워커 에이전트에게 위임하는 오케스트레이터"""

    def __init__(self):
        self.workers = {
            "coder": CoderAgent(),
            "reviewer": ReviewerAgent(),
            "tester": TesterAgent()
        }

    def execute(self, task: str):
        # 1. 작업 분해
        plan = self.plan(task)

        # 2. 각 단계를 적절한 워커에게 위임
        results = []
        for step in plan.steps:
            worker = self.workers[step.agent_type]
            result = worker.execute(step.instruction)
            results.append(result)

            # 3. 중간 결과 검증
            if not self.validate(result):
                result = self.handle_failure(step, result)
                results[-1] = result

        return self.synthesize(results)

class CoderAgent:
    """코드 작성 전문 에이전트"""

    SYSTEM = """당신은 코드 작성 전문가입니다.
    주어진 사양에 맞는 깨끗하고 테스트 가능한 코드를 작성하세요.
    항상 타입 힌트와 docstring을 포함하세요."""

    def execute(self, instruction: str) -> str:
        response = client.messages.create(
            model="claude-sonnet-4-20250514",
            system=self.SYSTEM,
            max_tokens=4096,
            messages=[{"role": "user", "content": instruction}]
        )
        return response.content[0].text

3. 도구 라우팅 패턴

# 동적 도구 선택 패턴
tools = [
    {
        "name": "database_query",
        "description": "SQL 데이터베이스에서 데이터를 조회합니다",
        "input_schema": {
            "type": "object",
            "properties": {
                "query": {"type": "string", "description": "실행할 SQL 쿼리"},
                "database": {"type": "string", "enum": ["users", "orders", "products"]}
            },
            "required": ["query", "database"]
        }
    },
    {
        "name": "send_notification",
        "description": "사용자에게 알림을 발송합니다",
        "input_schema": {
            "type": "object",
            "properties": {
                "user_id": {"type": "string"},
                "message": {"type": "string"},
                "channel": {"type": "string", "enum": ["email", "slack", "sms"]}
            },
            "required": ["user_id", "message", "channel"]
        }
    }
]

# Claude가 자동으로 적절한 도구를 선택
response = client.messages.create(
    model="claude-sonnet-4-20250514",
    max_tokens=1024,
    tools=tools,
    messages=[{"role": "user", "content": "지난 주 주문이 10건 이상인 고객에게 감사 이메일을 보내줘"}]
)

활용 팁

  • 단순한 패턴부터 시작: 모든 문제에 Multi-Agent가 필요한 것은 아닙니다. 단일 에이전트 + Tool Use로 충분한 경우가 많습니다.
  • 실패 처리 설계: 에이전트는 반드시 실패합니다. 재시도 로직, 폴백 전략, 타임아웃을 설계 단계에서 포함하세요.
  • 관찰 가능성 확보: 각 에이전트의 추론 과정, 도구 호출, 결과를 모두 로깅하세요.
  • 가드레일 설정: 최대 반복 횟수, 비용 상한선, 위험 작업 확인 등 안전장치를 반드시 구현하세요.
  • 상태 관리: 긴 실행에서는 체크포인트를 저장하여 중간 실패 시 복구할 수 있도록 하세요.

마무리

AI 에이전트 디자인 패턴은 복잡한 AI 시스템을 구축하는 데 필수적인 설계 도구입니다. ReAct로 추론-실행 루프를 구성하고, Tool Use로 외부 세계와 상호작용하며, Multi-Agent로 복잡한 작업을 분업하는 것이 현대 AI 에이전트 아키텍처의 핵심입니다.