์๋ฆฌ์ฆ: LLM Tool Calling ๋ด๋ถ ์๋ฆฌ๋ถํฐ ์์ด์ ํธ ์ง์ ๊ตฌํ๊น์ง
์ด ์๋ฆฌ์ฆ๋ ์ฌ์ฉ์์ ์์ฐ์ด ํ ์ค์ด tool ์คํ์ผ๋ก ๋ฐ๋๋ ๋ด๋ถ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋จ๊ณ๋ณ๋ก ํด๋ถํ๊ณ , ์ต์ข ์ ์ผ๋ก ์คํ์์ค ๋ชจ๋ธ + ์์ฒด middleware๋ก ๋๋ง์ ์์ด์ ํธ๋ฅผ ์ง์ ๊ตฌํํ๋ ๊ฒ๊น์ง ๋๋ฌํ๋ ๊ณผ์ ์ด๋ค.
| ํธ | ๋ด์ฉ | ํต์ฌ |
|---|---|---|
| 1ํธ | ์ ์ฒด ์กฐ๊ฐ๋ | ์์ฐ์ด โ tool ์คํ๊น์ง 5๊ฐ ๋ ์ด์ด์ ์กด์ฌ๋ฅผ ํ์ธ |
| 2ํธ | Chat Template | JSON์ด ๋ชจ๋ธ์ ์ง์ ๋ค์ด๊ฐ์ง ์๋๋ค |
| 3ํธ (๋ณธ๋ฌธ) | Tokenization | ๋ชจ๋ธ์ ํ ์คํธ๋ฅผ ์ฝ์ง ๋ชปํ๋ค - ํ ํฐ ID์ control token |
| 4ํธ | ๋ชจ๋ธ ์ถ๋ก | โtool์ ์ธ๊น ๋ง๊นโ ํ๋จ๊ณผ constrained decoding |
| 5ํธ | Tool ์คํ | tool_use๋ฅผ ๋ฐ์ ํด๋ผ์ด์ธํธ์ ์คํ ๋ฃจํ |
| 6ํธ | Native vs Non-native | ๊ฐ์ ๊ธฐ๋ฅ, ๋ค๋ฅธ ๊ตฌ์กฐ โ Middleware |
| 7ํธ | Middleware ๋ง๋ค๊ธฐ | ํ๋กฌํํธ ์กฐ๋ฆฝ + ์ถ๋ ฅ ํ์ฑ + ์คํ ๋ฃจํ ์ง์ ๊ตฌํ |
| 8ํธ | ์คํ์์ค ๋ชจ๋ธ ๋ก์ปฌ ๊ตฌ์ถ | Ollama/vLLM์ผ๋ก ๋ก์ปฌ LLM ์๋น |
| 9ํธ | ๋๋ง์ ์์ด์ ํธ | ๋ชจ๋ธ + Middleware = ์์ด์ ํธ ์์ฑ |
- Tokenization์ Chat Template์ด ๋ง๋ ํ๋กฌํํธ ํ ์คํธ๋ฅผ ๋ชจ๋ธ์ด ์ฐ์ฐํ ์ ์๋ ํ ํฐ ID ์ซ์ ์ํ์ค๋ก ๋ณํํ๋ ๊ณผ์
- ๋ชจ๋ธ์ ํ ์คํธ๋ฅผ ์ง์ ์ฝ์ง ๋ชปํ๋ฉฐ, ํ๋ ฌ ๊ณฑ์ ์ผ๋ก ๋์ํ๋ฏ๋ก ์ซ์ ์ ๋ ฅ์ด ํ์์ ์ธ ๊ตฌ์กฐ์ ์ ์ฝ
- tool calling์์๋ ์ผ๋ฐ ํ ์คํธ ํ ํฐ๊ณผ ๊ตฌ๋ณ๋๋ control token์ด ์กด์ฌํ๋ฉฐ, ์ด๊ฒ์ด โ์ฌ๊ธฐ๋ถํฐ tool ์ ์โ, โ์ฌ๊ธฐ๋ถํฐ tool ํธ์ถโ๊ฐ์ ๊ตฌ์กฐ์ ๊ฒฝ๊ณ๋ฅผ ํ์ํ๋ ํต์ฌ ๋ฉ์ปค๋์ฆ
- ์ด ํธ์์๋ ํ ํฐ ์์ค์ ๋ด๋ถ ํฌ๋งท์ ๊ฐ์ฅ ์์ธํ๊ฒ ๊ณต๊ฐํ Mistral์ ์ฃผ์ ์์๋ก ์ฌ์ฉ. Claude, OpenAI, Gemini๋ ๋์ผํ tokenization ๋ ์ด์ด๊ฐ ์กด์ฌํ์ง๋ง ๋ด๋ถ ํฌ๋งท์ ๋น๊ณต๊ฐ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- 2ํธ์์ Chat Template์ด JSON์ ํ ์คํธ๋ก ๋ณํํ๋ค๋ ๊ฒ์ ํ์ธํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ชจ๋ธ์ ํ ์คํธ๋ ์ง์ ์ฒ๋ฆฌํ ์ ์๋ค
- ๋ชจ๋ธ์ด ์ฐ์ฐํ๋ ค๋ฉด ํ ์คํธ๊ฐ ์ซ์๋ก ๋ฐ๋์ด์ผ ํ๊ณ , ์ด ๋ณํ ๊ณผ์ ์์ tool calling์ ํต์ฌ์ ์ธ control token์ ์ญํ ์ด ๋๋ฌ๋๋ค
- Mistral์
[AVAILABLE_TOOLS]๊ฐ ์ ์ฌ์ฉ์ injection์ ์์ ํ์ง, ์ด ๋จ๊ณ๋ฅผ ์ดํดํด์ผ ์ค๋ช ํ ์ ์๋ค
AS-IS
sequenceDiagram autonumber box AI ์๋น์ค ์์ญ participant CT as Chat Template participant LLM as LLM end CT->>LLM: "In this environment you have access to..." Note over CT,LLM: ํ ์คํธ๊ฐ ๊ทธ๋๋ก ๋ชจ๋ธ์ ๋ค์ด๊ฐ๋ค?
TO-BE
sequenceDiagram autonumber box AI ์๋น์ค ์์ญ participant CT as Chat Template participant TK as Tokenizer participant LLM as LLM end CT->>TK: ํ๋กฌํํธ ํ ์คํธ TK->>TK: BPE๋ก ํ ์คํธ ๋ถํ TK->>TK: control token์ ๋จ์ผ ID๋ก ๋งคํ TK->>LLM: [151331, 151333, 8948, ..., 872, 103013] Note over TK,LLM: ์ซ์ ์ํ์ค๋ง ๋ชจ๋ธ์ ์ ๋ ฅ
์ ํ ํฐํ๊ฐ ํ์ํ๊ฐ
LLM์ ๋ณธ์ง์ ์ผ๋ก ํ๋ ฌ ๊ณฑ์ ๊ธฐ๊ณ๋ค. ์ ๋ ฅ์ผ๋ก ์ซ์ ๋ฒกํฐ๋ฅผ ๋ฐ์, ๊ฐ์ค์น ํ๋ ฌ๊ณผ ๊ณฑํ๊ณ , ๋ค์ ํ ํฐ์ ํ๋ฅ ๋ถํฌ๋ฅผ ์ถ๋ ฅํ๋ค. ํ ์คํธ ๋ฌธ์์ด์ ์ง์ ์ฒ๋ฆฌํ ์ ์๋ ๊ตฌ์กฐ๊ฐ ์๋๋ค.
๋ฐ๋ผ์ ํ ์คํธ๋ฅผ ๋ชจ๋ธ์ ๋ฃ์ผ๋ ค๋ฉด ๋ฐ๋์ ์ซ์๋ก ๋ณํํด์ผ ํ๋ค. ์ด ๋ณํ์ ๋ด๋นํ๋ ๊ฒ์ด Tokenizer๋ค.
"์์ธ ๋ ์จ ์๋ ค์ค"
โ Tokenizer
[12847, 38291, 9823, 44102]
โ Embedding Layer
[[0.23, -0.41, ...], [0.87, 0.12, ...], ...] โ ๋ฒกํฐ ์ํ์ค
โ Transformer Layers (ํ๋ ฌ ๊ณฑ์
๋ฐ๋ณต)
๋ค์ ํ ํฐ ํ๋ฅ ๋ถํฌ
BPE - ํ ์คํธ๋ฅผ ํ ํฐ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ
๋๋ถ๋ถ์ LLM์ด ์ฌ์ฉํ๋ ํ ํฐํ ์๊ณ ๋ฆฌ์ฆ์ **BPE(Byte Pair Encoding)**๋ค.
ํต์ฌ ์๋ฆฌ: ํ์ต ๋ฐ์ดํฐ์์ ์์ฃผ ํจ๊ป ๋ฑ์ฅํ๋ ๋ฌธ์ ์์ ๋ฐ๋ณต์ ์ผ๋ก ๋ณํฉํ์ฌ vocabulary๋ฅผ ๊ตฌ์ถํ๋ค.
1๋จ๊ณ: ๋ฌธ์ ๋จ์๋ก ๋ถํ
"hello" โ ["h", "e", "l", "l", "o"]
2๋จ๊ณ: ๊ฐ์ฅ ๋น๋ฒํ ์ ๋ณํฉ (l, l) โ "ll"
["h", "e", "ll", "o"]
3๋จ๊ณ: ๋ค์ ๋น๋ฒํ ์ ๋ณํฉ (h, e) โ "he"
["he", "ll", "o"]
4๋จ๊ณ: ๋ค์ ๋น๋ฒํ ์ ๋ณํฉ (he, ll) โ "hell"
["hell", "o"]
5๋จ๊ณ: ์ต์ข
๋ณํฉ (hell, o) โ "hello"
["hello"] โ vocabulary์ "hello"๊ฐ ํต์งธ๋ก ๋ฑ๋ก
์์ฃผ ๋ฑ์ฅํ๋ ๋จ์ด๋ ํต์งธ๋ก ํ๋์ ํ ํฐ์ด ๋๊ณ , ๋๋ฌธ ๋จ์ด๋ ์ฌ๋ฌ ํ ํฐ์ผ๋ก ๋๋๋ค. ์ด๊ฒ์ด description์ด ๊ธด tool ์ ์๊ฐ ๋ ๋ง์ ํ ํฐ์ ์๋นํ๋ ์ด์ ๋ค.
์ผ๋ฐ ํ ํฐ vs Control Token
ํ ํฐํ์๋ ๋ ์ข ๋ฅ์ ํ ํฐ์ด ์กด์ฌํ๋ค. ์ด ๊ตฌ๋ถ์ด tool calling์ ํต์ฌ์ด๋ค.
๋ค๋ฅธ ๋ฒค๋๋ ๋์ผํ tokenization ๋ ์ด์ด๋ฅผ ๊ฐ์ง๊ณ ์๋ค
Mistral๋ง ์ด ๊ณผ์ ์ ๊ฑฐ์น๋ ๊ฒ์ด ์๋๋ค. ๋ชจ๋ LLM์ ํ ์คํธ๋ฅผ ํ ํฐ ID๋ก ๋ณํํด์ผ ํ๋ฉฐ, ๊ฐ ๋ฒค๋์ ๊ณต์ ๋ฌธ์์์ ์ด ๋ ์ด์ด์ ์กด์ฌ๋ฅผ ํ์ธํ ์ ์๋ค:
| ๋ฒค๋ | tokenization ๋ ์ด์ด ์กด์ฌ ์ฆ๊ฑฐ | ๋ด๋ถ ํฌ๋งท ๊ณต๊ฐ |
|---|---|---|
| Claude | tool use ์ ๋ชจ๋ธ๋ณ 313~530๊ฐ ์ถ๊ฐ ์์คํ ํ๋กฌํํธ ํ ํฐ ์๋น (๊ณต์ ๋ฌธ์ ๋ช ์) | ๋น๊ณต๊ฐ. ๊ณต์ ํ ํฌ๋์ด์ ํจํค์ง๋ Claude 3 ์ดํ โ๋ถ์ ํํ ๊ทผ์ฌ์นโ |
| OpenAI | tool ์ ์๊ฐ ํ๋กฌํํธ์ ์ฝ์ ๋์ด input token์ผ๋ก ๊ณผ๊ธ (๊ณต์ ํ์ธ) | ๋น๊ณต๊ฐ. โํน์ ํ ํฐ์ผ๋ก ๊ฒฝ๊ณ๋ฅผ ๊ตฌ๋ถํ ๊ฒโ์ผ๋ก ์ถ์ |
| Gemini | token counting API์์ tool ์ ์๋ ํ ํฐ์ผ๋ก ๊ณ์ฐ | ๋น๊ณต๊ฐ |
| Mistral | control token ID, ๋ฒ์ ๋ณ ์ฐจ์ด๊น์ง ํ ํฐ ์์ค ๊ณต๊ฐ | ๊ณต๊ฐ |
| GLM | [gMASK] = ID 151331, <sop> = ID 151333 ๋ฑ ํ ํฌ๋์ด์ ์์ ํ์ธ ๊ฐ๋ฅ | ๋ชจ๋ธ ์ฝ๋์์ ํ์ธ ๊ฐ๋ฅ |
๋ด๋ถ ํฌ๋งท์ ๋ฒค๋๋ง๋ค ๋ค๋ฅด์ง๋ง, โํ ์คํธ โ ํ ํฐ ID ๋ณํโ์ด๋ผ๋ ๋ ์ด์ด ์์ฒด๋ ๋ชจ๋ LLM์ ์กด์ฌํ๋ค. ์๋ ์์๋ ์ด ๊ณผ์ ์ ๊ฐ์ฅ ์์ธํ๊ฒ ๊ณต๊ฐํ Mistral์ ๊ธฐ์ค์ผ๋ก ์ค๋ช ํ๋ค.
์ผ๋ฐ ํ ํฐ (Regular Token)
BPE๋ก ํ ์คํธ๋ฅผ ๋ถํ ํ์ฌ ์์ฑ๋๋ค. ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ํ ์คํธ๋, ์์คํ ํ๋กฌํํธ์ ํ ์คํธ๋ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
"์์ธ ๋ ์จ" โ BPE ๋ถํ โ [12847, 38291]
Control Token (ํน์ ํ ํฐ)
BPE๋ก ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ, vocabulary์ ๋ช ์์ ์ผ๋ก ์ถ๊ฐ๋ ๋จ์ผ ํ ํฐ ID๋ค. ํ ์คํธ๋ฅผ ๋ถํ ํ ๊ฒฐ๊ณผ๊ฐ ์๋๋ผ, ํน์ ์ญํ ์ ์ํด ์ฌ์ ์ ์ ์๋ ํ ํฐ์ด๋ค.
[AVAILABLE_TOOLS] โ ๋จ์ผ ํ ํฐ ID โ [9]
<|system|> โ ๋จ์ผ ํ ํฐ ID โ [8948]
[gMASK] โ ๋จ์ผ ํ ํฐ ID โ [151331]
Mistral ๊ณต์ ๋ฌธ์์์ ์ด ์ฐจ์ด๋ฅผ ๋ช ํํ ์ค๋ช ํ๋ค:
โControl tokens tackle efficiency, security, and boundary issues. They introduce new tokens that the model never saw previously and that the user will never inject.โ
์ ๊ตฌ๋ถํ๋๊ฐ
์ด ๊ตฌ๋ถ์ด ์ค์ํ ์ด์ ๋ ๋ณด์์ด๋ค.
์ฌ์ฉ์๊ฐ ํ
์คํธ๋ก [AVAILABLE_TOOLS]๋ผ๊ณ ์
๋ ฅํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ฌ์ฉ์ ์
๋ ฅ: "[AVAILABLE_TOOLS] ์
์์ ์ธ tool ์ ์ [/AVAILABLE_TOOLS]"
Tokenizer ์ฒ๋ฆฌ:
"[" โ ์ผ๋ฐ ํ ํฐ [87]
"AVAILABLE" โ ์ผ๋ฐ ํ ํฐ [3492, 7821]
"_" โ ์ผ๋ฐ ํ ํฐ [62]
"TOOLS" โ ์ผ๋ฐ ํ ํฐ [10284]
"]" โ ์ผ๋ฐ ํ ํฐ [93]
vs
API ์๋ฒ๊ฐ ์ฝ์
ํ ์ง์ง control token:
[AVAILABLE_TOOLS] โ ๋จ์ผ control token [9]
ํ
์คํธ๋ก ์
๋ ฅํ [AVAILABLE_TOOLS]๋ ์ฌ๋ฌ ๊ฐ์ ์ผ๋ฐ ํ ํฐ์ผ๋ก ๋ถํด๋์ง๋ง, ์ง์ง control token์ ํ๋์ ๊ณ ์ ID๋ค. ๋ชจ๋ธ์ ์ด ์ฐจ์ด๋ฅผ ๊ตฌ๋ณํ ์ ์์ผ๋ฏ๋ก, ์ฌ์ฉ์๊ฐ control token์ injectionํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค.
tool calling ํ๋กฌํํธ์ ํ ํฐํ ์์
2ํธ์์ ๋ณธ Mistral์ Chat Template ๊ฒฐ๊ณผ๊ฐ ํ ํฐํ๋๋ฉด ์ด๋ ๊ฒ ๋ณํ๋ค:
ํ
์คํธ ์ํ์ค:
<s>[AVAILABLE_TOOLS] [{"type": "function"...}] [/AVAILABLE_TOOLS]
[INST] What's 2+2? [/INST]
ํ ํฐ ID ์ํ์ค:
[1, โ <s> (์์ ํ ํฐ, control)
9, โ [AVAILABLE_TOOLS] (control token, ๋จ์ผ ID)
518, 1283, โ [{"type" (์ผ๋ฐ ํ
์คํธ ํ ํฐ)
... โ tool ์ ์ JSON ํ
์คํธ (์ผ๋ฐ ํ
์คํธ ํ ํฐ๋ค)
10, โ [/AVAILABLE_TOOLS] (control token, ๋จ์ผ ID)
3, โ [INST] (control token, ๋จ์ผ ID)
1824, 28, โ What's 2+2? (์ผ๋ฐ ํ
์คํธ ํ ํฐ)
4] โ [/INST] (control token, ๋จ์ผ ID)
control token์ ๋จ์ผ ID, ๋๋จธ์ง๋ BPE๋ก ๋ถํ ๋ ์ผ๋ฐ ํ ํฐ์ด๋ค. ๋ชจ๋ธ์ ์ด ์ซ์ ์ํ์ค๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ถ๋ก ์ ์์ํ๋ค.
Tokenizer ๋ฒ์ ๋ณ ์ฐจ์ด - Mistral V2 vs V3
Mistral์ Tokenizer๋ฅผ ๋ฒ์ ๋ณ๋ก ๊ฐ์ ํ๋ฉฐ tool calling ์ง์์ ๊ฐํํ๋ค:
| V2 | V3 | V3 Tekken | |
|---|---|---|---|
| tool ๊ฒฐ๊ณผ ํ์ | ๋ฆฌ์คํธ๋ก ๊ฐ์ธ๊ธฐ [{...}] | ๋จ์ผ ๊ฐ์ฒด {...} | ๋จ์ผ ๊ฐ์ฒด {...} |
| ํธ์ถ ์ถ์ | ID ์์ | id ํ๋ ์ถ๊ฐ | id ํ๋ ์ถ๊ฐ |
| ๊ณต๋ฐฑ ์ฒ๋ฆฌ | control token ๋ค ๊ณต๋ฐฑ ์ ์ง | ๊ณต๋ฐฑ ์ ์ง | ๊ณต๋ฐฑ ์ ๊ฑฐ |
| ๋ํ ์ด๋ ฅ | ํ ํฐํํ์ง ์์ | ์ํ์ค์ ํฌํจ | ์ํ์ค์ ํฌํจ |
V3์์ id ํ๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์, ๋ฉํฐํด ๋ํ์์ ์ด๋ค tool call์ ๋ํ ๊ฒฐ๊ณผ์ธ์ง ์ถ์ ํ๊ธฐ ์ํจ์ด๋ค. ์ด๊ฒ์ Claude์ tool_use_id์ ๋์ผํ ์ญํ ์ด๋ค.
HuggingFace์์ ํ ํฐํ ์ง์ ํ์ธํ๊ธฐ
์ค์ ๋ก chat template์ด ์ด๋ป๊ฒ ํ ํฐํ๋๋์ง ์ฝ๋๋ก ํ์ธํ ์ ์๋ค:
// Python ์ฝ๋์ง๋ง ์๋ฆฌ ์ดํด ๋ชฉ์
// HuggingFace transformers ์ฌ์ฉ
import { AutoTokenizer } from "transformers";
const tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.1");
const chat = [
{ role: "user", content: "What's 2+2?" }
];
// tokenize=false: ํ
์คํธ ํํ ํ์ธ
const text = tokenizer.apply_chat_template(chat, { tokenize: false });
// โ "<s>[INST] What's 2+2? [/INST]"
// tokenize=true: ํ ํฐ ID ์ํ์ค ํ์ธ
const tokens = tokenizer.apply_chat_template(chat, { tokenize: true });
// โ [1, 3, 1824, 28, 32, 28, 32, 28, 4]apply_chat_template์ด ๋ฐ๋ก 2ํธ์ Chat Template๊ณผ 3ํธ์ Tokenization์ ํ๋ฒ์ ์ํํ๋ ํจ์๋ค. tokenize: false๋ฉด ํ
์คํธ๊น์ง๋ง, tokenize: true๋ฉด ํ ํฐ ID๊น์ง ๋ณํํ๋ค.
๋ค์ ํธ: ํ ํฐ ์ํ์ค๋ฅผ ๋ฐ์ ๋ชจ๋ธ์ ์ด๋ป๊ฒ tool์ ์ธ์ง ํ๋จํ์ง?
์ด ๊ธ์์ ํ ์คํธ๊ฐ ํ ํฐ ID ์ํ์ค๋ก ๋ณํ๋๋ ๊ณผ์ ์ ํ์ธํ๋ค. control token์ด ๊ตฌ์กฐ์ ๊ฒฝ๊ณ๋ฅผ ํ์ํ๊ณ , ์ฌ์ฉ์ injection์ผ๋ก๋ถํฐ ์์ ํ๋ค๋ ๊ฒ๋ ์ดํดํ๋ค.
๊ทธ๋ฐ๋ฐ ๋ชจ๋ธ์ด ์ด ํ ํฐ ์ํ์ค๋ฅผ ๋ฐ์ ํ, โtool์ ์ฌ์ฉํด์ผ๊ฒ ๋คโ๊ณ ํ๋จํ๋ ๊ณผ์ ์ ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๊น? ๊ฒฐ๊ตญ ๋ชจ๋ธ์ ๋ค์ ํ ํฐ์ ์์ธกํ ๋ฟ์ธ๋ฐ, ์ด๋ป๊ฒ tool call ํ์์ ์ถ๋ ฅ์ ์์ฑํ๊ฒ ๋๋ ๊ฑธ๊น?
๋ค์ ํธ์์ ์ด ๋ชจ๋ธ ์ถ๋ก ๊ณผ์ ์ ์ดํด๋ณธ๋ค.
์ฐธ๊ณ ๋ฌธ์
- Mistral - Tokenization & Tool Calling Deep Dive - control token ์ค๊ณ ์ฒ ํ, V2/V3/Tekken ๋น๊ต
- HuggingFace - Chat Templates - apply_chat_template, ํน์ ํ ํฐ๊ณผ chat template์ ๊ด๊ณ
- Andrej Karpathy - Letโs Build the GPT Tokenizer - BPE ํ ํฌ๋์ด์ ๊ตฌ์ถ ๊ฐ์