lanchain - agent (model)

HanJu Han·2025년 11월 12일

LangChain Agent의 '모델(Model)' : 기초부터 자세히 알아보기

Agent에게 **모델(Model)**은 작업을 수행하는 '두뇌' 그 자체입니다.

Agent가 사용자의 요청을 받고 "어떤 도구를 써야 하지?", "이 도구의 결과를 어떻게 해석해야 하지?", "최종 답변을 뭐라고 해야 하지?"라고 추론(Reasoning)하고 결정하는 모든 과정을 이 '모델'이 담당합니다.

제공해주신 텍스트는 이 '두뇌'를 설정하는 두 가지 주요 방식에 대해 설명하고 있습니다.

  1. 정적 모델 (Static Model): Agent를 만들 때 두뇌를 하나 정해두고, 끝까지 그 두뇌만 사용하는 방식입니다.
  2. 동적 모델 (Dynamic Model): 상황에 따라 Agent가 사용하는 두뇌를 바꿔 끼우는 고급 방식입니다.

각각을 예시와 함께 자세히 설명해 드리겠습니다.


1. 정적 모델 (Static Model)

가장 기본적이고 널리 쓰이는 방식입니다. Agent를 생성할 때 **"너는 이 모델만 써!"**라고 지정하면, Agent는 실행되는 내내 그 모델(예: gpt-4o)만 사용합니다.

방법 1: 모델 식별자 (문자열) 사용

"수식" (코드 구조):

from langchain.agents import create_agent

# 가장 간단한 방법. 모델 이름을 문자열로 전달
agent = create_agent(
    "모델_식별자_문자열",  # 예: "gpt-4o"
    tools=tools
)

"수식 예시" (실제 코드):

from langchain.agents import create_agent
# (tools 리스트는 이전에 정의되었다고 가정)

# LangChain이 "gpt-4o" 문자열을 보고 
# "아, 이건 OpenAI의 gpt-4o 모델이구나"라고 자동 추론합니다.
agent = create_agent(
    "gpt-4o", 
    tools=tools
)
  • 장점: 코드가 매우 간결하고 빠릅니다.
  • 단점: 모델의 세부 설정을 변경할 수 없습니다. (예: temperature, max_tokens 등)

방법 2: 모델 인스턴스 (객체) 사용

"수식" (코드 구조):

from langchain.agents import create_agent
from [모델_제공자_패키지] import [채팅_모델_클래스]

# 1. 모델의 세부 설정을 포함하여 '인스턴스(객체)'를 만듭니다.
model = [채팅_모델_클래스](
    model="모델명",
    parameter1=1,  # 예: temperature
    parameter2=2   # 예: max_tokens
    # ... (기타 필요한 모든 설정)
)

# 2. Agent를 생성할 때 이 '모델 인스턴스'를 전달합니다.
agent = create_agent(model, tools=tools)

"수식 예시" (실제 코드):

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI

# 1. OpenAI 모델 인스턴스를 생성
model = ChatOpenAI(
    model="gpt-4o",         # 사용할 모델 이름
    temperature=0.1,        # 창의성 (0에 가까울수록 일관된 답변)
    max_tokens=1000,        # 최대 답변 길이
    timeout=30              # 30초 이상 걸리면 중단
    # ... (API 키, 기본 URL 등 다른 모든 설정 가능)
)

# 2. Agent를 생성할 때 이 'model' 객체를 전달
agent = create_agent(model, tools=tools)
  • 장점: 온도(temperature), 최대 토큰 등 모델의 모든 세부 파라미터를 완벽하게 제어할 수 있습니다. 실제 서비스를 만들 때는 반드시 이 방법을 사용해야 합니다.
  • 단점: 코드가 조금 더 길어집니다.

2. 동적 모델 (Dynamic Model)

고급 기능입니다. Agent가 실행되는 '도중에' 사용할 모델을 바꾸는 것입니다.

왜 이런 기능이 필요할까요?

비용 및 효율 최적화 때문입니다.

  • 간단한 질문 (예: "안녕?", "이름이 뭐야?"): 굳이 비싸고 강력한 gpt-4o를 쓸 필요가 없습니다. 빠르고 저렴한 gpt-4o-mini로도 충분합니다.
  • 복잡한 요청 (예: "주어진 10페이지 문서를 요약하고, 핵심 주제 5가지를 뽑아줘"): 저렴한 모델로는 품질이 떨어지므로, 이때는 비싸고 강력한 gpt-4o를 써야 합니다.

동적 모델링은 이처럼 상황에 맞는 최적의 '두뇌'를 실시간으로 선택하는 기술입니다.

어떻게 구현하나요?
**미들웨어(Middleware)**라는 개념을 사용합니다. @wrap_model_call 데코레이터를 사용하여 "모델을 호출하기 직전에 잠깐! 내가 어떤 모델을 쓸지 결정할게!"라고 끼어드는 함수를 만듭니다.

"수식" (코드 구조):

from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse
from [provider] import [ChatModel]

# 1. 사용할 모델들(두뇌들)을 미리 준비
basic_model = [ChatModel](model="저렴한_모델")
advanced_model = [ChatModel](model="비싼_모델")

# 2. 동적 선택 로직(미들웨어) 정의
@wrap_model_calldef dynamic_model_selection(request: ModelRequest, handler):
    """모델 호출 직전에 가로채서 실행되는 함수"""
    
    # 'request' 객체에서 현재 상태(state)를 확인
    # (예: 대화가 얼마나 길어졌는지, 어떤 도구를 쓰려는지 등)
    if (어떤_조건):
        # 💡 조건 만족 시, 비싼 모델로 교체!
        request.model = advanced_model
    else:
        # 💡 기본 모델 사용
        request.model = basic_model
        
    # 4. 결정된 모델로 요청을 계속 진행시킴
    return handler(request)

# 3. Agent 생성 시 기본 모델과 미들웨어를 등록
agent = create_agent(
    model=basic_model,  # 💡 일단 기본 모델로 시작
    tools=tools,
    middleware=[dynamic_model_selection] # 💡 우리가 만든 '선택 로직' 등록
)

"수식 예시" (실제 코드 - 텍스트 내용 기반):
(대화가 10번 넘게 오가면 복잡한 대화로 간주하고, 고급 모델로 바꾸는 예시)

from langchain_openai import ChatOpenAI
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse

# 1. 두 개의 '두뇌' 준비
basic_model = ChatOpenAI(model="gpt-4o-mini") # 💡 빠르고 저렴한 모델
advanced_model = ChatOpenAI(model="gpt-4o")    # 💡 강력하고 비싼 모델

# 2. 동적 선택 로직(미들웨어) 정의
@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
    """대화 복잡도(길이)에 따라 모델을 선택합니다."""
    
    # request.state["messages"] : Agent가 기억하는 현재까지의 대화 내역
    message_count = len(request.state["messages"])
    
    if message_count > 10:
        # 💡 대화가 10턴을 넘어가면 (복잡하다고 판단)
        print("🤖 (알림: 고급 모델 gpt-4o로 전환합니다!)")
        request.model = advanced_model # 모델을 'gpt-4o'로 교체
    else:
        # 💡 10턴 미만이면 기본 모델 사용
        request.model = basic_model # 모델을 'gpt-4o-mini'로 유지
        
    # 3. 선택된 모델로 요청을 계속 진행시킴
    return handler(request)

# 4. Agent 생성 시 미들웨어 등록
agent = create_agent(
    model=basic_model,  # 💡 시작은 무조건 기본 모델(mini)
    tools=tools,
    middleware=[dynamic_model_selection] # 💡 'dynamic_model_selection' 로직 탑재
)

# 이제 이 agent를 실행하면, 대화가 길어질 때 자동으로 모델이 바뀝니다!

3. 요약 비교

구분정적 모델 (Static Model)동적 모델 (Dynamic Model)
개념하나의 두뇌를 정해서 끝까지 사용여러 두뇌를 준비하고 상황에 맞게 교체
설정 방법create_agent("모델명", ...) (간편)
create_agent(ChatOpenAI(...), ...) (정밀)
middleware=[...]를 사용하여 선택 로직 구현
장점구현이 간단하고 직관적임비용 및 성능 최적화 가능 (고급 기능)
단점유연성 부족 (단순 작업에도 비싼 모델 사용)구현이 복잡하고 고급 지식 필요
추천대부분의 경우, 테스트, 프로토타입운영 비용 최소화가 중요한 실제 프로덕션
profile
시리즈를 기반으로 작성하였습니다.

0개의 댓글