
"Hi" 수준의 질문에 Claude 비용을 지불하지 마세요 — 50줄의 코드로 LLM 프롬프트를 적절한 모델로 라우팅하기
요약
프롬프트의 난이도에 따라 고비용 모델과 저비용 오픈 모델로 요청을 자동 분류하여 비용을 최적화하는 라우팅 시스템 구축 방법을 소개합니다. Cloudflare Workers와 AI Gateway를 활용하여 약 50줄의 코드로 구현할 수 있는 실용적인 튜토리얼입니다.
핵심 포인트
- 프롬프트 난이도에 따른 모델 라우팅으로 API 비용 절감
- Cloudflare Workers와 AI Gateway를 활용한 아키텍처 구성
- 코딩 질문은 Claude Sonnet, 일반 질문은 오픈 모델로 분기
- 단일 엔드포인트를 통한 통합 로그 및 캐싱 관리
모든 AI 앱은 동일한 갈림길에 마주합니다. 비용이 많이 드는 프론티어 모델 (Frontier Model)을 선택하여 사소한 프롬프트에 예산을 낭비할 것인가, 아니면 저렴한 오픈 모델 (Open Model)을 선택하여 어려운 질문에 평범한 답변을 내놓을 것인가의 문제입니다.
둘 중 하나를 선택할 필요는 없습니다. 모든 프롬프트가 Claude Sonnet 4.6을 필요로 하는 것은 아닙니다. "포르투갈의 수도는 어디인가요?"와 "이 400줄짜리 React 컴포넌트를 Suspense를 사용하도록 리팩터링하세요"는 동일한 작업이 아니며, 동일한 비용이 들어서도 안 됩니다.
이 튜토리얼에서는 **각각의 들어오는 요청을 적절한 모델로 자동으로 라우팅하는 프롬프트 분류기 (Prompt Classifier)**를 구축할 것입니다:
- 코딩 질문 → Claude Sonnet 4.6 (코드 분야 최고 수준)
- 그 외 모든 것 → Workers AI 상의 저렴하고 빠른 오픈 모델
전체 코드는 Cloudflare Workers에서 실행되는 약 50줄의 TypeScript로 구성되며, 라우팅 로직은 AI Gateway에 위치합니다. 벤더 종속성 (Vendor lock-in)이 없고, 통합된 로그를 제공하며, 앱을 위한 단일 엔드포인트를 가집니다.
아키텍처 (The architecture)
세 가지 구성 요소:
- Worker: 각 OpenAI 호환 채팅 요청을 가로챕니다.
- Workers AI (Llama 4 Scout, 무료 티어)를 사용하여 프롬프트를
coding또는simple로 분류합니다. - 해당 태그를
cf-aig-metadata헤더로 부착한 다음, 태그를 읽고 올바른 업스트림 모델 (Upstream model)로 라우팅하는 AI Gateway로 전달합니다.
클라이언트는 오직 하나의 엔드포인트만 보게 됩니다. AI Gateway는 두 제공업체 모두에 대해 통합된 로그, 캐싱 (Caching), 그리고 속도 제한 (Rate-limiting)을 제공합니다.
사전 요구 사항 (Prerequisites)
1단계: AI Gateway 생성하기
- Cloudflare Dashboard → AI → AI Gateway → Create Gateway로 이동합니다. 이름을 지정합니다 (예:
smart-router). - Authenticated Gateway 옵션이 활성화되어 있는지 확인합니다.
- Authenticated Gateway가 활성화된 상태로 AI Gateway가 생성되었습니다.
- 다음 화면에 표시되는 API 토큰을 복사합니다 — Cloudflare는 이를 다시 보여주지 않습니다. 나중에 AI_GATEWAY_TOKEN 시크릿(secret)을 설정할 때 이 토큰이 필요합니다.
- 그런 다음 Anthropic API 키를 추가합니다:
- 게이트웨이를 엽니다 → Provider Keys 탭
- Add를 클릭 → Anthropic을 선택 → 키를 붙여넣습니다.
이제 AI Gateway가 귀하를 대신하여 Anthropic 인증을 처리합니다 — Worker에서 해당 키를 노출할 필요가 없습니다.
2단계: 동적 라우트(Dynamic Route) 구성하기
여전히 게이트웨이 내에 있는 상태에서, Dynamic Routes → Add Route → Start from scratch로 이동합니다. 이름을 route1로 지정합니다.
시각적 에디터(visual editor)에서 다음 로직을 구축합니다:
- If
metadata.task == "coding"→ Anthropic으로 라우팅 →claude-sonnet-4-6 - Else → Workers AI로 라우팅 →
@cf/moonshotai/kimi-k2.7-code(또는 다른 저렴한 Workers AI 모델)
라우트를 저장합니다. 이제 AI Gateway는 metadata.task 필드를 기반으로 트래픽을 분기(fork)하는 방법을 알게 되었습니다.
3단계: 분류기(classifier) Worker 구축하기
새로운 Worker의 스캐폴딩(Scaffold)을 생성합니다:
npm create cloudflare@latest -- prompt-router --type hello-world --ts
cd prompt-router
새로운 prompt-router/src 폴더로 이동하여 src/index.ts를 다음 내용으로 교체합니다:
export interface Env {
AI: Ai;
GATEWAY_ACCOUNT_ID: string;
...
wrangler.jsonc를 업데이트합니다.
- **{GATEWAY__ACCOUNT__ID}**를 귀하의 Cloudflare Account ID로 교체합니다:
- Cloudflare 대시보드에서 Account 목록으로 이동합니다.
- 계정 행의 끝에 있는 메뉴 버튼을 선택합니다.
- Copy account ID를 선택합니다. Image description

- **{GATEWAY_NAME}**를 귀하의 값으로 업데이트합니다 (AI > AI Gateway > Settings에서 확인 가능).
{
"name": "prompt-router",
"main": "src/index.ts",
...
AI Gateway API 토큰(AI Gateway 생성 시 저장됨)을 Worker secret으로 저장합니다:
wrangler secret put AI_GATEWAY_TOKEN
# 프롬프트가 나타나면 토큰을 붙여넣으세요
Worker를 배포합니다:
npm run deploy
단계 4: 테스트하기
curl을 사용하여 Worker에 두 개의 프롬프트를 보냅니다:
# 단순한 프롬프트 — Workers AI로 라우팅되어야 함
curl -X POST https://prompt-router.<your-subdomain>.workers.dev \
-H "Content-Type: application/json" \
...
- Cloudflare Dashboard > Compute > Workers & Pages prompt-router로 이동합니다.
- Observability / Logs 탭을 확인합니다. 프롬프트를 성공적으로 추출하고
Task: coding이라고 로그를 남기는 것을 볼 수 있어야 합니다. - AI > AI Gateway > Gateways > Your Gateway로 이동합니다.
- Logs 탭을 클릭하여 코딩 작업에는 claude-sonnet-4-6 모델(느리고 비싸지만 품질이 높음)이 사용되고, 나머지 작업에는 Kimi-K2(빠르고 저렴함)가 사용되는지 확인합니다. 비용 차이는 로그에서 확인할 수 있습니다.

단계 5: 기존 앱을 여기에 연결하기
OpenAI Chat Completions API를 사용하는 것이라면 무엇이든 작동합니다. 예를 들어, Open WebUI 또는 LibreChat의 경우:
Base URL: https://prompt-router..workers.dev
Model: dynamic/route1
API Key: 귀하의 AI Gateway 토큰
Continue.dev 또는 Cursor에서는 동일한 Base URL과 모델 이름을 사용하세요. 클라이언트 관점에서는 단일 OpenAI 호환 모델일 뿐이며, 라우팅은 보이지 않게 처리됩니다.
이것이 실제로 비용을 절감하나요?
현재 공개된 가격을 기준으로 대략적으로 계산해 보면 다음과 같습니다:
| 모델 | 입력 $/1M tokens | 출력 $/1M token |
|---|---|---|
| Claude Sonnet 4.6 | $3.0 | $15.00 |
| Workers AI (Kimi-K2) | $0.95 | $4.00 |
만약 일반적인 채팅 앱 프롬프트의 70%가 "단순한" 것(대화, 사실 관계 질문, 요약)이고 30%가 "코딩" 또는 복잡한 추론이라면, 이들을 분리하여 라우팅(Routing)하는 것은 모든 요청을 Claude로 보내는 것과 비교했을 때 전체 LLM 비용을 약 60-70% 절감하면서도, Claude가 제값을 하는 작업에는 Claude를 계속 사용할 수 있게 해줍니다.
결과는 상황에 따라 다를 수 있습니다. 수치를 인용하기 전에 분류기(Classifier)의 출력을 계측하고 본인의 트래픽 혼합 비율을 직접 측정해 보세요.
향후 발전 방향
몇 가지 자연스러운 확장 방법은 다음과 같습니다:
- 더 많은 카테고리: 추론(Reasoning), 창의적 작성(Creative), 요약(Summarization), 번역(Translation) 등을 추가하여 각각 전문 모델로 라우팅합니다.
- 신뢰도 기반 폴백 (Confidence-based fallback): 분류기에 신뢰도 점수(Confidence score)를 요청하고, 신뢰도가 높을 때만 저렴한 모델로 라우팅합니다. 그렇지 않으면 기본적으로 강력한 모델을 사용합니다.
- 사용자별 또는 티어별 라우팅: 무료 티어 사용자는 항상 저렴한 모델을 사용하고, 유료 사용자는 최첨단(Frontier) 모델을 사용하게 합니다. 헤더(Header)나 JWT 클레임(Claim)을 읽어 작업(Task)과 함께
cf-aig-metadata에 주입합니다. - 평가(Evals) 기반 라우팅: 두 모델의 응답을 오프라인에서 점수화한 다음, 특정 카테고리에서 승리하는 모델 쪽으로 라우터를 편향(Bias)시킵니다.
요약
- 흥미로운 점은 분류기 자체가 아니라 바로 이 패턴입니다. 앱과 AI Gateway 사이에 메타데이터를 주입하는 Worker를 배치하고 나면, 다시는 코드를 건드리지 않고도 Gateway의 비주얼 에디터에서 원하는 모든 라우팅 정책을 표현할 수 있습니다.
- 프롬프트 기반 라우팅은 가장 단순하면서도 유용한 정책입니다. 이를 배포하고 나면, 비용 인식(Cost-aware), 지연 시간 인식(Latency-aware), 품질 인식(Quality-aware) 라우팅은 모두 Dynamic Route 편집 한 번으로 가능해집니다.
전체 코드 및 설정 노트: GitHub Repo
이것으로 무언가를 만드셨다면 댓글을 남겨주세요. 특히 제 것보다 더 똑똑한 분류기 프롬프트를 찾으셨다면 더욱 환영합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기
