-
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
ํ์ฌ orchestrator๋ Anthropic Claude SDK๋ฅผ ํตํด claude-opus-4-7 ๋๋ claude-sonnet-4-6์ ํธ์ถํ๋ค (SYSTEM_DESIGN ยง15, OSS_INTEGRATION ยง3.3). "Mac Studio ์ฅ๋น๊ฐ ํ๋ณด๋์ด ์๋ค๋ฉด ๋ก์ปฌ LLM์ ๋์
ํด ๋น์ฉยท์ง์ฐยท์คํ๋ผ์ธ ๊ฐ์ฉ์ฑ์ ๊ฐ์ ํ ์ ์๋๊ฐ"๋ฅผ ๊ฒํ ํ ๋ฉ๋ชจ.
Apple Silicon์ ํตํฉ ๋ฉ๋ชจ๋ฆฌ(Unified Memory) ๋ CPU์ GPU/Neural Engine์ด ๋์ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฏ๋ก, LLM ์ถ๋ก ์ VRAM ๋ณ๋ชฉ ์์ด ์ ์ฒด RAM์ ๋ชจ๋ธ ๊ฐ์ค์น์ ํ์ฉํ ์ ์๋ค. ์ด๊ฒ์ด ๋๊ธ ๊ฐ๊ฒฉ๋ Windows ์ํฌ์คํ ์ด์ ๋๋น ๋ก์ปฌ LLM ์ด์์์ ๊ฐ์ฅ ํฐ ์ด์ ์ด๋ค.
| ์ฅ๋น | ํตํฉ ๋ฉ๋ชจ๋ฆฌ | ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ | ์ค์ฉ LLM ํฌ๊ธฐ ์ํ |
|---|---|---|---|
| Mac Studio M4 Max (128 GB) | 128 GB | ~546 GB/s | 70B Q4~Q6, 32B Q8 |
| Mac Studio M4 Ultra (192 GB) | 192 GB | ~800 GB/s | 70B Q8, ~120B Q4 |
| Mac Studio M3 Ultra (192 GB) | 192 GB | 800 GB/s | ๋์ |
| Mac Studio M2 Ultra (192 GB) | 192 GB | 800 GB/s | ๋์ |
ํต์ฌ ์ ์ฝ โ Llama 3.1 405B ๋ถ๊ฐ: 4-bit ์์ํ(Q4_K_M) ๊ธฐ์ค์ผ๋ก๋ 405B ๋ชจ๋ธ์ ~230 GB๊ฐ ํ์ํ๋ค. 192 GB ์ฅ๋น์์ ์์ ์ธ๋ฉ๋ชจ๋ฆฌ ์คํ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ๋์คํฌ ์คํ๋ก๋ ์ ์ถ๋ก ์๋๊ฐ 10โ50๋ฐฐ ์ ํ๋์ด ์ค์๊ฐ ๋ก๋ณดํฑ์ค ์ฉ๋์ ๋ถ์ ํฉํ๋ค.
| ๋ชจ๋ธ | ํ๋ผ๋ฏธํฐ | Q4_K_M ํ์ผ ํฌ๊ธฐ | ๊ถ์ฅ ์ฅ๋น | ์ฃผ์ ํน์ง |
|---|---|---|---|---|
| Qwen3 72B | 72B | ~45 GB | M4 Max 128 GBโ | 2025๋ ์ต์ , ์ถ๋ก ยทํ๊ตญ์ด ์ฐ์, thinking mode ์ง์ |
| Llama 3.3 70B | 70B | ~42 GB | M4 Max 128 GBโ | Meta ์ต์ 70B, instruction following ์์ ์ |
| Qwen 2.5 72B | 72B | ~45 GB | M4 Max 128 GBโ | ๊ตฌ์กฐํ ์ถ๋ ฅยท์ฝ๋ฉ ๊ฐ์ , JSON ์คํค๋ง ์ค์ ๋์ |
| DeepSeek R1 Distill 70B | 70B | ~42 GB | M4 Max 128 GBโ | Chain-of-Thought ์ถ๋ก ํนํ, ๋ณต์กํ ๊ณํ ์๋ฆฝ |
| Mistral Large 2 (123B) | 123B | ~75 GB | M4 Ultra 192 GBโ | 70B๊ธ ๋๋น ํ์ง ํฅ์, Ultra ์ ์ฉ |
| ๋ชจ๋ธ | ์ฅ๋น | ์์ฑ ์๋ | 100 ํ ํฐ ์๋ต ์๊ฐ |
|---|---|---|---|
| 70B Q4_K_M | M4 Ultra 192 GB | ~40โ50 tok/s | ~2โ2.5์ด |
| 70B Q4_K_M | M4 Max 128 GB | ~28โ38 tok/s | ~3โ4์ด |
| 70B Q8 | M4 Ultra 192 GB | ~22โ30 tok/s | ~4โ5์ด |
| 123B Q4_K_M | M4 Ultra 192 GB | ~18โ25 tok/s | ~5โ6์ด |
ํ์ฌ ์ค๊ณ์์ vision/zone/enter โ orchestrator ๊ฒฐ์ โ MCP tool dispatch ๋ฃจํ์ ํ์ฉ ์ง์ฐ์ ๋ช
์๋์ด ์์ง ์๋ค. ๊ทธ๋ฌ๋ ๋ก๋ด ๋ฌผ๋ฆฌ ๋์ ๊ฐ์ ์ ๊น์ง 3โ5์ด๋ ๋๋ถ๋ถ์ ์ํธ์์ฉ ์๋๋ฆฌ์ค์์ ์์ฉ ๊ฐ๋ฅํ ๋ฒ์๋ค. ๊ธด๊ธ ๊ฒฝ๋ก(e-stop, ์ถฉ๋ ํํผ)๋ HA ๋ฃฐ ๊ธฐ๋ฐ fallback์ด ์ปค๋ฒํ๋ค (OPERATIONS ยงํด๋ฐฑ/e-stop).
Claude Opus 4.7 โโโโโโโโโโโโโโโโโโโโ ๊ธฐ์ค์ (์ถ์ 1T+ ํ๋ผ๋ฏธํฐ)
Qwen3 72B โโโโโโโโโโโโโโโโโโโโ ๊ตฌ์กฐํ ํ์คํฌยท์ถ๋ก ~70%
Llama 3.3 70B โโโโโโโโโโโโโโโโโโโโ instruction following ~65%
Claude Sonnet 4.6 โโโโโโโโโโโโโโโโโโโโ ~80% (API ๋น์ฉ ์ ๊ฐ ๊ฒฝ๋ก)
์์งํ ํ๊ฐ: 70B ๋ก์ปฌ ๋ชจ๋ธ์ Opus์ ๋ฉํฐ์คํ ์ถ๋ก ยท์์ critical ํ๋จ ์์ค์ ๋๋ฌํ์ง ๋ชปํ๋ค. ๊ทธ๋ฌ๋ ๋๋ฉ์ธ์ด ์ข๊ณ ๊ฐ๋๋ ์ผ์ด ์ด๋ฏธ MCP ์๋ฒ ์ธก์ ๊ฐ์ ๋์ด ์๋ ์ด ํ๋ก์ ํธ์์๋, JSON schema โ capability whitelist โ zone polygon clamp โ velocity clamp 4๋จ๊ณ๊ฐ ๋ชจ๋ธ ์ถ๋ ฅ์ ๊ฒ์ฆํ๋ฏ๋ก ๋จ์ยท๋ฃจํด ๊ฒฐ์ ์๋ 70B๊ฐ ์ค์ฉ์ ์ด๋ค.
| ํ๋ ์์ํฌ | ํน์ง | ์ด ํ๋ก์ ํธ ์ ํฉ๋ |
|---|---|---|
| Ollama | OpenAI ํธํ API, Metal ๊ฐ์, ๋ชจ๋ธ ๋ฒ์ ๊ด๋ฆฌ ์ฉ์ด | โ โ โ โ โ |
| llama.cpp server | ์ ์์ค, ์ต๊ณ ์ฑ๋ฅ, ์ค์ ๋ณต์ก | โ โ โ โ โ |
| MLX-LM | Apple Silicon ์ต์ ํ, Python native, Apple ๊ณต์ ์ง์ | โ โ โ โ โ |
| LM Studio | GUI, ํ์ยทํ๋กํ ํ์ดํ ์ ์ฉ | โ โ โ โโ |
๊ถ์ฅ: Ollama. /v1/chat/completions OpenAI ํธํ ์๋ํฌ์ธํธ๋ฅผ ๊ทธ๋๋ก ๋
ธ์ถํ๋ฏ๋ก orchestrator ์ฝ๋๋ฅผ ๊ฑฐ์ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์ฐ๋ ๊ฐ๋ฅํ๋ค. Metal ๊ฐ์์ด ์๋์ผ๋ก ์ ์ฉ๋๋ฉฐ, ollama pull qwen3:72b ํ ์ค๋ก ๋ชจ๋ธ์ ๋ด๋ ค๋ฐ์ ์ฆ์ ์๋นํ ์ ์๋ค.
Claude Opus API์ ๋ก์ปฌ LLM์ ํ์คํฌ ํน์ฑ์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ ํํ๋ค. ๋จ์ผ ๋ชจ๋ธ ๊ณ ์ ๋๋น ์ฅ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋น์ฉ: ๋ฃจํด ๊ฒฐ์ ์ 80%๋ฅผ ๋ก์ปฌ๋ก ์ฒ๋ฆฌ โ API ํธ์ถ ๋น์ฉ ๋ํญ ์ ๊ฐ
- ์ง์ฐ: ๋ก์ปฌ 70B๋ ์ฒซ ํ ํฐ๊น์ง 0.3โ0.5์ด๋ก Claude API(1โ3์ด)๋ณด๋ค ๋น ๋ฆ
- ์คํ๋ผ์ธ ๊ฐ์ฉ์ฑ: ๋คํธ์ํฌ ์ฅ์ ์ ๋ก์ปฌ LLM์ผ๋ก graceful degradation
์๋ ์ธ ์ถ์ ์กฐํฉ์ผ๋ก ๋ชจ๋ธ์ ์ ํํ๋ค.
| ์ถ | ๋ก์ปฌ LLM ์ ํ | Claude Opus ์ ํ |
|---|---|---|
| ๋ณต์ก๋ | ๋จ์ผ zone ์ง์ โ ๋จ์ ๋์ 1๊ฐ | ๋ค์ค ์กฐ๊ฑด, ๋ณตํฉ ๊ณํ, ๋ฉํฐ tool chain |
| ์์ ๋ฑ๊ธ |
safety_level: low โ ์ ์ ์์ญ ์ด๋ ๋ฑ |
safety_level: high โ ๊ตฐ์ค ์ ๊ทผ, e-stop ํ๋จ |
| ๋คํธ์ํฌ | ์คํ๋ผ์ธ / API ์๋ต ์ง์ฐ โฅ 2s | ์ ์ ์ฐ๊ฒฐ |
# orchestrator/router.py (illustrative spec)
from enum import Enum
class ModelTier(Enum):
LOCAL = "local" # Ollama ๋ก์ปฌ LLM
SONNET = "sonnet" # claude-sonnet-4-6 (์ค๊ฐ ๋น์ฉ)
OPUS = "opus" # claude-opus-4-7 (์ต๊ณ ํ์ง)
def select_model(event: ZoneEvent, ctx: SessionContext) -> ModelTier:
# 1์์: ๋คํธ์ํฌ ์ํ (์คํ๋ผ์ธ ๊ฐ์ ๋ก์ปฌ)
if not ctx.api_reachable:
return ModelTier.LOCAL
# 2์์: ์์ ๋ฑ๊ธ (safety_level์ zones.yaml์ ์ ์)
zone = ctx.zone_registry[event.zone_id]
if zone.safety_level == "high":
return ModelTier.OPUS # ๊ตฐ์ค ์ ๊ทผ, ํ์ ๊ตฌ์ญ ๋ฑ
# 3์์: ๋ณต์ก๋ ์ ์
complexity = estimate_complexity(event, ctx)
# complexity: ๊ด๋ จ zone ์, ํ์ฑ ์ธ์
์, ๋ณด๋ฅ ์ค tool ์ ํฉ์ฐ
if complexity >= COMPLEXITY_THRESHOLD: # ์ค์ ๊ฐ, ์ด๊ธฐ๊ฐ 3
return ModelTier.OPUS
elif complexity >= SIMPLE_THRESHOLD: # ์ค์ ๊ฐ, ์ด๊ธฐ๊ฐ 1
return ModelTier.SONNET
else:
return ModelTier.LOCAL
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
โ
โผ
[Router.select_model()]
โ
โโโโโโดโโโโโโโโโโโโโโโโโโโโโ
โ โ
API ๋ถ๊ฐ? API ๊ฐ๋ฅ?
โ โ
โผ zone.safety_level?
LOCAL LLM โ โ
(Ollama) HIGH LOW/MED
โ โ
OPUS complexity score
โโโโโโโโผโโโโโโโ
โฅ3 1โ2 0
โ โ โ
OPUS SONNET LOCAL
โ
(Ollama)
โ
โผ
[๊ฐ๋๋ ์ผ ๊ณตํต ๊ฒฝ๋ก]
JSON schema ๊ฒ์ฆ โ capability whitelist
โ zone polygon clamp โ velocity clamp
โ
โผ
MCP tool dispatch (robot-adapter / ha-bridge / tablet-gateway)
โ ๏ธ ๊ฐ๋๋ ์ผ 4๋จ๊ณ๋ ๋ชจ๋ธ ํฐ์ด์ ๋ฌด๊ดํ๊ฒ ํญ์ ์คํ๋๋ค. LOCAL ๋ชจ๋ธ ์ถ๋ ฅ์ด ๊ฐ๋๋ ์ผ์ ํต๊ณผํ์ง ๋ชปํ๋ฉด ๋ช ๋ น์ ํ๊ธฐ๋๊ณ Prometheus ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ๋ค. ์ด ๊ฒฝ์ฐ HA ๋ฃฐ ๊ธฐ๋ฐ fallback์ด ํ์ฑํ๋๋ค.
๋ผ์ฐํ ๊ฒฐ์ ์์ฒด๋ฅผ ๊ฐ์ํํ์ฌ ๋ชจ๋ธ ์ ํ ๋น์จ, ๋ก์ปฌ LLM ๊ฐ๋๋ ์ผ ๊ฑฐ๋ถ์จ์ ์ง์ ๋ชจ๋ํฐ๋งํ๋ค.
# illustrative: ๋ผ์ฐํ
๊ฒฐ๊ณผ ๋ฉํธ๋ฆญ ๊ธฐ๋ก
router_decision_counter.labels(
tier=selected_tier.value,
zone_safety=zone.safety_level,
complexity_band=complexity_band, # "low" / "medium" / "high"
offline=str(not ctx.api_reachable),
).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):
if tier == ModelTier.LOCAL:
from openai import AsyncOpenAI
return AsyncOpenAI(
base_url="http://localhost:11434/v1",
api_key="ollama", # Ollama๋ ์ธ์ฆ ๋ถํ์
), "qwen3:72b"
elif tier == ModelTier.SONNET:
import anthropic
return anthropic.AsyncAnthropic(), "claude-sonnet-4-6"
else:
import anthropic
return anthropic.AsyncAnthropic(), "claude-opus-4-7"๊ฒฝ๋ก B: LiteLLM ํตํฉ ๋ ์ด์ด
litellm.completion("ollama/qwen3:72b", ...) ํํ๋ก ๋จ์ผ ์ธํฐํ์ด์ค๋ฅผ ์ ์ง. ํ๋ ์์ํฌ ์ข
์์ฑ์ด ๋์ด๋๋ ๋จ์ ์ด ์์ผ๋, ๋ก๊น
ยท๋น์ฉ ์ถ์ ยทfallback ๋ก์ง์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์๋ค.
ํ์ฌ ์ค๊ณ๋ ์์คํ ํ๋กฌํํธ + zone ํ๋ ์ด๋ถ์ด ์์ ์ ์ด๋ฏ๋ก Anthropic ํ๋กฌํํธ ์บ์ฑ์ ์ฌ์ฉํ๋ค (SYSTEM_DESIGN ยง15). ๋ก์ปฌ LLM ๋ผ์ฐํ ์ ์ฃผ์ํ ์ :
- ๋ก์ปฌ LLM์๋ ํ๋กฌํํธ ์บ์ฑ์ด ์๋ค. ์์คํ ํ๋กฌํํธ ํ ํฐ์ด ๋งค ํธ์ถ๋ง๋ค ์ฒ๋ฆฌ๋๋ฏ๋ก, ํ๋กฌํํธ๋ฅผ ๊ฐ๊ฒฐํ๊ฒ ์ ์งํ๋ ๊ฒ์ด ๋ก์ปฌ ๊ฒฝ๋ก์์ ์ค์ํ๋ค.
- Ollama๋ ์ปจํ
์คํธ๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ๋ณด์กดํ๋
keep_alive์ต์ ์ ์ง์ํ๋ค. ์ฐ์ ํธ์ถ ์ KV cache ์ฌ์ฌ์ฉ ํจ๊ณผ๋ฅผ ์ป์ ์ ์๋ค. - Claude API ๊ฒฝ๋ก์์๋ ๊ธฐ์กด๊ณผ ๋์ผํ๊ฒ
cache_control: ephemeral๋ธ๋ก์ ์์คํ ํ๋กฌํํธ ๋์ ๋ถ์ธ๋ค.
SYSTEM_DESIGN ยง15์์ Opus vs Sonnet ๊ฒฐ์ ์ด ๋ฏธ๊ฒฐ๋ก ๋จ์ ์๋ค. ์ด ๋ฌธ์์์ ์ ์ํ๋ ํ์ด๋ธ๋ฆฌ๋ ๋ผ์ฐํ ์ ๊ทธ ๊ฒฐ์ ์ "๋ ๋ค, ํ์คํฌ์ ๋ฐ๋ผ" ๋ก ์ฌํ๋ ์ด๋ฐํ๋ค. ์ธ ๋ฒ์งธ ํ๋ณด(๋ก์ปฌ LLM)๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ยง15์ ๋ค์ ํญ๋ชฉ์ ์ถ๊ฐํด์ผ ํ๋ค:
- ๋ก์ปฌ LLM ๊ฐ๋๋ ์ผ ๊ฑฐ๋ถ์จ ํ์ฉ ์๊ณ๊ฐ ํฉ์ (์ด๊ธฐ๊ฐ ์ ์: 5% ์ด์ ์ tier ์ํฅ)
-
COMPLEXITY_THRESHOLD/SIMPLE_THRESHOLD์ด๊ธฐ๊ฐ ํ์ (ํ์ฌ: 3 / 1) - ํ์ด๋ธ๋ฆฌ๋ ๋ชจ๋ ํ์ฑํ ์กฐ๊ฑด (ํญ์ on vs. ์คํ๋ผ์ธ fallback ์ ์ฉ)
- Mac Studio ์ฅ๋น ์ด์ ์ฃผ์ฒด ๋ฐ ๋คํธ์ํฌ ๋ฐฐ์น (์จ์ฌ์ดํธ ์์ ๊ฐ๋ ์ ์ )
| ํญ๋ชฉ | ๊ถ๊ณ |
|---|---|
| ํ๋์จ์ด | Mac Studio M4 Ultra (192 GB) โ 70B Q8 ๋๋ Mistral Large 2 Q4 ์ค์ฉ ๋ฒ์ |
| 1์์ ๋ชจ๋ธ | Qwen3 72B Q4_K_M โ ์ถ๋ก ยทํ๊ตญ์ดยท๊ตฌ์กฐํ ์ถ๋ ฅ ๊ท ํ ์ต์ |
| 2์์ ๋ชจ๋ธ | Llama 3.3 70B Q4_K_M โ instruction following ์์ ์ฑ |
| ์คํ ํ๋ ์์ํฌ | Ollama (Metal ๊ฐ์, OpenAI ํธํ API) |
| ํตํฉ ์ ๋ต | ํ์ด๋ธ๋ฆฌ๋ ๋ผ์ฐํ โ ์์ ๋ฑ๊ธยท๋ณต์ก๋ยท๋คํธ์ํฌ 3์ถ ๊ธฐ์ค |
| Opus ๋๋ฑ์ฑ | ๋ถ๊ฐ โ 70B ๋ก์ปฌ ๋ชจ๋ธ์ ๋ณตํฉ ์ถ๋ก ์์ ์๋ฏธ ์๋ ๊ฒฉ์ฐจ ์กด์ฌ; ๊ฐ๋๋ ์ผ ๋ณด๊ฐ์ผ๋ก ๋ณด์ |
| ์ฆ์ ์ ์ฉ ์ฌ๋ถ | ๋ฏธ๊ฒฐ โ ยง15 ๊ฒฐ์ ํ propagation ํ์ |
- Google ADK ๊ฒํ (ํ๋ ์์ํฌยท๋ชจ๋ธ ๋น๊ต)
- ํ๋ฅด์๋ + ์ํฉ ์นด๋ ๋ชจ๋ธ (2์ฐจ ์๋๋ฆฌ์ค ๊ตฌ๋ ๋ฐฉ์)
- Mac Studio ๋ก์ปฌ LLM + Claude Opus ํ์ด๋ธ๋ฆฌ๋ ๋ผ์ฐํ ์ ๋ต
- ๊ฐ๋ฐ ์ผ์ ยทํ ์ผ ์ ๊ฒํ (๋จ๊ณ๋ณ ์งํ ์ ๊ฒ)
- ๋ก๋ด Adapter ๊ฐ๋ฐ ์จ๋ณด๋ฉ (HAยทMQTT ๊ณ์ ๋ฑ๋ก, ํ ํฝ ์ ์ฉ, ํ ์คํธ ์ก์์ , ์ํ ํ์ธ)