AI 에이전트 기술, 2025년 어디까지 왔나
2024년까지 AI 에이전트는 "LLM + 프롬프트"의 단순한 조합이었습니다. 2025년, 에이전트 기술은 완전히 다른 차원으로 진화했습니다.
주요 변화:
- OpenAI Agent SDK — 에이전트 간 핸드오프, 가드레일, 트레이싱 내장
- Claude MCP (Model Context Protocol) — 외부 도구 연결의 표준화
- Structured Outputs — LLM 출력을 100% 구조화된 JSON으로 보장
- 멀티에이전트 오케스트레이션 — 여러 전문 에이전트가 협업하는 시스템
이 글에서는 하이프마크가 실제 프로젝트에서 사용하는 최신 에이전트 구축 방법론을 공유합니다.
에이전트 구축 프레임워크 비교
2025년 주요 프레임워크
| 프레임워크 | 개발사 | 특징 | 적합한 용도 |
|---|---|---|---|
| OpenAI Agent SDK | OpenAI | 핸드오프, 가드레일, 트레이싱 | 프로덕션 에이전트 |
| LangChain/LangGraph | LangChain | 체인 구성, 그래프 워크플로우 | 복잡한 파이프라인 |
| Claude Agent SDK | Anthropic | MCP 통합, 안전성 중심 | 도구 연동 에이전트 |
| CrewAI | CrewAI | 역할 기반 멀티에이전트 | 팀 협업 시뮬레이션 |
| AutoGen | Microsoft | 대화 기반 멀티에이전트 | 연구/실험 |
| 직접 구축 (Flask + LLM API) | - | 완전한 제어, 최소 의존성 | 커스텀 비즈니스 로직 |
하이프마크의 선택: 직접 구축 + 선택적 SDK 활용
하이프마크는 Flask 기반 직접 구축을 기본으로 하되, 특정 기능에서 OpenAI Agent SDK나 Claude MCP를 선택적으로 활용합니다.
왜 프레임워크 올인을 하지 않는가:
- 프레임워크 락인 방지 (특정 기술에 종속되면 LLM 교체가 어려움)
- 비즈니스 로직의 완전한 제어 (프레임워크의 추상화가 방해가 되는 경우)
- 디버깅 용이성 (블랙박스 없이 모든 단계를 투명하게 관찰)
- 성능 최적화 (불필요한 오버헤드 제거)
핵심 패턴 1: Function Calling (도구 사용)
개념
LLM이 직접 코드를 실행하는 것이 아니라, **"이 도구를 이 파라미터로 호출해달라"**고 요청하고, 시스템이 실행한 후 결과를 돌려주는 패턴.
실전 예시: 마케팅 데이터 조회 에이전트
import openai
import json
# 에이전트가 사용할 수 있는 도구 정의
tools = [
{
"type": "function",
"function": {
"name": "get_campaign_performance",
"description": "특정 기간의 광고 캠페인 성과를 조회합니다",
"parameters": {
"type": "object",
"properties": {
"platform": {
"type": "string",
"enum": ["naver", "google", "kakao", "meta"],
"description": "광고 플랫폼"
},
"date_from": {"type": "string", "description": "시작일 (YYYY-MM-DD)"},
"date_to": {"type": "string", "description": "종료일 (YYYY-MM-DD)"},
"metrics": {
"type": "array",
"items": {"type": "string"},
"description": "조회할 지표 (impressions, clicks, cost, conversions, roas)"
}
},
"required": ["platform", "date_from", "date_to"]
}
}
},
{
"type": "function",
"function": {
"name": "get_anomaly_report",
"description": "이상 탐지 리포트를 생성합니다",
"parameters": {
"type": "object",
"properties": {
"lookback_days": {"type": "integer", "description": "분석 기간 (일)"},
"sensitivity": {"type": "string", "enum": ["low", "medium", "high"]}
},
"required": ["lookback_days"]
}
}
},
{
"type": "function",
"function": {
"name": "optimize_budget",
"description": "채널별 예산 최적화 제안을 생성합니다",
"parameters": {
"type": "object",
"properties": {
"total_budget": {"type": "number", "description": "총 월 예산 (원)"},
"objective": {
"type": "string",
"enum": ["maximize_conversions", "maximize_roas", "minimize_cpa"],
"description": "최적화 목표"
}
},
"required": ["total_budget", "objective"]
}
}
}
]
# 도구 실행 함수
def execute_tool(tool_name: str, arguments: dict):
if tool_name == "get_campaign_performance":
return query_bigquery_campaign_data(**arguments)
elif tool_name == "get_anomaly_report":
return run_anomaly_detection(**arguments)
elif tool_name == "optimize_budget":
return calculate_optimal_budget(**arguments)
# 에이전트 실행 루프
def run_agent(user_query: str):
messages = [
{"role": "system", "content": "마케팅 데이터 분석 전문 에이전트입니다."},
{"role": "user", "content": user_query}
]
while True:
response = openai.chat.completions.create(
model="gpt-4o",
messages=messages,
tools=tools,
)
msg = response.choices[0].message
# 도구 호출이 없으면 최종 응답
if not msg.tool_calls:
return msg.content
# 도구 실행 & 결과 추가
messages.append(msg)
for tool_call in msg.tool_calls:
result = execute_tool(
tool_call.function.name,
json.loads(tool_call.function.arguments)
)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": json.dumps(result, ensure_ascii=False)
})
사용자 질문: "지난 주 네이버와 구글 ROAS를 비교해줘"
에이전트 동작:
get_campaign_performance(platform="naver", ...)호출get_campaign_performance(platform="google", ...)호출- 두 결과를 비교 분석하여 자연어 리포트 생성
핵심 패턴 2: RAG (검색 증강 생성)
왜 RAG가 필요한가
LLM은 학습 데이터에 없는 정보를 모릅니다. 기업의 내부 문서, 제품 매뉴얼, 고객 FAQ 등을 에이전트가 활용하려면 RAG 파이프라인이 필수입니다.
RAG 아키텍처
사용자 질문
│
▼
[임베딩 생성] ← OpenAI text-embedding-3-small
│
▼
[벡터 검색] ← Pinecone / Weaviate / PostgreSQL pgvector
│
▼
[관련 문서 3-5개 추출]
│
▼
[LLM에 컨텍스트로 전달]
│
▼
답변 생성 (출처 포함)
실전 활용: 고객 서비스 RAG 에이전트
from openai import OpenAI
client = OpenAI()
def answer_with_rag(question: str, company_id: str) -> str:
# 1. 질문을 벡터로 변환
embedding = client.embeddings.create(
model="text-embedding-3-small",
input=question
).data[0].embedding
# 2. 해당 기업의 지식베이스에서 관련 문서 검색
relevant_docs = vector_store.query(
vector=embedding,
filter={"company_id": company_id},
top_k=5
)
# 3. 검색된 문서를 컨텍스트로 LLM에 전달
context = "\n\n".join([doc.text for doc in relevant_docs])
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": f"""고객 서비스 에이전트입니다.
아래 참고 자료를 기반으로 답변하세요.
참고 자료에 없는 내용은 "확인 후 답변드리겠습니다"라고 하세요.
=== 참고 자료 ===
{context}"""},
{"role": "user", "content": question}
],
temperature=0.2,
)
return response.choices[0].message.content
핵심 패턴 3: 멀티에이전트 오케스트레이션
왜 하나의 에이전트로는 부족한가
복잡한 비즈니스 문제는 여러 전문 에이전트의 협업이 필요합니다.
예시: "이번 달 마케팅 전략 리포트를 만들어줘"
이 요청을 처리하려면:
- 데이터 분석가 — 전월 성과 데이터 분석
- 경쟁 분석가 — 경쟁사 동향 파악
- 전략가 — 분석 결과를 바탕으로 전략 수립
- 카피라이터 — 전략을 실행 가능한 캠페인 기획으로 변환
멀티에이전트 구현
class AgentOrchestrator:
"""여러 전문 에이전트를 조율하는 오케스트레이터"""
def __init__(self):
self.agents = {
"analyst": DataAnalystAgent(),
"competitor": CompetitorAnalysisAgent(),
"strategist": StrategyAgent(),
"copywriter": CopywriterAgent(),
}
def create_monthly_strategy(self, client_id: str) -> dict:
# Phase 1: 데이터 수집 & 분석 (병렬 실행)
analysis = self.agents["analyst"].analyze(
client_id=client_id,
period="last_month"
)
competitor = self.agents["competitor"].research(
industry=get_client_industry(client_id),
keywords=get_target_keywords(client_id)
)
# Phase 2: 전략 수립 (Phase 1 결과 활용)
strategy = self.agents["strategist"].plan(
performance_data=analysis,
competitor_data=competitor,
budget=get_monthly_budget(client_id),
objectives=get_client_objectives(client_id)
)
# Phase 3: 실행 계획 생성
campaign_plans = self.agents["copywriter"].create_campaigns(
strategy=strategy,
brand_guidelines=get_brand_voice(client_id),
channels=["naver", "google", "kakao", "meta"]
)
return {
"analysis": analysis,
"competitor_insights": competitor,
"strategy": strategy,
"campaign_plans": campaign_plans,
"generated_at": datetime.now().isoformat()
}
에이전트 간 핸드오프
OpenAI Agent SDK의 핸드오프 패턴:
from agents import Agent, handoff
# 각 에이전트 정의
triage_agent = Agent(
name="분류 에이전트",
instructions="고객 문의를 분류하여 적절한 전문 에이전트에게 전달합니다.",
handoffs=[
handoff(target=sales_agent, description="구매/가격 문의"),
handoff(target=support_agent, description="기술 지원/장애"),
handoff(target=billing_agent, description="결제/환불"),
]
)
sales_agent = Agent(
name="영업 에이전트",
instructions="제품 소개와 가격 안내를 담당합니다.",
tools=[get_pricing, schedule_demo, create_quote]
)
support_agent = Agent(
name="기술 지원 에이전트",
instructions="기술 문제 해결을 담당합니다.",
tools=[search_knowledge_base, create_ticket, check_system_status]
)
핵심 패턴 4: 가드레일과 안전장치
프로덕션 에이전트의 필수 요소
| 가드레일 | 목적 | 구현 방법 |
|---|---|---|
| 입력 검증 | 악의적 프롬프트 차단 | 입력 필터링 + 프롬프트 인젝션 탐지 |
| 출력 검증 | 부적절한 응답 방지 | LLM 기반 출력 검사 |
| 도구 제한 | 위험한 작업 방지 | 화이트리스트 기반 도구 접근 |
| 비용 제한 | API 비용 폭주 방지 | 토큰/요청 수 상한 설정 |
| 에스컬레이션 | 에이전트가 처리 못하는 경우 | 사람에게 자동 전달 |
| 로깅 | 모든 상호작용 기록 | 구조화된 로그 + BigQuery 저장 |
# 가드레일 예시
class SafetyGuard:
def check_input(self, user_input: str) -> bool:
"""프롬프트 인젝션 탐지"""
suspicious_patterns = [
"ignore previous instructions",
"you are now",
"system prompt",
"이전 지시를 무시",
]
return not any(p in user_input.lower() for p in suspicious_patterns)
def check_output(self, response: str) -> bool:
"""부적절한 출력 필터링"""
# 개인정보 노출 체크
if contains_pii(response):
return False
# 경쟁사 비방 체크
if contains_competitor_criticism(response):
return False
return True
def check_cost(self, session_tokens: int) -> bool:
"""비용 한도 체크"""
return session_tokens < 50000 # 세션당 5만 토큰 제한
하이프마크의 에이전트 구축 프로세스
4단계 프로세스
Phase 1: 발견 (1-2주)
- 비즈니스 프로세스 분석
- 자동화 가능 영역 식별
- ROI 추정 및 우선순위 결정
- 기술 스택 결정
Phase 2: 설계 (1-2주)
- 에이전트 아키텍처 설계
- 데이터 파이프라인 설계
- 프롬프트 엔지니어링
- 가드레일 설계
Phase 3: 구축 (3-6주)
- Flask 기반 에이전트 개발
- 도구/API 연동
- RAG 파이프라인 구축 (필요 시)
- 테스트 및 품질 검증
Phase 4: 운영 (지속)
- 모니터링 및 성능 최적화
- 프롬프트 반복 개선
- 신규 기능 추가
- 하이프마크.AI 대시보드 연동
결론
AI 에이전트는 더 이상 "챗봇"이 아닙니다. Function Calling으로 실제 업무를 수행하고, RAG로 기업 지식을 활용하고, 멀티에이전트로 복잡한 문제를 해결하는 자율적 업무 시스템입니다.
핵심은 어떤 프레임워크를 쓰느냐가 아니라, 비즈니스 문제에 최적화된 아키텍처를 설계할 수 있느냐입니다.
하이프마크는 50개 이상의 에이전트 프로젝트 경험을 바탕으로, 귀사의 비즈니스에 맞는 에이전트 아키텍처를 설계하고 구축합니다.