Contents
see List개요
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 에이전트 아키텍처의 핵심입니다.