-
Notifications
You must be signed in to change notification settings - Fork 0
LOCAL_LLM_HYBRID_ROUTING
⚠️ 이 문서는 논의·검토용 자료입니다. 현재 설계 결정에 반영된 내용이 아니며, 7개 설계 deliverable의 불변식을 바꾸지 않습니다. 모델 선택(claude-opus-4-7vsclaude-sonnet-4-6)은 SYSTEM_DESIGN §15에서 미결로 남아 있으며, 이 문서는 로컬 LLM을 세 번째 후보로 추가 검토하는 메모입니다.작성일: 2026-05-27 / 모델 조사 기준: 2026-05-27
현재 orchestrator는 Anthropic Claude SDK를 통해 claude-opus-4-7 또는 claude-sonnet-4-6을 호출한다 (SYSTEM_DESIGN §15, OSS_INTEGRATION §3.3). "Mac Studio 장비가 확보되어 있다면 로컬 LLM을 도입해 비용·지연·오프라인 가용성을 개선할 수 있는가"를 검토한 메모. HuggingFace Open LLM Leaderboard, LMSYS Chatbot Arena, 각 기관 기술 보고서를 기반으로 후보군을 정리했다.
Apple Silicon의 통합 메모리(Unified Memory) 는 CPU와 GPU/Neural Engine이 동일 메모리를 공유하므로, LLM 추론 시 VRAM 병목 없이 전체 RAM을 모델 가중치에 활용할 수 있다. 이것이 동급 가격대 Windows 워크스테이션(RTX 4090, 24 GB VRAM) 대비 로컬 LLM 운영에서 가장 큰 이점이다.
| 장비 | 통합 메모리 | 메모리 대역폭 | 실용 LLM 크기 상한 |
|---|---|---|---|
| Mac Studio M4 Max (128 GB) | 128 GB | ~546 GB/s | 70B Q4~Q6 / MoE 122B active-10B |
| Mac Studio M4 Ultra (192 GB) | 192 GB | ~800 GB/s | 70B Q8 / MoE 397B active-17B (Q3) |
| Mac Studio M3 Ultra (192 GB) | 192 GB | 800 GB/s | 동상 |
런타임 환경 (2026 기준):
| 프레임워크 | 특징 | 권장 용도 |
|---|---|---|
| Ollama 0.19+ | MLX 백엔드 도입, OpenAI 호환 API, Metal 가속 | 운영 환경 기본 |
| llama.cpp server | Metal 백엔드, GGUF 표준, 저수준 튜닝 가능 | 고성능 튜닝 |
| mlx-lm | Apple 자체 프레임워크, 최저 레이턴시 | 실험·프로토타이핑 |
| MLC-LLM | TVM 커널, 긴 컨텍스트(64K~128K) 처리 유리 | 긴 컨텍스트 필요 시 |
MoE(Mixture of Experts) 모델 이해: MoE 모델의 메모리 점유는 총 파라미터(total) 기준이지만, 실제 연산(decode 속도)은 활성 파라미터(active per token) 기준이다. 예를 들어 Qwen3.6-35B-A3B는 Q4 기준 ~20 GB를 점유하지만 decode 속도는 3B dense 모델 수준으로 빠르다. 이 특성이 MoE를 로컬 배포에서 매력적으로 만드는 핵심 이유다.
| 모델 | 기관 | Q4 파일 크기 | 주요 벤치마크 | 한국어 | 도구 호출 | 특징 |
|---|---|---|---|---|---|---|
| Qwen3-8B | Alibaba | ~5 GB | MMLU-Pro ~73.8 est | ✅ 119개 언어 | ✅ | thinking mode 지원, Apache 2.0 |
| Qwen3-14B | Alibaba | ~10 GB | Qwen2.5-32B 동급 | ✅ 119개 언어 | ✅ | 14B 크기로 32B급 성능, Apache 2.0 |
| Phi-4 14B | Microsoft | ~8.5 GB | MMLU 84.8, MATH 80.4% | ✅ | 수학·과학 특화, 영어 중심 | |
| Phi-4-reasoning-plus 14B | Microsoft | ~8.5 GB | MATH 80%+ (GPT-4o-mini 초과) | ✅ | R1 스타일 CoT 파인튜닝, MIT | |
| DeepSeek-R1-Distill-Qwen-14B | DeepSeek | ~8.5 GB | MATH-500 ~93%+ | 중간 | R1 671B 증류, 추론 특화, MIT | |
| DeepSeek-R1-0528-Qwen3-8B | DeepSeek | ~5 GB | AIME 2024 Qwen3-8B 대비 +10% | 중간 | 최신 R1 증류, 수학·코딩 강점 |
이 범위의 포지션: Claude API 가용 상황에서도 latency 우선 단순 분류 작업(zone 진입 의도 파악, 태블릿 인텐트 단순 분기)에 투입 가능. 응답 시간 ≤1초.
| 모델 | 기관 | 아키텍처 | Q4 파일 크기 | 주요 벤치마크 | 한국어 | 도구 호출 | 특징 |
|---|---|---|---|---|---|---|---|
| Mistral Small 3.2 24B | Mistral AI | Dense | ~14 GB | MMLU 80.5, HumanEval+ 92.9%, Arena Hard v2 43.1 | 중간 | ✅✅ | agentic 파이프라인 함수 호출 특화, Apache 2.0 |
| Gemma 3 27B | Dense | ~16 GB | IFEval 90.4%, MATH 89.0%, HumanEval 87.8%, MMLU-Pro 67.5, LMArena ELO 1338 | ✅ 멀티링구얼 | ✅ | 멀티모달(텍스트+이미지), 70B·405B 초과 ELO, Apache 2.0 | |
| Qwen3-32B | Alibaba | Dense | ~20 GB | Qwen2.5-72B 동급, MMLU-Pro 65.54 | ✅ 119개 언어 | ✅ | thinking mode, 32B로 72B급 성능, Apache 2.0 |
| Qwen3-30B-A3B | Alibaba | MoE (30B/3B active) | ~19 GB | — | ✅ | ✅ | decode 속도 3B 수준, Apache 2.0 |
| Qwen3.6-35B-A3B ⭐ | Alibaba | MoE (35B/3B active) | ~20 GB | SWE-bench Verified 73.4%, AIME 2026 92.6%, GPQA Diamond 86.0% | ✅ | ✅✅ | agentic 코딩 특화 설계, decode ~44 tok/s (M4 Max), Apache 2.0 |
| Gemma 4 26B-A4B | MoE (26B/3.8B active) | ~15 GB | — | ✅ | ✅ | 멀티모달, 256K 컨텍스트, Apache 2.0 |
⭐ Qwen3.6-35B-A3B 주목 이유: Gated DeltaNet 선형 어텐션 + 256 전문가 아키텍처로 ~20 GB 파일에서 AIME 2026 92.6%라는 70B 초과 추론 성능을 달성한다. MoE 구조상 decode 속도가 3B dense 수준이라 응답 속도와 품질이 동시에 우수한 희귀한 사례.
| 모델 | 기관 | Q4 파일 크기 | 주요 벤치마크 | 한국어 | 도구 호출 | 특징 |
|---|---|---|---|---|---|---|
| Llama 3.3 70B Instruct | Meta | ~40 GB | MMLU 86.0% (GPT-4o 85.9% 초과), IFEval 92.1% (405B 88.6% 초과), 함수 호출 84.8% | ✅ (번역본 약학 1위) | ✅✅ | instruction following 최강, 커뮤니티 라이선스 |
| Qwen2.5-72B-Instruct | Alibaba | ~48 GB | MMLU 85+, MATH 80+, MMLU-redux에서 405B 초과 | ✅✅ (원문 약학 1위) | ✅ | 한국어 원문 오픈소스 1위, Apache 2.0 |
| DeepSeek-R1-Distill-Llama-70B | DeepSeek | ~43 GB | MATH-500 94.5%, AIME 2024 86.7% (R1 671B 79.8% 초과!), LiveCodeBench 57.5% | 중간 | 증류 모델이 teacher 초과한 사례, 추론·수학 최강, MIT | |
| Qwen3 72B | Alibaba | ~45 GB | 72B 최상위 전반 벤치마크 | ✅✅ | ✅ | thinking mode, 최신 세대, Apache 2.0 |
192GB 장비에서 속도 (70B Q4 기준): ~12–20 tok/s (M4 Ultra)
| 모델 | 기관 | 아키텍처 | Q4 파일 크기 | 주요 벤치마크 | 한국어 | 도구 호출 | 특징 |
|---|---|---|---|---|---|---|---|
| Llama 4 Scout | Meta | MoE (109B/17B active, 16전문가) | ~58 GB | MMLU-Pro 74.3%, GPQA Diamond 57.2%, LMArena ELO 1417 (GPT-4o·Gemini 초과) | ✅ | ✅ | 10M 토큰 컨텍스트 (업계 최장), 멀티모달, Llama 4 커뮤니티 라이선스 |
| Qwen3.5-122B-A10B ⭐ | Alibaba | MoE (122B/10B active) | ~74 GB | MMLU-Pro 86.1%, GPQA Diamond 85.5%, SWE-bench Verified 72.4%, BFCL-V4 도구 호출 72.2% (GPT-5 mini 55.5% 압도) | ✅ | ✅✅✅ | 도구 호출 벤치마크 오픈소스 1위, 192GB에서 ~35 tok/s, Apache 2.0 |
⭐ Qwen3.5-122B-A10B 주목 이유: BFCL-V4(Berkeley Function Calling Leaderboard v4) 도구 호출 72.2%는 GPT-5 mini(55.5%)를 30% 이상 압도한다. MCP tool dispatch가 핵심인 이 프로젝트에서 가장 유력한 단일 로컬 모델 후보다. 192GB에서 active 10B 연산 기준으로 ~35 tok/s 확보.
| 모델 | 기관 | 아키텍처 | 파일 크기 | 주요 벤치마크 | 비고 |
|---|---|---|---|---|---|
| DeepSeek V4-Flash | DeepSeek | MoE (284B/13B active) | ~158 GB (Q4) | V4-Pro 수준 코딩·추론, 1M 컨텍스트 | 192GB에서 Q4 실행 가능, MIT |
| Qwen3.5-397B-A17B | Alibaba | MoE (397B/17B active) | ~214 GB (Q4) / ~192 GB (Q3) | GPQA Diamond 88.4, AIME 2026 91.3, LiveCodeBench 83.6 | Q3 Unsloth UD-Q3_K_XL으로 192GB 경계선 적재 가능. ~5.5 tok/s (Q3) — 실시간 용도 한계 |
주의: Qwen3.5-397B-A17B Q3는 원본 대비 정확도 손실이 Q4 대비 크다. Unsloth가 원본 대비 1점 이내를 보장하지만, 도구 호출 신뢰성을 실환경에서 검증해야 한다.
| 모델 | 기관 | LMArena ELO | 로컬 조건 | 비고 |
|---|---|---|---|---|
| Kimi K2.6 | Moonshot AI | 1456 | 350 GB+ RAM 필요 | 오픈소스 ELO 최상위 (2026-05 기준) |
| Kimi K2.5 Thinking | Moonshot AI | 1445 | 240 GB+ (ultra quant) | — |
| GLM-5.1 | Z.AI | 1469 | API 전용 | 오픈 웨이트 미공개 |
| DeepSeek R1-0528 (671B full) | DeepSeek | — | H200×4 이상 | 증류 버전(8B~70B)이 현실적 대안 |
이 프로젝트는 한국어 operator UI와 한국어 zone 플레이북이 핵심이다.
| 순위 | 모델 | 한국어 특화 수준 | 근거 |
|---|---|---|---|
| 1 | Qwen 시리즈 (2.5/3/3.5) | 최상 | 한국어 약학 시험 원문 기준 오픈소스 1위 (Qwen2.5-72B 76.6점), 119개 언어 명시 학습 |
| 2 | Llama 3.x 시리즈 | 높음 | 한국어 약학 시험 영어 번역본 기준 오픈소스 1위 (79.3점), IFEval 92.1% |
| 3 | Gemma 3/4 시리즈 | 높음 | 멀티링구얼 학습, 커뮤니티 평가 양호, 구체적 벤치마크 미공개 |
| 4 | Mistral Small 3.x | 중간 | 다국어 지원이나 한국어 특화 벤치마크 없음 |
| 5 | Phi-4 계열 | 제한적 | 영어·수학 특화 설계 |
| 6 | DeepSeek R1 Distill | 중간 | 추론 특화, 한국어 instruction following은 보통 |
MCP tool dispatch, JSON 구조화 출력, 다단계 계획 수립 기준 정렬.
| 순위 | 모델 | 도구 호출 지표 | 이유 |
|---|---|---|---|
| 1 | Qwen3.5-122B-A10B | BFCL-V4 72.2% | 오픈소스 도구 호출 벤치마크 압도적 1위 |
| 2 | Qwen3.6-35B-A3B | SWE-bench 73.4% | agentic 코딩 특화 아키텍처, 20GB 초고효율 |
| 3 | Mistral Small 3.2 24B | HumanEval+ 92.9% | 함수 호출 포맷 정제, agentic 파이프라인 검증됨 |
| 4 | Llama 3.3 70B | 함수 호출 84.8%, IFEval 92.1% | instruction following 최고 수준, 폭넓은 커뮤니티 지원 |
| 5 | Qwen3-32B / Qwen3 72B | — | 한국어 + 도구 호출 균형 |
**주의: DeepSeek R1 계열(증류 포함)**은 수학·추론 벤치마크는 탁월하지만, 긴 Chain-of-Thought 추론 체인으로 레이턴시가 높고 structured JSON 출력에 별도 파싱 처리가 필요하다. 실시간 MCP 도구 호출용으로는 적합하지 않다.
Claude Opus API와 로컬 LLM을 태스크 특성에 따라 동적으로 선택한다.
도입 목적:
| 목적 | 설명 |
|---|---|
| 비용 절감 | 낮은 복잡도 요청의 60–80%를 로컬로 처리 → API 호출 비용 대폭 절감 |
| 지연 단축 | 로컬 모델은 TTFT(Time To First Token) 0.3–0.5초, Claude API 1–3초 |
| 오프라인 가용성 | 네트워크 장애 시 고복잡도 분기도 로컬 LLM으로 degraded 처리 |
1차 기준: complexity — 낮은 복잡도는 API 가용 여부와 무관하게 항상 로컬로 처리한다. API는 복잡도가 높을 때만 투입되며, API 가용 여부는 그 안에서 fallback 조건으로만 작동한다.
| complexity 점수 | 기본 경로 | 설명 |
|---|---|---|
| 0 (단순) | LOCAL_FAST | 단일 zone 단순 동작, 루틴 판단 |
| 1–2 (중간) | LOCAL_BEST | 조건 복합이나 API 투입 수준 아님 |
| 3+ (복잡) | Claude API → fallback | 다중 tool chain, 이상 상황: API 우선, 불가 시 LOCAL_BEST |
2차 기준 (복잡도 3+ 한정): safety_level + API 가용 여부
| safety_level | API 가용 | 선택 모델 |
|---|---|---|
| high | YES | OPUS |
| high | NO | LOCAL_BEST (degraded) |
| medium / low | YES | SONNET |
| medium / low | NO | LOCAL_BEST (degraded) |
# orchestrator/router.py (illustrative spec)
from enum import Enum
class ModelTier(Enum):
LOCAL_FAST = "local_fast" # Qwen3.6-35B-A3B — 단순 루틴 판단
LOCAL_BEST = "local_best" # Qwen3.5-122B-A10B — 로컬 최고 품질 / API fallback
SONNET = "sonnet" # claude-sonnet-4-6
OPUS = "opus" # claude-opus-4-7
def select_model(event: ZoneEvent, ctx: SessionContext) -> ModelTier:
complexity = estimate_complexity(event, ctx)
# 낮은 복잡도 → 항상 로컬 (API 상태 무관)
if complexity == 0:
return ModelTier.LOCAL_FAST
if complexity <= 2:
return ModelTier.LOCAL_BEST
# 높은 복잡도 → Claude API, 불가 시 LOCAL_BEST로 degraded 처리
zone = ctx.zone_registry[event.zone_id]
target = ModelTier.OPUS if zone.safety_level == "high" else ModelTier.SONNET
return target if ctx.api_reachable else ModelTier.LOCAL_BEST
def estimate_complexity(event: ZoneEvent, ctx: SessionContext) -> int:
score = 0
score += len(event.overlapping_zones) # 교차 zone 수
score += len(ctx.pending_tool_calls) # 미완료 tool call 수
score += (1 if ctx.active_sessions > 3 else 0) # 동시 세션 과부하
return scoreMQTT vision/zone/enter
│
▼
estimate_complexity()
│
┌─────┼──────────────┐
0 1–2 3+
│ │ │
LOCAL LOCAL API 가용?
FAST BEST ┌────┴────┐
YES NO
│ │
safety_level? LOCAL
┌──────┴──────┐ BEST
HIGH MED/LOW (degraded)
│ │
OPUS SONNET
│ (어느 경로든)
▼
[가드레일 공통 경로 — 모델 티어 무관]
JSON schema 검증 → capability whitelist
→ zone polygon clamp → velocity clamp
│
▼
MCP tool dispatch
(mcp-robot-adapter / mcp-ha-bridge / mcp-tablet-gateway)
⚠️ 가드레일 4단계는 모델 티어와 무관하게 항상 실행된다. LOCAL 모델 출력이 가드레일을 통과하지 못하면 명령은 폐기되고 Prometheus 카운터가 증가하며, HA 룰 기반 fallback이 활성화된다.
# illustrative: 라우팅 결과 기록
router_decision_counter.labels(
tier=selected_tier.value, # local_fast / local_best / sonnet / opus
zone_safety=zone.safety_level, # low / medium / high
complexity_band=complexity_band, # simple(0) / medium(1-2) / high(3+)
degraded=str(not ctx.api_reachable and complexity >= 3),
).inc()현재 orchestrator는 anthropic SDK를 직접 사용한다. 로컬 LLM 연동 시 두 가지 경로가 있다.
경로 A: OpenAI 호환 래퍼 (권장)
Ollama가 /v1/chat/completions를 노출하므로 openai SDK로 동일하게 호출한다. LangGraph 그래프 노드에서 provider를 추상화하면 설정값 변경만으로 Claude API ↔ 로컬 LLM을 전환할 수 있다.
# illustrative: provider 추상화 (LangGraph 노드)
def make_llm_client(tier: ModelTier):
match tier:
case ModelTier.LOCAL_FAST:
from openai import AsyncOpenAI
return AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="ollama"), \
"qwen3.6:35b-a3b"
case ModelTier.LOCAL_BEST:
from openai import AsyncOpenAI
return AsyncOpenAI(base_url="http://localhost:11434/v1", api_key="ollama"), \
"qwen3.5:122b-a10b"
case ModelTier.SONNET:
import anthropic
return anthropic.AsyncAnthropic(), "claude-sonnet-4-6"
case ModelTier.OPUS:
import anthropic
return anthropic.AsyncAnthropic(), "claude-opus-4-7"경로 B: LiteLLM 통합 레이어
litellm.completion("ollama/qwen3.5:122b-a10b", ...) 형태로 단일 인터페이스 유지. 프레임워크 종속성이 늘어나는 단점이 있으나, 로깅·비용 추적·fallback 로직을 한 곳에서 관리할 수 있다.
현재 설계는 시스템 프롬프트 + zone 플레이북이 안정적이므로 Anthropic 프롬프트 캐싱을 사용한다 (SYSTEM_DESIGN §15). 로컬 LLM 경로에서 주의할 점:
- 로컬 LLM에는 Anthropic 프롬프트 캐싱이 없다. 시스템 프롬프트 토큰이 매 호출마다 처리된다. 프롬프트를 간결하게 유지하는 것이 중요하다.
- Ollama의
keep_alive옵션으로 KV cache를 메모리에 보존하면 연속 호출 시 일부 재사용 효과를 얻을 수 있다. - Claude API 경로에서는 기존과 동일하게
cache_control: ephemeral블록을 시스템 프롬프트 끝에 붙인다.
SYSTEM_DESIGN §15에서 Opus vs Sonnet 결정이 미결로 남아 있다. 이 문서에서 제안하는 하이브리드 라우팅은 그 결정을 "태스크 특성에 따라 네 티어 중 하나" 로 재프레이밍한다. §15에 다음 항목을 추가해야 한다:
- 로컬 LLM 가드레일 거부율 허용 임계값 합의 (초기 제안: 5% 이상 시 자동으로 상위 tier 재시도)
-
COMPLEXITY_THRESHOLD초기값 확정 (현재: high ≥ 3, low ≥ 1) - LOCAL_FAST vs LOCAL_BEST 분기 기준 확정
- Mac Studio 장비 운영 주체 및 네트워크 배치 (온사이트 상시 가동 전제)
- 라이선스 검토: Llama 4 Scout은 커뮤니티 라이선스로 월간 활성 사용자 수 제한이 있을 수 있음
| 항목 | 권고 |
|---|---|
| 하드웨어 | Mac Studio M4 Ultra (192 GB) — Qwen3.5-122B Q4 (~74 GB) + Qwen3.6-35B Q4 (~20 GB) 동시 적재 가능 |
| LOCAL_FAST (루틴 판단) | Qwen3.6-35B-A3B Q4_K_M — agentic 특화 MoE, decode 44 tok/s, 20 GB |
| LOCAL_BEST (복잡 로컬) | Qwen3.5-122B-A10B Q4_K_M — 도구 호출 오픈소스 1위, 35 tok/s, 74 GB |
| 한국어 최우선 | Qwen2.5-72B-Instruct 또는 Qwen3 72B — 한국어 원문 벤치마크 1위 계열 |
| 추론·수학 보조 | DeepSeek-R1-Distill-Llama-70B — MATH-500 94.5%, 단 JSON 출력 별도 처리 필요 |
| 192GB 풀 활용 실험 | Qwen3.5-397B-A17B Q3 — frontier급 성능, 5.5 tok/s 수용 시나리오 한정 |
| 실행 프레임워크 | Ollama 0.19+ (MLX 백엔드, Metal 가속, OpenAI 호환 API) |
| Claude Opus 동등성 | 불가 — 로컬 모델은 복합 추론·고안전 판단에서 여전히 격차. 가드레일 4단계로 보완 |
| 즉시 적용 여부 | 미결 — §15 결정 후 propagation 필요 |