Agent 설계의 기본 원칙과 아키텍처 패턴을 이해합니다.
에이전트 설계를 간단하고 유지보수 가능하게 유지합니다.
핵심 철학: "단순한 프롬프트로 시작하고, 포괄적인 평가로 최적화하며, 더 간단한 솔루션이 부족할 때만 다단계 agentic 시스템을 추가"
실천 방법:
개발 흐름:
단순 프롬프트 → 평가 및 최적화 → 필요시에만 복잡성 추가
에이전트의 계획 단계를 명시적으로 표시하고 추론 과정을 외부에 노출합니다.
구현 예시:
class TransparentAgent:
def execute(self, task):
# 1. 계획 단계 명시
plan = self.create_plan(task)
self.log_plan(plan) # 사용자에게 보여주기
# 2. 각 단계 실행 과정 로깅
for step in plan.steps:
self.log_step(f"Executing: {step}")
result = self.execute_step(step)
self.log_result(result)
return result
이점:
Agent-Computer Interface (ACI) 설계에 집중 투자합니다.
중요성:
모든 agentic 시스템은 다음 세 가지로 증강된 LLM을 기본 빌딩 블록으로 사용합니다:
역할: 컨텍스트 정보 검색 기능
활용:
예시:
def augmented_llm_with_retrieval(query):
# 관련 문서 검색
relevant_docs = vector_db.search(query, top_k=5)
# 컨텍스트와 함께 LLM 호출
context = "\n".join(relevant_docs)
response = llm_call(f"Context: {context}\n\nQuery: {query}")
return response
역할: 외부 서비스 및 API 액세스
예시:
구현:
tools = [
{
"name": "search_code",
"description": "Search for code patterns in the codebase",
"parameters": {
"query": "regex pattern to search",
"file_pattern": "glob pattern for files"
}
},
{
"name": "read_file",
"description": "Read contents of a file",
"parameters": {
"path": "absolute file path"
}
}
]
역할: 작업 관련 상태 유지
유형:
예시:
class AgentMemory:
def __init__(self):
self.short_term = [] # 현재 대화
self.session = {} # 세션 상태
self.persistent = self.load_project_memory() # CLAUDE.md
def remember(self, key, value):
self.session[key] = value
def recall(self, key):
return self.session.get(key)
최신 Claude 모델은 이러한 기능을 능동적으로 활용합니다:
정의: LLM과 도구가 사전 정의된 코드 경로를 통해 조율됨
특징:
적합한 경우:
예시:
# 명확한 순서가 있는 워크플로우
def content_translation_workflow(product):
# Step 1: Generate
content = generate_marketing_copy(product)
# Step 2: Validate
if not validate_content(content):
raise ValueError("Content validation failed")
# Step 3: Translate
translations = {}
for lang in ["ko", "ja", "zh"]:
translations[lang] = translate_content(content, lang)
return translations
장점:
단점:
정의: LLM이 자체 프로세스를 동적으로 지시하고 작업 실행에 대한 자율적 제어 유지
특징:
적합한 경우:
예시:
# 동적으로 계획을 세우는 에이전트
class CodeRefactoringAgent:
async def refactor(self, issue_description):
# 동적 분석
analysis = await self.analyze_codebase(issue_description)
# 상황에 따라 계획 수립
if analysis.complexity == "high":
plan = await self.create_detailed_plan(analysis)
else:
plan = await self.create_simple_plan(analysis)
# 동적 실행
for step in plan.steps:
result = await self.execute_step(step)
# 결과에 따라 다음 단계 조정
if result.needs_revision:
plan = await self.adjust_plan(plan, result)
return result
장점:
단점:
주의: Agent는 신중한 가드레일이 필요합니다. 무한 루프 방지, 최대 반복 횟수 제한, 인간 개입 지점 등을 반드시 구현해야 합니다.
def choose_approach(task):
"""작업에 맞는 접근 방식 선택"""
# Workflow 선택 조건
if all([
task.has_clear_steps,
task.is_repeatable,
task.has_predictable_inputs
]):
return "Workflow"
# Agent 선택 조건
if any([
task.requires_dynamic_planning,
task.has_unpredictable_inputs,
task.needs_complex_decision_making
]):
return "Agent"
# 기본: Workflow로 시작
return "Workflow (upgrade to Agent if needed)"
Agent는 본질적으로 피드백 루프가 있는 워크플로우입니다.
컨텍스트 수집 → 액션 실행 → 작업 검증 → 반복
Agent의 정교함은 다음에서 나옵니다:
루프 아키텍처 설계 방식
에이전트에 부여한 기능
불가피한 실패 처리 방법
class AgentLoop:
def __init__(self, max_iterations=10):
self.max_iterations = max_iterations
self.checkpoints = []
async def execute(self, task):
iteration = 0
while iteration < self.max_iterations:
# 1. 컨텍스트 수집
context = await self.gather_context(task)
# 2. 액션 실행
action = await self.decide_action(context)
result = await self.execute_action(action)
# 3. 작업 검증
if await self.is_complete(result):
return result
# 4. 체크포인트 저장
self.checkpoints.append(result)
# 5. 실패 처리
if result.has_error:
recovery = await self.recover_from_error(result)
if not recovery.succeeded:
break
iteration += 1
# 최대 반복 도달
raise MaxIterationsExceeded(
f"Task incomplete after {self.max_iterations} iterations"
)
class AugmentedLLM:
def __init__(self, model, retrieval, tools, memory):
self.model = model
self.retrieval = retrieval
self.tools = tools
self.memory = memory
async def process(self, query):
# 1. Retrieval: 관련 컨텍스트 검색
context = await self.retrieval.search(query)
# 2. Memory: 이전 상태 회상
history = self.memory.recall_relevant(query)
# 3. LLM 호출 with augmented context
response = await self.model.generate(
query=query,
context=context,
history=history,
tools=self.tools.get_available()
)
# 4. Tool 실행 (필요시)
if response.requires_tool_use:
tool_results = await self.execute_tools(response.tool_calls)
# Tool 결과와 함께 재호출
response = await self.model.generate(
query=query,
context=context,
tool_results=tool_results
)
# 5. Memory 업데이트
self.memory.remember(query, response)
return response
작업을 시작하기 전에 다음을 확인하세요:
기본 개념을 이해했다면 Part 2: 5가지 워크플로우 패턴으로 진행하여 구체적인 구현 패턴을 학습하세요.