
SOFTMOA TECHNOLOGY
AI 에이전트 디자인 패턴
소프트모아가 정리한 기술 기록입니다.
Contents
작성일 2026. 02. 11.
개요
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 에이전트 아키텍처의 핵심입니다.
Share this
AI
Showing 1 to 10 of 73 entries
