LOCAL_LLM_HYBRID_ROUTING - zero1ne-26/doc GitHub Wiki
Mac Studio ๋ก์ปฌ LLM + Claude Opus ํ์ด๋ธ๋ฆฌ๋ ๋ผ์ฐํ ์ ๋ต โ ๋ ผ์ ์๋ฃ
โ ๏ธ ์ด ๋ฌธ์๋ ๋ ผ์ยท๊ฒํ ์ฉ ์๋ฃ์ ๋๋ค. ํ์ฌ ์ค๊ณ ๊ฒฐ์ ์ ๋ฐ์๋ ๋ด์ฉ์ด ์๋๋ฉฐ, 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, ๊ฐ ๊ธฐ๊ด ๊ธฐ์ ๋ณด๊ณ ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ณด๊ตฐ์ ์ ๋ฆฌํ๋ค.
1. Mac Studio ํ๋์จ์ด ์ญ๋
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๋ฅผ ๋ก์ปฌ ๋ฐฐํฌ์์ ๋งค๋ ฅ์ ์ผ๋ก ๋ง๋๋ ํต์ฌ ์ด์ ๋ค.
2. ๋ก์ปฌ LLM ํ๋ณด ๋ชฉ๋ก
2-A. 7Bโ14B ๋ฒ์ โ ๋น ๋ฅธ ์ถ๋ก , ๋จ์ยท๋ฃจํด ํ๋จ ์ ์ฉ
| ๋ชจ๋ธ | ๊ธฐ๊ด | 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์ด.
2-B. 24Bโ35B ๋ฒ์ โ ์ค๊ฐ ๊ท ํ: ํ์ง๊ณผ ์๋์ ๊ต์ฐจ์
| ๋ชจ๋ธ | ๊ธฐ๊ด | ์ํคํ ์ฒ | 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 ์์ค์ด๋ผ ์๋ต ์๋์ ํ์ง์ด ๋์์ ์ฐ์ํ ํฌ๊ทํ ์ฌ๋ก.
2-C. 70Bโ72B ๋ฒ์ โ ๋ก์ปฌ ์คํ ๊ฐ๋ฅํ ์ต๊ณ ํ์ง 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)
2-D. 109Bโ123B ๋ฒ์ โ 192GB Ultra์์ MoE ํ์ฉ
| ๋ชจ๋ธ | ๊ธฐ๊ด | ์ํคํ ์ฒ | 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 ํ๋ณด.
2-E. 192GB ๊ฒฝ๊ณ์ MoE โ ์ต๋ ํ์ฉ ํ๋ณด
| ๋ชจ๋ธ | ๊ธฐ๊ด | ์ํคํ ์ฒ | ํ์ผ ํฌ๊ธฐ | ์ฃผ์ ๋ฒค์น๋งํฌ | ๋น๊ณ |
|---|---|---|---|---|---|
| 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์ ์ด๋ด๋ฅผ ๋ณด์ฅํ์ง๋ง, ๋๊ตฌ ํธ์ถ ์ ๋ขฐ์ฑ์ ์คํ๊ฒฝ์์ ๊ฒ์ฆํด์ผ ํ๋ค.
2-F. ํ์ฌ ๋ก์ปฌ ๋ถ๊ฐ โ ์ฐธ๊ณ ์ฉ Frontier ๋ชจ๋ธ
| ๋ชจ๋ธ | ๊ธฐ๊ด | 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)์ด ํ์ค์ ๋์ |
3. ํ๊ตญ์ด ์ฑ๋ฅ ๋น๊ต
์ด ํ๋ก์ ํธ๋ ํ๊ตญ์ด 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์ ๋ณดํต |
4. ์์ด์ ํฑ(Agentic) ์ํฌํ๋ก ์ ํฉ์ฑ ์์
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 ๋๊ตฌ ํธ์ถ์ฉ์ผ๋ก๋ ์ ํฉํ์ง ์๋ค.
5. ํ์ด๋ธ๋ฆฌ๋ ๋ผ์ฐํ ์ ๋ต
Claude Opus API์ ๋ก์ปฌ LLM์ ํ์คํฌ ํน์ฑ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ ํํ๋ค.
๋์ ๋ชฉ์ :
| ๋ชฉ์ | ์ค๋ช |
|---|---|
| ๋น์ฉ ์ ๊ฐ | ๋ฎ์ ๋ณต์ก๋ ์์ฒญ์ 60โ80%๋ฅผ ๋ก์ปฌ๋ก ์ฒ๋ฆฌ โ API ํธ์ถ ๋น์ฉ ๋ํญ ์ ๊ฐ |
| ์ง์ฐ ๋จ์ถ | ๋ก์ปฌ ๋ชจ๋ธ์ TTFT(Time To First Token) 0.3โ0.5์ด, Claude API 1โ3์ด |
5.1 ๋ผ์ฐํ ๊ฒฐ์ ๊ธฐ์ค
complexity๋ฅผ ์ ์ผํ 1์ฐจ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ๋ค. Claude API๋ ์์ ๊ฐ์ฉ ์ํ๋ก ๊ฐ์ ํ๋ฏ๋ก ๊ฐ์ฉ ์ฌ๋ถ ์ฒดํฌ๋ ์๋ค.
| complexity ์ ์ | ์ ํ ๋ชจ๋ธ | ์ค๋ช |
|---|---|---|
| 0 (๋จ์) | LOCAL_FAST | ๋จ์ผ zone ๋จ์ ๋์, ๋ฃจํด ํ๋จ |
| 1โ2 (์ค๊ฐ) | LOCAL_BEST | ์กฐ๊ฑด ๋ณตํฉ์ด๋ Claude API ํฌ์ ์์ค ์๋ |
| 3+ (๋ณต์ก) + safety high | OPUS | ๋ค์ค tool chain, ๊ตฐ์ค ์ ๊ทผ, e-stop ํ๋จ |
| 3+ (๋ณต์ก) + safety medium/low | SONNET | ๋ค์ค ์กฐ๊ฑด์ด๋ ๊ณ ์ํ ์๋ ๊ฒฝ์ฐ |
5.2 ๋ชจ๋ธ ์ ํ ๋ก์ง (์์ฌ ์ฝ๋)
# 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 โ ๋ก์ปฌ ์ต๊ณ ํ์ง
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)
if complexity == 0:
return ModelTier.LOCAL_FAST
if complexity <= 2:
return ModelTier.LOCAL_BEST
zone = ctx.zone_registry[event.zone_id]
return ModelTier.OPUS if zone.safety_level == "high" else ModelTier.SONNET
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 score
5.3 ๋ผ์ฐํ ํ๋ฆ๋
MQTT vision/zone/enter
โ
โผ
estimate_complexity()
โ
โโโโโโโผโโโโโโโโโโโโโโโ
0 1โ2 3+
โ โ โ
LOCAL LOCAL safety_level?
FAST BEST โโโโโโโโโโดโโโโโโโโโ
HIGH MED / LOW
โ โ
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์ด ํ์ฑํ๋๋ค.
5.4 ๋ผ์ฐํ ๋ฉํธ๋ฆญ ์ถ์
# 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+)
).inc()
6. Claude SDK ์ฐ๋ ๋ฐฉ์
ํ์ฌ 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 ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์๋ค.
7. ํ๋กฌํํธ ์บ์ฑ ๊ณ ๋ ค์ฌํญ
ํ์ฌ ์ค๊ณ๋ ์์คํ ํ๋กฌํํธ + zone ํ๋ ์ด๋ถ์ด ์์ ์ ์ด๋ฏ๋ก Anthropic ํ๋กฌํํธ ์บ์ฑ์ ์ฌ์ฉํ๋ค (SYSTEM_DESIGN ยง15). ๋ก์ปฌ LLM ๊ฒฝ๋ก์์ ์ฃผ์ํ ์ :
- ๋ก์ปฌ LLM์๋ Anthropic ํ๋กฌํํธ ์บ์ฑ์ด ์๋ค. ์์คํ ํ๋กฌํํธ ํ ํฐ์ด ๋งค ํธ์ถ๋ง๋ค ์ฒ๋ฆฌ๋๋ค. ํ๋กฌํํธ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค.
- Ollama์
keep_alive์ต์ ์ผ๋ก KV cache๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด์กดํ๋ฉด ์ฐ์ ํธ์ถ ์ ์ผ๋ถ ์ฌ์ฌ์ฉ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. - Claude API ๊ฒฝ๋ก์์๋ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ
cache_control: ephemeral๋ธ๋ก์ ์์คํ ํ๋กฌํํธ ๋์ ๋ถ์ธ๋ค.
8. ๋ฏธ๊ฒฐ ์ด์์์ ์ฐ๊ด
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์ ์ปค๋ฎค๋ํฐ ๋ผ์ด์ ์ค๋ก ์๊ฐ ํ์ฑ ์ฌ์ฉ์ ์ ์ ํ์ด ์์ ์ ์์
9. ๊ฒฐ๋ก ๋ฐ ๊ถ๊ณ
| ํญ๋ชฉ | ๊ถ๊ณ |
|---|---|
| ํ๋์จ์ด | 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 ํ์ |