설정

언어

여러 모델을 활용한 AI 에이전트 구축: 실용 아키텍처 가이드

L
LemonData
·2026년 2월 26일·5 조회수
#AI 에이전트#멀티 모델#아키텍처#튜토리얼#LangChain
여러 모델을 활용한 AI 에이전트 구축: 실용 아키텍처 가이드

여러 모델로 AI 에이전트 구축하기: 실용적인 아키텍처 가이드

대부분의 AI 에이전트는 모든 작업에 단일 모델을 사용합니다. 계획 단계, 도구 호출, 요약, 오류 복구까지. 데모에는 괜찮지만, 실제 운영에서는 비효율적입니다.

깊은 추론이 필요한 계획 단계는 JSON 추출 단계와 같은 모델이 필요하지 않습니다. 코드 생성 작업은 분류 작업과 요구사항이 다릅니다. Claude Opus 4.6($25/1M 출력 토큰)을 날짜 문자열 포맷팅에 사용하는 것은 고급 건축가를 벽 페인팅에 고용하는 것과 같습니다.

각 단계를 최적의 모델로 라우팅하는 에이전트를 구축하는 방법을 소개합니다.

멀티 모델 에이전트 아키텍처

User Request
    │
    ▼
┌─────────────┐
│   Router     │  ← 작업 복잡도 분류
│  (fast model)│
└──────┬──────┘
       │
   ┌───┴───┐
   ▼       ▼
┌──────┐ ┌──────┐
│Simple│ │Complex│
│Model │ │Model  │
└──┬───┘ └──┬───┘
   │        │
   ▼        ▼
┌─────────────┐
│  Aggregator  │  ← 결과 통합
│  (fast model)│
└─────────────┘

세 가지 구성 요소:

  1. 들어오는 작업을 복잡도에 따라 분류하는 라우터
  2. 다양한 작업 유형에 맞춘 모델 풀
  3. 필요 시 결과를 결합하는 애그리게이터

OpenAI SDK를 활용한 구현

애그리게이터를 통해 단일 API 키로 여러 SDK를 관리하지 않고 모든 모델에 접근할 수 있습니다:

from openai import OpenAI

client = OpenAI(
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

# 비용/성능 등급별 모델 풀
MODELS = {
    "router": "gpt-4.1-mini",        # $0.40/1M 입력 토큰 - 빠른 분류용
    "simple": "gpt-4.1-mini",        # $0.40/1M 입력 토큰 - 추출, 포맷팅용
    "reasoning": "claude-sonnet-4-6",# $3.00/1M 입력 토큰 - 계획, 분석용
    "complex": "gpt-4.1",            # $2.00/1M 입력 토큰 - 코드 생성, 다단계 작업용
    "budget": "deepseek-chat",       # $0.28/1M 입력 토큰 - 대량 처리용
}

def route_task(task: str) -> str:
    """저렴한 모델로 작업 복잡도 분류."""
    response = client.chat.completions.create(
        model=MODELS["router"],
        messages=[
            {"role": "system", "content": """이 작업을 다음 카테고리 중 하나로 분류하세요:
- simple: 데이터 추출, 포맷팅, 번역
- reasoning: 분석, 계획, 비교
- complex: 코드 생성, 다단계 문제 해결
- budget: 대량 처리, 비핵심 작업
카테고리 이름만 답변하세요."""},
            {"role": "user", "content": task}
        ],
        max_tokens=10
    )
    category = response.choices[0].message.content.strip().lower()
    return MODELS.get(category, MODELS["simple"])

def execute_task(task: str, context: str = "") -> str:
    """적절한 모델로 작업을 라우팅하고 실행."""
    model = route_task(task)
    messages = []
    if context:
        messages.append({"role": "system", "content": context})
    messages.append({"role": "user", "content": task})

    response = client.chat.completions.create(
        model=model,
        messages=messages
    )
    return response.choices[0].message.content

실제 에이전트 예시: 코드 리뷰 파이프라인

다음은 풀 리퀘스트를 리뷰하는 실용적인 멀티 모델 에이전트입니다:

def review_pr(diff: str) -> dict:
    """멀티 모델 PR 리뷰 파이프라인."""

    # 1단계: 변경사항 분류 (저비용 모델)
    classification = client.chat.completions.create(
        model="gpt-4.1-mini",
        messages=[{
            "role": "user",
            "content": f"이 코드 변경사항을 분류하세요: {diff[:2000]}\n"
                       "카테고리: bugfix, feature, refactor, docs, test"
        }],
        max_tokens=20
    ).choices[0].message.content

    # 2단계: 보안 검사 (추론 모델)
    security = client.chat.completions.create(
        model="claude-sonnet-4-6",
        messages=[{
            "role": "system",
            "content": "당신은 보안 리뷰어입니다. 다음을 점검하세요: "
                       "SQL 인젝션, XSS, 인증 우회, 코드 내 비밀, "
                       "안전하지 않은 역직렬화. 구체적인 라인 번호 포함."
        }, {
            "role": "user",
            "content": f"이 diff에서 보안 문제를 리뷰하세요:\n{diff}"
        }]
    ).choices[0].message.content

    # 3단계: 코드 품질 (일반 모델)
    quality = client.chat.completions.create(
        model="gpt-4.1",
        messages=[{
            "role": "user",
            "content": f"코드 품질을 리뷰하세요: 네이밍, 구조, "
                       f"오류 처리, 테스트 커버리지.\n{diff}"
        }]
    ).choices[0].message.content

    # 4단계: 요약 (저비용 모델)
    summary = client.chat.completions.create(
        model="gpt-4.1-mini",
        messages=[{
            "role": "user",
            "content": f"이 PR 리뷰를 3개의 핵심 포인트로 요약하세요:\n"
                       f"유형: {classification}\n"
                       f"보안: {security[:500]}\n"
                       f"품질: {quality[:500]}"
        }]
    ).choices[0].message.content

    return {
        "classification": classification,
        "security": security,
        "quality": quality,
        "summary": summary
    }

일반적인 PR 리뷰(2K 토큰 diff) 비용 내역:

단계 모델 입력 토큰 수 비용
분류 GPT-4.1-mini 약 2,100 $0.0008
보안 Claude Sonnet 4.6 약 2,500 $0.0075
품질 GPT-4.1 약 2,500 $0.0050
요약 GPT-4.1-mini 약 1,200 $0.0005
총합 약 $0.014

모든 단계를 Claude Sonnet 4.6으로 처리하면 약 $0.028이 듭니다. 멀티 모델 접근법은 비용을 50% 절감하면서 가장 중요한 단계(보안 리뷰)에 강력한 모델을 사용합니다.

LangChain 통합

from langchain_openai import ChatOpenAI

# 서로 다른 설정으로 모델 인스턴스 생성
fast = ChatOpenAI(
    model="gpt-4.1-mini",
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

reasoning = ChatOpenAI(
    model="claude-sonnet-4-6",
    api_key="sk-lemon-xxx",
    base_url="https://api.lemondata.cc/v1"
)

# LangChain 체인에서 사용
from langchain_core.prompts import ChatPromptTemplate

classify_chain = ChatPromptTemplate.from_template(
    "Classify: {input}"
) | fast

analyze_chain = ChatPromptTemplate.from_template(
    "Analyze in depth: {input}"
) | reasoning

멀티 모델 에이전트를 사용해야 할 때

멀티 모델 라우팅은 복잡성을 더합니다. 다음과 같은 경우에 가치가 있습니다:

  • 에이전트가 다양한 작업 유형을 처리할 때(단순 채팅이 아닌 경우)
  • 월간 API 비용이 $100 이상일 때(절감 효과가 의미있음)
  • 특정 모델 강점이 필요할 때(코드는 Claude, 긴 컨텍스트는 Gemini, 속도는 GPT 등)
  • 일부 단계에서는 지연 시간이 중요하지만 다른 단계에서는 그렇지 않을 때

단순한 챗봇이나 단일 목적 에이전트에는 단일 모델이 충분합니다. 모든 요청에 동일한 능력이 필요하면 라우팅 오버헤드는 정당화되지 않습니다.

핵심 요약

  1. 각 단계에 적합한 가장 저렴한 모델을 사용하세요
  2. 비싼 모델은 진짜 필요한 작업에만 예약하세요
  3. 분류/라우팅 단계는 항상 가장 저렴한 모델을 사용하세요
  4. 토큰당 가격뿐 아니라 실제 에이전트 실행당 비용을 측정하세요
  5. 단일 키로 여러 모델에 접근하는 API 애그리게이터가 멀티 모델 접근을 크게 단순화합니다

한 API로 모든 모델에 접근하세요: lemondata.cc는 300개 이상의 모델을 단일 API 키로 제공합니다. 여러 공급자 계정을 관리하지 않고 멀티 모델 에이전트를 구축하세요.

Share: