DEV Community

Cover image for Gemini와 Claude, 언제 누구를 써야 할까? LLM 동적 라우팅 전략 경험기
바람의평온
바람의평온

Posted on

Gemini와 Claude, 언제 누구를 써야 할까? LLM 동적 라우팅 전략 경험기

Gemini와 Claude, 언제 누구를 써야 할까? LLM 동적 라우팅 전략 경험기

Gemini와 Claude, 언제 누구를 써야 할까? LLM 동적 라우팅 전략 경험기

안녕하세요, 코딩아빠입니다. 오늘도 아들 재워놓고 제가 실제로 부딪히고 해결했던 개발 경험을 정리한 노트를 공유해 드립니다. 여러 LLM 모델을 서비스에 연동해 사용해 보신 분들이라면 아마 저와 비슷한 고민을 해보셨을 것 같습니다. 처음에는 하나의 모델로 모든 작업을 처리하거나, 필요할 때마다 수동으로 모델을 변경하는 방식으로 운영했었죠. 하지만 Gemini나 Claude 같은 다양한 LLM 모델이 등장하면서, 각자의 강점과 약점, 그리고 무엇보다 비용 구조가 제각각이라는 점이 서비스 운영에 큰 변수로 작용했습니다. 특정 작업에 부적합한 모델을 사용하면 불필요한 비용이 발생하거나, 기대했던 응답 품질을 얻기 어려워지는 문제가 발생하더군요.

이 글에서 짚는 것

  • 다수의 LLM 모델을 통합할 때 발생하는 문제점과 비효율성을 이해합니다.
  • 각 LLM 모델의 특성과 비용 구조를 파악하는 중요성을 깨닫습니다.
  • 작업 유형에 따라 최적의 LLM을 동적으로 선택하는 라우팅 전략을 수립하는 방법을 배웁니다.
  • 파이썬 예시 코드를 통해 LLM 동적 라우팅 로직 구현의 기본을 익힙니다.
  • 구현된 라우팅 전략의 효과를 검증하고 지속적으로 개선하는 접근 방식을 알아봅니다.

여러 LLM 모델을 한 서비스에서 활용할 때의 딜레마

초기에는 서비스에서 필요한 LLM 기능을 구현할 때, 하나의 모델을 주로 사용하거나 필요에 따라 수동으로 변경하는 방식을 택했습니다. 예를 들어, 처음에는 주로 Gemini Pro 모델을 사용하다가, 특정 작업에서 Claude가 더 좋은 성능을 보인다는 소식을 들으면 해당 기능만 Claude로 변경하는 식이었죠. 문제는 이런 방식이 확장성과 효율성 면에서 한계를 보인다는 점이었습니다. 모든 작업에 최적화된 '만능 LLM'은 사실상 존재하지 않기 때문에, 어떤 모델은 짧은 질문 응답에 빠르고 저렴하지만 긴 문서 요약에는 비효율적일 수 있고, 또 다른 모델은 창의적인 글쓰기에는 탁월하지만 코딩 보조에는 아쉬운 성능을 보일 수 있었습니다. 결국, 매번 수동으로 모델을 선택하는 것은 개발 및 운영 비용을 증가시키는 요인이 되었고, 잘못된 선택은 서비스의 응답 품질 저하로 이어지기도 했습니다.

각 LLM의 고유한 강점과 비용 구조 파악의 중요성

LLM 동적 라우팅 전략의 핵심은 각 모델의 특성과 비용 구조를 정확히 이해하는 데 있습니다. 단순히 '더 좋은' 모델이나 '더 싼' 모델을 찾는 것이 아니라, 특정 작업의 요구사항과 모델의 강점을 일치시키는 것이 중요하다고 판단했습니다. 예를 들어, Gemini는 복잡한 추론이나 코딩 관련 작업에 강점을 보이며 빠른 응답 속도를 자랑합니다. 반면 Claude는 긴 컨텍스트 처리 능력과 섬세한 대화에 유리한 특성을 가지고 있죠. 이처럼 모델별 강점 외에도, 각 모델의 토큰당 비용도 천차만별입니다. 저렴한 모델은 대량의 단순 작업에 적합하고, 고성능 모델은 비용에 민감하지 않은 핵심 기능에 활용하는 것이 바람직합니다. 저희 팀은 아래와 같이 각 모델의 대략적인 비용과 품질 점수를 내부적으로 정의하여, 어떤 모델이 어떤 작업에 적합할지 판단하는 기준으로 삼았습니다.

MODEL_CONFIG = {
    'claude-3-opus': {'cost_per_token': 0.000015, 'quality_score': 9.5},
    'claude-3-sonnet': {'cost_per_token': 0.000003, 'quality_score': 8.0},
    'gemini-1.5-pro': {'cost_per_token': 0.0000035, 'quality_score': 9.0},
    'gemini-1.5-flash': {'cost_per_token': 0.00000035, 'quality_score': 7.5}
}
Enter fullscreen mode Exit fullscreen mode

이 설정은 모델 선택의 근거가 되었고, 나중에 라우팅 로직을 만들 때 중요한 참고 자료가 되었습니다.

.ba-pc{display:none}.ba-mo{display:block}@media (min-width:768px){.ba-pc{display:block}.ba-mo{display:none}}

작업 특성에 따른 LLM 동적 라우팅 전략 수립

각 LLM 모델의 특성을 파악한 후, 저희는 작업의 특성이나 서비스의 메뉴 유형에 따라 사용할 LLM 모델을 동적으로 선택하는 라우팅 전략을 수립하기로 결정했습니다. 이는 마치 택배 회사가 물건의 크기나 배송 거리에 따라 적합한 차량을 배정하는 것과 유사합니다. 비용에 민감하지 않고 고품질의 창의적인 응답이 필요한 작업에는 최상위 모델을, 대량 처리와 비용 절감이 중요한 작업에는 가성비 모델을 사용하도록 규칙을 정의한 것이죠. 이 전략의 핵심 목표는 두 가지였습니다. 첫째, 각 LLM의 강점을 최대한 활용하여 서비스의 전반적인 품질을 높이는 것. 둘째, 불필요한 비용 지출을 최소화하여 운영 효율성을 극대화하는 것이었습니다. 우리는 단순히 고정된 모델을 사용하는 것보다, 이런 동적인 접근 방식이 장기적으로 훨씬 유리할 것이라고 판단했네요.

파이썬으로 구현한 LLM 라우팅 로직

실제로 이 라우팅 전략을 백엔드 애플리케이션에 적용하기 위해 간단한 파이썬 함수를 구현했습니다. 이 함수는 들어오는 요청의 task_typeuser_query 길이를 기반으로 가장 적합한 LLM 모델을 선택하도록 설계되었습니다. 예를 들어, '창의적인 글쓰기'와 같은 고품질이 요구되는 작업에는 Claude-3 Opus를, 길이가 긴 '요약' 작업에는 긴 컨텍스트 처리에 유리한 Claude-3 Sonnet을, 그리고 '코딩 도움'과 같이 특정 도메인 지식이 요구되는 작업에는 Gemini-1.5 Flash를 할당하는 식입니다. 나머지 일반적인 프롬프트는 Gemini-1.5 Pro를 기본으로 사용하도록 했습니다. 아래는 그 구현 예시입니다.

def route_llm(task_type: str, user_query: str):
    if task_type == 'creative_writing':
        return 'claude-3-opus'
    elif task_type == 'summarization' and len(user_query) > 5000:
        return 'claude-3-sonnet'
    elif task_type == 'coding_help':
        return 'gemini-1.5-flash'
    else:
        return 'gemini-1.5-pro'
Enter fullscreen mode Exit fullscreen mode

이 코드는 실제 서비스 환경에서 사용될 때는 훨씬 더 복잡한 조건과 예외 처리가 추가되겠지만, 핵심 로직은 이와 크게 다르지 않습니다. 작업 유형과 쿼리 특성에 따라 모델을 분기하는 것이 핵심이죠.

동적 라우팅 전략의 효과 검증 및 지속적인 개선

라우팅 로직을 구현한 후에는 이 전략이 의도대로 작동하는지 검증하는 과정이 필수적이었습니다. 저희는 LLM API 호출 로그를 면밀히 모니터링하며, 특정 작업 유형에 대해 의도된 모델이 정확히 호출되는지 확인했습니다. 예를 들어, 'creative_writing' 요청이 들어왔을 때 실제로 'claude-3-opus'가 호출되는지, 5000자 이상의 긴 요약 요청에 'claude-3-sonnet'이 사용되는지 등을 지속적으로 확인한 것이죠. 단순히 호출 모델만 확인하는 것을 넘어, 각 모델의 응답 품질과 실제 처리 비용을 측정하여 라우팅 전략이 목표한 비용 효율성 및 품질 기준을 충족하는지 주기적으로 평가했습니다. 이 과정에서 예상치 못한 문제가 발견되면 라우팅 규칙을 수정하거나, 때로는 새로운 LLM 모델을 추가하는 등 전략을 유연하게 개선해 나갔습니다. 이처럼 동적 라우팅은 한 번 구현으로 끝나는 것이 아니라, LLM 시장의 변화와 서비스 요구사항에 맞춰 계속해서 진화해야 하는 부분이더군요.

더 나은 LLM 라우팅을 위한 고민들

저희가 현재 구현한 동적 라우팅 전략은 비교적 단순한 규칙 기반입니다. 하지만 실제 운영 환경에서는 더 복잡하고 정교한 전략이 필요할 수 있다는 것을 깨달았습니다. 예를 들어, A/B 테스트를 통해 여러 라우팅 규칙의 성능을 비교하거나, 실시간으로 각 LLM의 응답 시간이나 성공률을 모니터링하여 문제가 발생한 모델은 자동으로 라우팅 대상에서 제외하는 기능도 고려해 볼 수 있습니다. 또한, 사용자 피드백을 수집하여 특정 작업에서 어떤 모델이 더 만족스러운 응답을 주는지 데이터를 기반으로 라우팅 가중치를 조절하는 방법도 있겠네요. 단순히 비용 효율성이나 품질 향상을 넘어, 서비스의 안정성과 사용자 경험 전반을 고려하는 방향으로 라우팅 전략을 고도화하는 것이 앞으로의 과제라고 생각합니다. 이처럼 LLM 동적 라우팅은 단순히 코드를 구현하는 것을 넘어, 서비스의 성장과 함께 끊임없이 고민하고 발전시켜야 할 중요한 영역인 것 같습니다.

남는 이야기

다양한 LLM 모델을 활용하는 서비스에서 동적 라우팅 전략은 비용 효율성과 응답 품질을 동시에 잡을 수 있는 효과적인 방법이라는 것을 직접 경험했습니다. 각 모델의 특성과 비용을 면밀히 분석하고, 작업의 중요도에 맞춰 최적의 모델을 배정하는 지혜가 필요하다는 것을 다시 한번 깨달았네요. 이 글이 LLM 기반 서비스를 개발하고 운영하시는 다른 분들께 작은 도움이 되었으면 합니다. 다음에 또 다른 경험으로 찾아뵙겠습니다.

Top comments (0)