AI Agent 구조 설계 완전 정리
AI Agent 구조 설계 완전 정리
AI Agent를 만들 때 가장 흔한 실패는 “모델이 똑똑하면 알아서 하겠지”라는 기대입니다. 실전에서는 계획, 도구 실행, 메모리, 검증이 분리된 구조가 필요합니다.
기본 구성요소
[User Goal]
-> Planner
-> Executor(Tool Caller)
-> Memory(Short/Long term)
-> Verifier(Policy/Quality)
-> Response Composer
설계 원칙 7가지
- 계획과 실행 분리: Planner output을 명시적 step으로 저장
- 도구 호출 제한: allowlist 기반 tool permission
- 메모리 만료 정책: TTL/importance score로 정리
- 검증 우선: 실행 결과를 verifier가 먼저 검토
- 재시도 정책 명확화: 무한 루프 방지
- 관측 가능성 확보: step trace + token/cost 로그
- 휴먼 핸드오프 지원: 실패 시 즉시 사람에게 이관
Python 구현 예시: 최소 Agent Loop
예제 코드
from typing import Callable, Dict, Any, List
from pydantic import BaseModel
class PlanStep(BaseModel):
action: str
tool: str | None = None
input: str | None = None
class AgentState(BaseModel):
goal: str
steps: List[PlanStep] = []
tool_results: List[str] = []
# 예시 도구
def search_runbook(query: str) -> str:
return f"[runbook] Found incident guide for: {query}"
def check_policy(text: str) -> bool:
blocked = ["delete production", "drop database"]
return not any(x in text.lower() for x in blocked)
TOOLS: Dict[str, Callable[[str], str]] = {
"runbook_search": search_runbook,
}
def planner(goal: str) -> List[PlanStep]:
# 실제로는 LLM이 생성; 예시는 deterministic
return [
PlanStep(action="find relevant runbook", tool="runbook_search", input=goal),
PlanStep(action="summarize mitigation plan"),
]
def executor(state: AgentState) -> AgentState:
for step in state.steps:
if step.tool:
if step.tool not in TOOLS:
state.tool_results.append(f"Tool not allowed: {step.tool}")
continue
result = TOOLS[step.tool](step.input or "")
state.tool_results.append(result)
return state
def responder(state: AgentState) -> str:
joined = "\n".join(state.tool_results)
answer = f"Goal: {state.goal}\nEvidence:\n{joined}\n\nNext: apply rollback + notify on-call"
if not check_policy(answer):
return "Blocked by policy guard. Hand-off to human operator."
return answer
if __name__ == "__main__":
state = AgentState(goal="payment timeout incident on staging")
state.steps = planner(state.goal)
state = executor(state)
print(responder(state))
코드 설명
pydantic.BaseModel- Agent 상태(
AgentState)와 계획(PlanStep)을 타입 안정적으로 관리합니다. - 운영 중 입력 스키마가 바뀌어도 검증이 쉬워집니다.
- Agent 상태(
planner / executor / responder분리- 계획과 실행을 분리하면 실패 지점을 추적하기 쉽고, 재시도 정책을 분기하기 좋습니다.
TOOLSallowlist- 허용된 도구만 실행하게 만들어 권한 오남용을 방지합니다.
check_policy- 금지된 작업을 차단하는 guardrail 예시입니다.
- Agent의 핵심은 자율성보다 통제 가능성이라는 점을 코드 수준에서 반영합니다.
운영에서 꼭 필요한 보호장치
max_iterationsmax_tool_callsbudget_guard(token/cost)policy_guard(금지 명령 차단)
멀티 에이전트가 필요한 경우
- 도메인이 완전히 분리된 작업(법무/재무/개발)
- 단일 컨텍스트로 처리하면 성능이 급감하는 경우
그 외에는 단일 에이전트 + 명확한 도구 계층이 유지보수 측면에서 유리합니다.
결론
AI Agent 아키텍처의 핵심은 자율성이 아니라 통제 가능한 자율성입니다. 잘 설계된 Agent는 문제를 해결할 뿐 아니라, 실패했을 때도 원인을 설명할 수 있어야 합니다.
댓글남기기