toolRouter-1B

ํ•œ๊ตญ์–ด ์šฐ์„  ํˆด์ฝœ ๋ผ์šฐํ„ฐ โ€” ์‚ฌ์šฉ์ž ๋ฐœํ™”๋ฅผ ๋ฐ›์•„ ํ•ญ์ƒ ํˆด์ฝœ ํ•˜๋‚˜๋กœ ์‘๋‹ตํ•˜๋Š” ๋ผ์šฐํŒ… ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. Llama-3.2-1B-Instruct ์œ„์— ์–น๋Š” QLoRA ์–ด๋Œ‘ํ„ฐ(~45MB)๋กœ, 4bit ๋กœ๋“œ ์‹œ VRAM ์•ฝ 2.5GB, GGUF Q4 ๋ณ€ํ™˜ ์‹œ ์•ฝ 1GB๋กœ ๊ตฌ๋™๋ฉ๋‹ˆ๋‹ค.

  • ์ž์œ  ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ถœ๋ ฅ์€ <tool_call>{"name": ..., "arguments": {...}}</tool_call> ํ˜•์‹์ž…๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜ ๋Œ€ํ™”ยท์ƒ์‹ ์‘๋‹ต์€ reply(text=...), ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ ์š”์ฒญ์€ escalate(query=์›๋ฌธ) ํˆด๋กœ ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  • ์ธ์ž๋Š” ์‚ฌ์šฉ์ž ๋ฌธ์žฅ์˜ ํ‘œํ˜„์„ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ถ”์ถœํ•˜๋„๋ก ํ•™์Šต๋์Šต๋‹ˆ๋‹ค (ํ•œ๊ตญ์–ด ์ธ์ž์˜ ์˜์–ด ๋ฒˆ์—ญยท์š”์•ฝยท์ง€์–ด๋ƒ„ ์–ต์ œ).
  • ์ฒ˜์Œ ๋ณด๋Š” ํˆด ์Šคํ‚ค๋งˆ(zero-shot toolset)์—์„œ๋„ ๋™์ž‘ํ•˜๋„๋ก ํ•™์Šต๋์Šต๋‹ˆ๋‹ค.
  • ๋ฉ€ํ‹ฐํ„ด์ด ํ•„์š”ํ•˜๋ฉด recallResolver-1B์™€ ์ง์œผ๋กœ ์“ฐ์„ธ์š” โ€” ๊ฐ™์€ ๋ฒ ์ด์Šค๋ฅผ ๊ณต์œ ํ•ด ์–ด๋Œ‘ํ„ฐ ์ „ํ™˜๋งŒ์œผ๋กœ ํ•จ๊ป˜ ๋™์ž‘ํ•˜๋ฉฐ, ๋ชจ๋ธ์„ ๋”ฐ๋กœ ๋„์šฐ๋Š” ๊ฒƒ ๋Œ€๋น„ VRAM์ด ์ ˆ๋ฐ˜์ž…๋‹ˆ๋‹ค โ€” ์‹ค์ธก: llama.cpp ๋ฒ ์ด์Šค Q4 + LoRA 2๊ฐœ ํ•œ ์„œ๋ฒ„ = 1.5GB, ๋จธ์ง€ Q4 ์„œ๋ฒ„ 2๊ฐœ = 2.8GB (๊ฐ 2048 ctx, ์ถ”๋ก  ๋ฒ„ํผ ํฌํ•จ).

์ตœ์‹  ๋ฒ„์ „ โ€” 2026-09.2 (recall ์ง€์›)

ํ•œ๊ตญ์–ด ์‹ค์‚ฌ์šฉ ๋ฌธ์ฒด 6,000๋ฌธ์žฅ ์ง์ ‘ ์ž‘์„ฑ ๋ฐ์ดํ„ฐ๋กœ ๊ฐ•ํ™”ํ•˜๊ณ , **๊ณผ๊ฑฐ ๋Œ€ํ™” ์ฐธ์กฐ ๊ฐ์ง€(recall)**๋ฅผ ์ถ”๊ฐ€ํ•œ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

ํ‰๊ฐ€ ์ˆ˜์น˜
ํ•œ๊ตญ์–ด ํ‰๊ฐ€์…‹ 396 (decision / tool / args) 97.2 / 95.7 / 83.8
held-out 1,100 (decision / tool / args) 99.5 / 99.2 / 97.0
BFCL v3 single-turn (simple / multiple / irrelevance / overall) 86.0 / 85.5 / 80.0 / 84.2
recall ํŒ์ • (๊ฒฝ๊ณ„ ์ผ€์ด์Šค ํฌํ•จ 120) ์žฌํ˜„ 86.7% / ์ •๋ฐ€ 91.2% / ํ•จ์ • ๋ฐฉ์–ด 52/55

์‚ฌ์šฉ๋ฒ•

from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModel

base = "meta-llama/Llama-3.2-1B-Instruct"
model = AutoModelForCausalLM.from_pretrained(base, device_map="auto")
model = PeftModel.from_pretrained(model, "kimjg/toolRouter-1B")
tokenizer = AutoTokenizer.from_pretrained("kimjg/toolRouter-1B")

์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์€ ์ €์žฅ์†Œ์˜ chat_template.jinja์— ํฌํ•จ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. greedy ๋””์ฝ”๋”ฉ์„ ๊ถŒ์žฅํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜์—์„œ๋Š” xgrammar ๋“ฑ JSON ์Šคํ‚ค๋งˆ ๋ฌธ๋ฒ• ๊ฐ•์ œ(constrained decoding)๋ฅผ ํ•จ๊ป˜ ์“ฐ๋ฉด ํŒŒ์‹ฑยท์Šคํ‚ค๋งˆ ํ†ต๊ณผ์œจ 100%๋ฅผ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํˆด ์ง€์ • ๋ฐฉ๋ฒ•

์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ํˆด ์Šคํ‚ค๋งˆ๋ฅผ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ compact JSON์œผ๋กœ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ํ•™์Šต ๋•Œ ์‚ฌ์šฉํ•œ ํ…œํ”Œ๋ฆฟ ๊ทธ๋Œ€๋กœ ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค:

๋„ˆ๋Š” ๊ฒŒ์ž„ ๊ณต๋žต ๋„์šฐ๋ฏธ์˜ ํˆด์ฝœ ๋ผ์šฐํ„ฐ๋‹ค. ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ์ฝ๊ณ  ์•„๋ž˜ ํˆด ์ค‘ ์ •ํ™•ํžˆ ํ•˜๋‚˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์œผ๋กœ๋งŒ ์‘๋‹ตํ•œ๋‹ค. ์ž์œ  ํ…์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
- ์ผ๋ฐ˜ ๋Œ€ํ™”๋‚˜ ์ง์ ‘ ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ์งˆ๋ฌธ์€ reply ํˆด์„ ํ˜ธ์ถœํ•œ๋‹ค.
- ๋ชฉ๋ก์— ์žˆ๋Š” ํˆด๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ฑฐ๋‚˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚œ ์š”์ฒญ์€ escalate ํˆด์„ ํ˜ธ์ถœํ•œ๋‹ค.
- ํˆด ์ธ์ž๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์—์„œ ์ถ”์ถœํ•œ๋‹ค. ์š”์ฒญ์— ์—†๋Š” ๊ฐ’์„ ์ง€์–ด๋‚ด์ง€ ์•Š๋Š”๋‹ค.
์‘๋‹ต ํ˜•์‹์€ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:
<tool_call>{"name": "<ํˆด ์ด๋ฆ„>", "arguments": {<์ธ์ž>}}</tool_call>
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํˆด ๋ชฉ๋ก:
<tools>
{tools_json}
</tools>

{tools_json} ์ž๋ฆฌ์— ๋“ค์–ด๊ฐ€๋Š” ํˆด ์Šคํ‚ค๋งˆ ํ˜•์‹ (OpenAI function ์Šคํ‚ค๋งˆ์™€ ๋™์ผํ•œ parameters ๊ตฌ์กฐ):

{"name": "get_weather", "description": "์ง€์—ญ์˜ ํ˜„์žฌ ๋‚ ์”จ๋ฅผ ์กฐํšŒํ•œ๋‹ค", "parameters": {"type": "object", "properties": {"location": {"type": "string", "description": "๋„์‹œ ์ด๋ฆ„"}, "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}}, "required": ["location"]}}
{"name": "reply", "description": "ํˆด์ด ํ•„์š” ์—†๋Š” ์งˆ๋ฌธ์— ์ง์ ‘ ๋‹ตํ•œ๋‹ค", "parameters": {"type": "object", "properties": {"text": {"type": "string"}}, "required": ["text"]}}
{"name": "escalate", "description": "์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋Š” ์š”์ฒญ์„ ์ƒ์œ„๋กœ ๋„˜๊ธด๋‹ค", "parameters": {"type": "object", "properties": {"query": {"type": "string"}}, "required": ["query"]}}

reply์™€ escalate๋Š” ํ•ญ์ƒ ๋ชฉ๋ก์— ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ํˆด์€ ์ž์œ ๋กญ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ณ , ํ•™์Šต ๋•Œ ๋ณธ ์  ์—†๋Š” ํˆด์…‹๋„ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค(zero-shot). ํˆด ์„ค๋ช…์€ ์˜์–ดยทํ•œ๊ตญ์–ด ๋ชจ๋‘ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ํˆด 3์ข… (๋ผ์šฐํ„ฐ์˜ ํ”„๋กœํ† ์ฝœ)

์ด ๋ผ์šฐํ„ฐ๋Š” "๋ชจ๋“  ์‘๋‹ต์ด ํˆด์ฝœ"์ด๋ผ๋Š” ๊ทœ์•ฝ ์œ„์—์„œ ๋™์ž‘ํ•˜๋ฉฐ, ๋„๋ฉ”์ธ ํˆด ์™ธ์— ๋‹ค์Œ ๊ธฐ๋ณธ ํˆด๋กœ ๋ชจ๋“  ๋ฐœํ™”๋ฅผ ์ปค๋ฒ„ํ•ฉ๋‹ˆ๋‹ค:

๊ธฐ๋ณธ ํˆด ์–ธ์ œ ๋‚˜์˜ค๋‚˜ ์ธ์ž ์„œ๋ฒ„๊ฐ€ ํ•  ์ผ
reply ํˆด์ด ํ•„์š” ์—†๋Š” ์ธ์‚ฌยท์žก๋‹ดยท์ƒ์‹ ์งˆ๋ฌธ ("๊ณ ๋งˆ์›Œ!", "์•ˆ๋…•") text: ์งง์€ ํ•œ๊ตญ์–ด ๋‹ต๋ณ€ text๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ
escalate ๋ชฉ๋ก์˜ ํˆด๋กœ ์ฒ˜๋ฆฌ ๋ถˆ๊ฐ€ํ•œ ์š”์ฒญ โ€” ๋‹ค๋ฅธ ๋„๋ฉ”์ธ, ๋ณตํ•ฉ ์ž‘์—…, ํ•„์ˆ˜ ์ธ์ž๋ฅผ ์•Œ ์ˆ˜ ์—†์Œ, ๊ธด ๊ธ€์“ฐ๊ธฐ ๋“ฑ query: ์‚ฌ์šฉ์ž ์š”์ฒญ ์›๋ฌธ ๊ทธ๋Œ€๋กœ ์ƒ์œ„ ๋ชจ๋ธยท๋‹ด๋‹น์ž์—๊ฒŒ ์ „๋‹ฌ
recall ๋ฐœํ™”๊ฐ€ ๊ณผ๊ฑฐ ๋Œ€ํ™”์˜ ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ ("๊ทธ๊ฑฐ ์žฌ๊ณ  ์–ผ๋งˆ ๋‚จ์•˜์–ด?", "์•„๊นŒ ๊ทธ ๋„์‹œ ๋‚ด์ผ ๋‚ ์”จ๋Š”?") needs: ์ฐพ์•„์•ผ ํ•  ๊ฐ’์˜ ํ•œ๊ตญ์–ด ์„ค๋ช… recallResolver-1B๋กœ ํžˆ์Šคํ† ๋ฆฌ์—์„œ ๊ฐ’์„ ์ฐพ์•„ ๋ฐœํ™”๋ฅผ ๋ณด๊ฐ• ํ›„ ๋ผ์šฐํ„ฐ ์žฌํ˜ธ์ถœ

์„ค๊ณ„ ์˜๋„: ๋ผ์šฐํ„ฐ๋Š” ์ž์œ  ํ…์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ "๋Œ€๋‹ตํ•œ๋‹ค/๋„˜๊ธด๋‹ค/๊ณผ๊ฑฐ๋ฅผ ์ฐพ๋Š”๋‹ค"๊นŒ์ง€ ์ „๋ถ€ ํˆด์ฝœ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋‹ค์šด์ŠคํŠธ๋ฆผ์€ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋งŒ ํ•˜๋ฉด ๋˜๊ณ , ์ถœ๋ ฅ ๋ฌธ๋ฒ• ๊ฐ•์ œ(constrained decoding)๋ฅผ ์ „์ฒด ์‘๋‹ต์— ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

reply ์šด์šฉ ํŒ: reply.text๋ฅผ ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜๋„ ์žˆ์ง€๋งŒ(์ง€์—ฐ ์ตœ์†Œ), reply๋ฅผ "๋Œ€ํ™” ํŠธ๋ž™" ์‹ ํ˜ธ๋กœ๋งŒ ์“ฐ๊ณ  ๋ฐœํ™”๋ฅผ ๋ณ„๋„ ์ฑ— ๋ชจ๋ธ๋กœ ๋„˜๊ธฐ๋Š” ๊ตฌ์„ฑ๋„ ๋ถ„๊ธฐ ํ•œ ์ค„์ด๋ฉด ๋ฉ๋‹ˆ๋‹ค. ํŽ˜๋ฅด์†Œ๋‚˜ ์žˆ๋Š” ๋ณธ๊ฒฉ ์ฑ—๋ด‡๊ณผ ๋ถ™์ผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค:

call = route(utterance)
if call["name"] == "reply":
    return chat_model(persona, utterance)  # text๋Š” ๋ฒ„๋ฆฌ๊ณ  ํฐ ๋ชจ๋ธ์ด ๋Œ€ํ™”

recall ์—ฐ๋™ ํŒ (recallResolver-1B์™€์˜ end-to-end ๊ฒ€์ฆ์—์„œ ํ™•์ •ํ•œ ์„œ๋ฒ„ ๊ทœ์น™): โ‘ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ๊ฐ’์„ ์ฐพ์œผ๋ฉด ๊ทธ ๊ฐ’์˜ ์ถœ์ฒ˜ ์ธ์ž ์Šคํ‚ค๋งˆ ์„ค๋ช…์„ ๋ผ๋ฒจ๋กœ ๋ฐœํ™”๋ฅผ ๋ณด๊ฐ•ํ•ด ์žฌ๋ผ์šฐํŒ… โ€” "{๋ฐœํ™”} ({๋ผ๋ฒจ}: {๊ฐ’})" โ‘ก๋ผ์šฐํ„ฐ์˜ needs๋กœ ๋ฆฌ์กธ๋ฒ„๊ฐ€ ๋ชป ์ฐพ์œผ๋ฉด ํ•ด๋‹น ๊ธฐ๋ก์˜ ์ธ์ž ์„ค๋ช…๋“ค๋กœ ์žฌ์งˆ์˜ โ‘ขneeds์™€ ๊ฐ’ ๋ผ๋ฒจ์˜ ์œ ํ˜•์ด ์•ˆ ๋งž์œผ๋ฉด ์ž๋™ ์ฃผ์ž… ๋Œ€์‹  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™•์ธ. ์žฌํ˜ธ์ถœ์ด ๋˜ recall์ด๋ฉด escalate(๋ฃจํ”„ ๊ฐ€๋“œ). recall์„ ์“ฐ์ง€ ์•Š์œผ๋ ค๋ฉด ํˆด ๋ชฉ๋ก์—์„œ ๋นผ๋ฉด ๋ฉ๋‹ˆ๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด ๊ณผ๊ฑฐ ์ฐธ์กฐ ๋ฐœํ™”๋Š” escalate๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค.

๋™์ž‘ ์˜ˆ:

user: ์šฐ์‚ฐ ์ฑ™๊ฒจ์•ผ ํ•˜๋‚˜, ๋Œ€์ „์ธ๋ฐ
assistant: <tool_call>{"name": "get_weather", "arguments": {"location": "๋Œ€์ „"}}</tool_call>

user: ๊ณ ๋งˆ์›Œ!
assistant: <tool_call>{"name": "reply", "arguments": {"text": "๋ณ„๋ง์”€์„์š”, ๋˜ ํ•„์š”ํ•˜๋ฉด ๋ถˆ๋Ÿฌ ์ฃผ์„ธ์š”!"}}</tool_call>

user: ์ด ์‚ฌ์ง„์—์„œ ๊ธ€์ž ์ข€ ์ฝ์–ด์ค˜
assistant: <tool_call>{"name": "escalate", "arguments": {"query": "์ด ์‚ฌ์ง„์—์„œ ๊ธ€์ž ์ข€ ์ฝ์–ด์ค˜"}}</tool_call>

GGUF (llama.cpp)

์–ด๋Œ‘ํ„ฐ๋ฅผ ๋จธ์ง€ํ•ด ์–‘์žํ™”ํ•œ ๋‹จ์ผ ํŒŒ์ผ๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์†์‹ค์€ ์ž์ฒด ํ‰๊ฐ€์…‹ ์‹ค์ธก์น˜์ž…๋‹ˆ๋‹ค:

ํŒŒ์ผ ํฌ๊ธฐ ํ•œ๊ตญ์–ด ํ‰๊ฐ€์…‹ (decision/tool/args) ๊ถŒ์žฅ ์šฉ๋„
toolRouter-1B-Q8_0.gguf 1.3GB 96.5 / 95.0 / 83.4 (์›๋ณธ ๋Œ€๋น„ ~-0.8%p) ํ’ˆ์งˆ ์šฐ์„ 
toolRouter-1B-Q4_K_M.gguf 0.8GB 95.5 / 94.2 / 83.4 (~-1.6%p) ์ตœ์†Œ VRAM
llama-server -m toolRouter-1B-Q8_0.gguf -ngl 99 -c 2048

์ฑ„ํŒ… ํ…œํ”Œ๋ฆฟ์ด GGUF์— ํฌํ•จ๋ผ ์žˆ์Šต๋‹ˆ๋‹ค. greedy(temperature 0) ๊ถŒ์žฅ, ์ถœ๋ ฅ์€ <tool_call>...</tool_call> ํ˜•์‹ ๊ทธ๋Œ€๋กœ์ž…๋‹ˆ๋‹ค. recall ํŒ์ •์€ ์–‘์žํ™”์— ๋‹ค์†Œ ๋ฏผ๊ฐํ•˜๋‹ˆ(๊ฒฝ๊ณ„ ์ผ€์ด์Šค -4~5%p) recall์„ ์“ฐ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด๋ฉด Q8์„ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

์ œํ•œ

  • ๋‹จ์ผ ํ„ด ๋ผ์šฐํŒ… ์ „์šฉ์ž…๋‹ˆ๋‹ค (๋ฉ€ํ‹ฐํ„ด ๋ฌธ๋งฅ ์ฐธ์กฐ๋Š” ๋ฏธ์ง€์›).
  • ์„ธ๊ณ„์ง€์‹ ์ถ”๋ก ์ด ํ•„์š”ํ•œ ์ธ์ž ๋ณด์ •(์˜ˆ: ๋„์‹œ๋ช…โ†’ํ†ตํ™”์ฝ”๋“œ), ์ƒ๋Œ€ ๋‚ ์งœ ํ•ด์„์€ ๋‹ค์šด์ŠคํŠธ๋ฆผ์—์„œ ์ฒ˜๋ฆฌํ•˜์„ธ์š”. ์ƒ๋Œ€ ๋‚ ์งœ๋Š” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ํ˜„์žฌ ๋‚ ์งœ๋ฅผ ์ œ๊ณตํ•˜๋ฉด ๊ฐœ์„ ๋ฉ๋‹ˆ๋‹ค.
  • base ๋ชจ๋ธ์˜ Llama 3.2 Community License๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
Downloads last month
86
GGUF
Model size
1B params
Architecture
llama
Hardware compatibility
Log In to add your hardware

4-bit

8-bit

Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for kimjg/toolRouter-1B

Adapter
(665)
this model