Skip to main content
미들웨어는 에이전트 실행 전후에 정책을 적용하는 계층입니다. 복잡한 로직을 프롬프트에서 빼고 코드 정책으로 관리할 수 있습니다.

어디에 쓰나

  • 모델 라우팅(기본 모델 ↔ 고성능 모델)
  • 재시도/타임아웃 정책
  • 도구 실행 전 안전 정책 검사
  • 감사 로그와 트레이스 보강

핵심 패턴: 모델 라우팅

공식 패턴은 @wrap_model_call입니다.
from langchain.agents import create_agent
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse
from langchain_openai import ChatOpenAI

basic_model = ChatOpenAI(model="gpt-4.1-mini")
advanced_model = ChatOpenAI(model="gpt-4.1")

@wrap_model_call
def dynamic_model_selection(request: ModelRequest, handler) -> ModelResponse:
    if len(request.state["messages"]) > 10:
        request.model = advanced_model
    else:
        request.model = basic_model
    return handler(request)

agent = create_agent(
    model=basic_model,
    tools=[],
    middleware=[dynamic_model_selection],
)

설계 원칙

  1. 정책은 프롬프트가 아니라 코드로 고정합니다.
  2. 실패 규칙(재시도/중단)을 명시합니다.
  3. 고위험 도구는 미들웨어에서 HITL로 분기합니다.
  4. 정책 변경 이력을 남겨 회귀를 추적합니다.

최소 운영 체크리스트

  • 모델 fallback 조건이 있는가
  • 타임아웃/재시도 기준이 있는가
  • 민감 도구 승인 경로가 있는가
  • 정책 실행 로그가 남는가

다음: HITL

고위험 액션을 승인 기반으로 전환합니다.

실무 적용 체크리스트

  • 차단/허용 정책을 코드 레이어에 분리했습니다.
  • 타임아웃과 재시도 횟수를 수치로 고정했습니다.
  • 모델 라우팅 조건을 로그로 남깁니다.
  • 정책 변경 PR 체크리스트를 운영합니다.

자주 나는 실수

  1. 프롬프트에 정책을 몰아넣어 운영 제어가 어려워집니다.
  2. 재시도와 타임아웃 기준이 없어 장애가 길어집니다.
  3. 정책 변경 이력을 남기지 않아 회귀 원인 추적이 어렵습니다.

다음 문서

다음: LangChain HITL

학습 흐름을 이어서 진행합니다.

운영 예시

  • 개발 환경: 완화된 정책 + 상세 로그
  • 운영 환경: 엄격한 정책 + 샘플링 로그
환경별 정책을 분리하면 개발 속도와 운영 안정성을 동시에 유지할 수 있습니다. 특히 모델 라우팅 규칙은 운영 트래픽 패턴에 따라 주기적으로 재조정합니다.