Agent에게 **모델(Model)**은 작업을 수행하는 '두뇌' 그 자체입니다.
Agent가 사용자의 요청을 받고 "어떤 도구를 써야 하지?", "이 도구의 결과를 어떻게 해석해야 하지?", "최종 답변을 뭐라고 해야 하지?"라고 추론(Reasoning)하고 결정하는 모든 과정을 이 '모델'이 담당합니다.
제공해주신 텍스트는 이 '두뇌'를 설정하는 두 가지 주요 방식에 대해 설명하고 있습니다.
각각을 예시와 함께 자세히 설명해 드리겠습니다.
가장 기본적이고 널리 쓰이는 방식입니다. Agent를 생성할 때 **"너는 이 모델만 써!"**라고 지정하면, Agent는 실행되는 내내 그 모델(예: gpt-4o)만 사용합니다.
"수식" (코드 구조):
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 등)"수식" (코드 구조):
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)
고급 기능입니다. 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를 실행하면, 대화가 길어질 때 자동으로 모델이 바뀝니다!
| 구분 | 정적 모델 (Static Model) | 동적 모델 (Dynamic Model) |
|---|---|---|
| 개념 | 하나의 두뇌를 정해서 끝까지 사용 | 여러 두뇌를 준비하고 상황에 맞게 교체 |
| 설정 방법 | create_agent("모델명", ...) (간편) create_agent(ChatOpenAI(...), ...) (정밀) | middleware=[...]를 사용하여 선택 로직 구현 |
| 장점 | 구현이 간단하고 직관적임 | 비용 및 성능 최적화 가능 (고급 기능) |
| 단점 | 유연성 부족 (단순 작업에도 비싼 모델 사용) | 구현이 복잡하고 고급 지식 필요 |
| 추천 | 대부분의 경우, 테스트, 프로토타입 | 운영 비용 최소화가 중요한 실제 프로덕션 |