์๋ฆฌ์ฆ: 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 = ์์ด์ ํธ ์์ฑ |
- Native vs Non-native๋ 2~5ํธ์์ ๋ค๋ฃฌ tool calling ๋ ์ด์ด(Chat Template, Tokenization, ๋ชจ๋ธ ์ถ๋ก , Constrained Decoding, ์ถ๋ ฅ ํ์ฑ, Tool ์คํ ๋ฃจํ)๊ฐ ๋ชจ๋ธ/API์ ๋ด์ฅ๋์ด ์๋์ง ์ฌ๋ถ์ ๋ฐ๋ฅธ ๊ตฌ์กฐ์ ์ฐจ์ด
- Claude, GPT ๊ฐ์ ์์ฉ ๋ชจ๋ธ์ ์ด ๋ ์ด์ด๊ฐ API ์๋ฒ์ ๋ชจ๋ ๋ด์ฅ๋์ด ์์ง๋ง, ์คํ์์ค ๋ชจ๋ธ(Llama, Gemma ๋ฑ)์ ๋ชจ๋ธ ๊ฐ์ค์น๋ง ์กด์ฌํ๊ณ ๋๋จธ์ง ๋ ์ด์ด๊ฐ ์๋ ๊ตฌ์กฐ
- ์ด ๊ฒฉ์ฐจ๋ฅผ ์ธ๋ถ์์ ๋ฉ์ฐ๋ ๊ฒ์ด Middleware์ด๋ฉฐ, harness ์ค๊ณ๊ฐ ๋ชจ๋ธ ์ฑ๋ฅ์ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ด ์ต๊ทผ ์ฐ๊ตฌ์ ํต์ฌ ๋ฐ๊ฒฌ
ํด๋น ๊ฐ๋ ์ด ํ์ํ ์ด์
- 5ํธ๊น์ง tool calling ํ์ดํ๋ผ์ธ์ ๋ชจ๋ ๋ ์ด์ด๋ฅผ ํ์ธํ๋ค. ํ์ง๋ง ์ด ๋ ์ด์ด๋ค์ด ํญ์ ์กด์ฌํ๋ ๊ฒ์ ์๋๋ค
- ์คํ์์ค ๋ชจ๋ธ์ ๋ก์ปฌ์์ ์คํํ ๋ โtool calling์ด ์ ๋๋คโ๋ ๊ฒ์ด ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๋ ์ด์ด๊ฐ ์๋ค๋ ๋ป์ธ์ง ์ดํดํด์ผ, 7ํธ์์ middleware๋ฅผ ๋ง๋ค ์ ์๋ค
- ๋ํ, harness(tool ํฌ๋งท) ์ค๊ณ๋ง ๋ฐ๊ฟ๋ ๋ชจ๋ธ ์ฑ๋ฅ์ด 10๋ฐฐ ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ฌ์ค์ ๊ฐ๋ฐ์์๊ฒ ์ค์ง์ ๊ฐ์น๊ฐ ์๋ค
AS-IS
sequenceDiagram autonumber box ๊ฐ๋ฐ์ ์์ญ participant Dev as ๊ฐ๋ฐ์ end box AI ์๋น์ค ์์ญ participant API as API ์๋ฒ participant CT as Chat Template participant TK as Tokenizer participant LLM as ๋ชจ๋ธ participant CD as Constrained Decoding participant P as ์ถ๋ ฅ ํ์ end Dev->>API: tools + ์ง๋ฌธ API->>CT: JSON โ ํ ์คํธ CT->>TK: ํ ์คํธ โ ํ ํฐ TK->>LLM: ์ถ๋ก LLM->>CD: valid JSON ๊ฐ์ CD->>P: ํ์ฑ P->>API: structured JSON API-->>Dev: tool_use ์๋ต Note over API,P: ๋ชจ๋ ๋ ์ด์ด๊ฐ ๋ด์ฅ๋์ด ์๋ค
TO-BE
sequenceDiagram autonumber box ๊ฐ๋ฐ์ ์์ญ participant Dev as ๊ฐ๋ฐ์ end box ??? participant Q as ๋๊ฐ ์ฒ๋ฆฌํ์ง? end box ์คํ์์ค ๋ชจ๋ธ participant LLM as ๋ชจ๋ธ ๊ฐ์ค์น๋ง ์กด์ฌ end Dev->>Q: tools + ์ง๋ฌธ Note over Q: Chat Template?<br/>Tokenizer?<br/>Constrained Decoding?<br/>์ถ๋ ฅ ํ์ฑ? Q->>LLM: ??? LLM-->>Q: ??? Q-->>Dev: ???
Native Tool Calling ๋ชจ๋ธ์ ๊ตฌ์กฐ
Claude, GPT ๊ฐ์ ์์ฉ ๋ชจ๋ธ์ ์ฌ์ฉํ ๋, ๊ฐ๋ฐ์๋ API์ JSON์ ๋ณด๋ด๋ฉด ๋๋ค. ๋๋จธ์ง๋ ๋ชจ๋ API ์๋ฒ๊ฐ ์ฒ๋ฆฌํ๋ค:
flowchart LR subgraph API์๋ฒ["API ์๋ฒ (์ ๋ ฅ ์ฒ๋ฆฌ)"] CT[Chat Template] TK[Tokenizer] end subgraph ๋ชจ๋ธ LLM["๋ชจ๋ธ ์ถ๋ก <br/>(tool call fine-tuning ์๋ฃ)"] end subgraph API์๋ฒ2["API ์๋ฒ (์ถ๋ ฅ ์ฒ๋ฆฌ)"] CD[Constrained Decoding] P[์ถ๋ ฅ ํ์] end CT --> TK --> LLM --> CD --> P
๊ฐ ๋ ์ด์ด์ ์ญํ (2~5ํธ ์์ฝ):
- Chat Template: tool JSON โ ์์คํ ํ๋กฌํํธ ํ ์คํธ ๋ณํ
- Tokenizer: ํ ์คํธ โ ํ ํฐ ID + control token ์ฒ๋ฆฌ
- ๋ชจ๋ธ ์ถ๋ก : fine-tuning์ผ๋ก ํ์ต๋ tool call ํจํด ๊ธฐ๋ฐ ํ๋จ
- Constrained Decoding: JSON schema์ ๋ง๋ ํ ํฐ๋ง ํ์ฉ
- ์ถ๋ ฅ ํ์: ์์ฑ๋ ํ ํฐ โ structured JSON ๋ณํ
Non-native ๋ชจ๋ธ์ ์๋ ๊ฒ
์คํ์์ค ๋ชจ๋ธ(Llama, Gemma, Mistral ๋ก์ปฌ ๋ฑ)์ HuggingFace์์ ๋ค์ด๋ก๋ํ๋ฉด, ๋ฐ๋ ๊ฒ์ ๋ชจ๋ธ ๊ฐ์ค์น ํ์ผ์ด๋ค. ์ ๋ ์ด์ด๋ค์ ํฌํจ๋์ด ์์ง ์๋ค:
| ๋ ์ด์ด | Native (Claude, GPT) | Non-native (Llama ๋ก์ปฌ) |
|---|---|---|
| Chat Template | API ์๋ฒ์ ๋ด์ฅ | ์์. ๊ฐ๋ฐ์๊ฐ ์ง์ ํ๋กฌํํธ ์กฐ๋ฆฝ |
| Control Token | vocabulary์ ํฌํจ | ๋ชจ๋ธ์ ๋ฐ๋ผ ๋ค๋ฆ. ์์ ์ ์์ |
| Tool call fine-tuning | ์๋ฃ๋จ | ์๊ฑฐ๋ ๋ถ์์ . ๋ฒ์ฉ ๋ชจ๋ธ์ tool call ํจํด ๋ฏธํ์ต |
| Constrained Decoding | API ์๋ฒ์ ๋ด์ฅ | ์์. ๋ชจ๋ธ์ด ์๋ฌด ํ ํฐ์ด๋ ์์ฑ ๊ฐ๋ฅ |
| ์ถ๋ ฅ ํ์ | API ์๋ฒ์ ๋ด์ฅ | ์์. ๋ชจ๋ธ ์ถ๋ ฅ์์ tool call์ ์ง์ ์ถ์ถํด์ผ ํจ |
| Tool ์คํ ๋ฃจํ | SDK์ ๋ด์ฅ (toolRunner ๋ฑ) | ์์. ์ง์ ๊ตฌํ |
ํต์ฌ: Non-native ๋ชจ๋ธ์์ tool calling์ ํ๋ ค๋ฉด, ์ด ๋ชจ๋ ๋ ์ด์ด๋ฅผ ์ธ๋ถ์์ ๊ตฌํํด์ผ ํ๋ค. ์ด๊ฒ์ ๋ด๋นํ๋ ๊ฒ์ด Middleware๋ค.
Middleware - ์๋ ๋ ์ด์ด๋ฅผ ์ธ๋ถ์์ ๋ฉ์ด๋ค
sequenceDiagram autonumber box ๊ฐ๋ฐ์ ์์ญ participant Dev as ๊ฐ๋ฐ์ end box Middleware (์ธ๋ถ ๊ตฌํ) participant CT as ํ๋กฌํํธ ์กฐ๋ฆฝ participant P as ์ถ๋ ฅ ํ์ฑ end box ์คํ์์ค ๋ชจ๋ธ participant LLM as ๋ชจ๋ธ ๊ฐ์ค์น end Dev->>CT: tools ์ ์ + "์์ธ ๋ ์จ ์๋ ค์ค" CT->>LLM: tool ์ ์๋ฅผ ํฌํจํ ํ ์คํธ ํ๋กฌํํธ LLM-->>P: ํ ์คํธ ์ถ๋ ฅ (XML ๋ฑ ํจํด ํฌํจ) P->>P: tool call ํจํด ๊ฐ์ง ๋ฐ JSON ์ถ์ถ P-->>Dev: tool_use: get_weather("Seoul") Note over Dev: tool ์คํ ํ ๊ฒฐ๊ณผ ๋ฐํ Dev->>CT: tool_result: "15ยฐC, ๋ง์" CT->>LLM: ๊ฒฐ๊ณผ ํฌํจ ํ๋กฌํํธ LLM-->>P: ์ต์ข ํ ์คํธ ์๋ต P-->>Dev: "์์ธ์ ํ์ฌ ๋ ์จ๋ 15ยฐC์ ๋๋ค"
Middleware๊ฐ ๋ด๋นํ๋ 3๊ฐ์ง ์ญํ :
- ํ๋กฌํํธ ์กฐ๋ฆฝ: tool ์ ์๋ฅผ ๋ชจ๋ธ์ด ์ดํดํ ์ ์๋ ํ ์คํธ๋ก ๋ณํ (Chat Template ๋์ฒด)
- ์ถ๋ ฅ ํ์ฑ: ๋ชจ๋ธ์ด ์์ฑํ ํ ์คํธ์์ tool call ํจํด์ ๊ฐ์งํ๊ณ JSON์ผ๋ก ์ถ์ถ
- ์คํ ๋ฃจํ: tool ์คํ โ ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋ธ์ ํผ๋๋ฐฑ โ ์ถ๊ฐ tool call ํ์ธ โ ๋ฐ๋ณต
์ค์ ๊ตฌํ์ฒด: ai-sdk-tool-call-middleware
Vercel AI SDK์ middleware ๊ตฌ์กฐ๋ฅผ ํ์ฉํ๋ฉด, native tool calling์ ์ง์ํ์ง ์๋ ๋ชจ๋ธ์๋ tool calling์ ๋ถ์ผ ์ ์๋ค:
import { wrapLanguageModel } from "ai";
import { toolCallMiddleware } from "@ai-sdk-tool/parser";
// ์คํ์์ค ๋ชจ๋ธ์ middleware๋ก ๊ฐ์ธ๊ธฐ
const wrappedModel = wrapLanguageModel({
model: ollamaModel, // tool calling ๋ฏธ์ง์ ๋ชจ๋ธ
middleware: toolCallMiddleware({
protocol: "xml", // XML ํ์์ผ๋ก tool call ์ธ์ฝ๋ฉ
}),
});
// ์ด์ native tool calling์ฒ๋ผ ์ฌ์ฉ ๊ฐ๋ฅ
const result = await generateText({
model: wrappedModel,
tools: { /* tool ์ ์ */ },
prompt: "์์ธ ๋ ์จ ์๋ ค์ค",
});middleware๊ฐ ๋ด๋ถ์ ์ผ๋ก ํ๋ ์ผ:
toolsJSON์ XML ํ์์ ์์คํ ํ๋กฌํํธ๋ก ๋ณํ (Chat Template ๋์ฒด)- ๋ชจ๋ธ ์ถ๋ ฅ์์
<tool_call>ํจํด์ ๊ฐ์งํ์ฌ ํ์ฑ (์ถ๋ ฅ ํ์ ๋์ฒด) - ํ์ฑ๋ ๊ฒฐ๊ณผ๋ฅผ AI SDK์ tool_use ํ์์ผ๋ก ๋ณํ
๋ณด์: control token์ด ์๋ค๋ ๊ฒ์ ์๋ฏธ
3ํธ์์ Native ๋ชจ๋ธ์ control token์ผ๋ก tool ์ ์ ์์ญ์ ๋ณดํธํ๋ค๊ณ ์ค๋ช
ํ๋ค. Middleware ๋ฐฉ์์์๋ control token์ด ์๋ค. tool ์ ์๊ฐ ์ผ๋ฐ ํ
์คํธ๋ก ํ๋กฌํํธ์ ์ฝ์
๋๋ฏ๋ก, ์ด๋ก ์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ํ๋กฌํํธ์ <tool_call> ๊ฐ์ ํจํด์ ์ฝ์
ํ์ฌ injectionํ ์ํ์ด Native๋ณด๋ค ๋๋ค.
๋ค๋ง ์์ ํ ๋ฌด๋ฐฉ๋น๋ ์๋๋ค. middleware๋ ์ถ๋ ฅ ์ธก์์ ์ ํด์ง XML ํจํด๋ง ๊ฐ์งํ๊ณ , ์ ๋ ฅ์ ์ฌ์ฉ์ ๋ฉ์์ง ์์ญ๊ณผ ์์คํ ํ๋กฌํํธ ์์ญ์ ๋ถ๋ฆฌํ์ฌ ์ฒ๋ฆฌํ๋ค. ํ์ง๋ง Native ๋ชจ๋ธ์ control token ์์ค์ ๋ณด์์ ์ ๊ณตํ์ง ๋ชปํ๋ค๋ ํ๊ณ๊ฐ ์๋ค.
๋ณด์์ด ํนํ ์ค์ํ B2B ํ๊ฒฝ์ด๋ผ๋ฉด, ์คํ์์ค ๋ชจ๋ธ์ ์จํ๋ ๋ฏธ์ค๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค. ๋ฐ์ดํฐ๊ฐ ์ธ๋ถ ๋ฒค๋ ์๋ฒ๋ก ์ ์ก๋์ง ์์ผ๋ฏ๋ก, injection ์ํ๊ณผ ๋ณ๊ฐ๋ก ๋ฐ์ดํฐ ์ ์ถ ์์ฒด๋ฅผ ์์ฒ ์ฐจ๋จํ ์ ์๋ค.
Vercel AI SDK์ middleware๋ ์ด ๊ตฌ์ฑ์์ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. middleware๋ npm ํจํค์ง(ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ)์ผ ๋ฟ์ด๋ฏ๋ก, ์ด๋์ ์คํ๋๋๋๋ ๊ฐ๋ฐ์๊ฐ ๊ฒฐ์ ํ๋ค. ๊ณ ๊ฐ์ฌ ์๋ฒ์์ ์คํํ๋ฉด ๋ฐ์ดํฐ๊ฐ Vercel ์๋ฒ๋ก ์ ์ก๋์ง ์๋๋ค.
๊ฐ ๊ตฌ์ฑ์์์ ์คํ ์์น
ํผ๋ํ๊ธฐ ์ฌ์ด ์ : โVercel AI SDKโ๋ผ๋ ์ด๋ฆ ๋๋ฌธ์ Vercel ํด๋ผ์ฐ๋๋ฅผ ๊ฒฝ์ ํ๋ค๊ณ ์คํดํ ์ ์๋ค. ํ์ง๋ง SDK๋, middleware๋, vLLM๋ ๋ชจ๋ ์์ฒด ์๋ฒ์์ ์คํ๋๋ ์ํํธ์จ์ด๋ค.
| ๊ตฌ์ฑ์์ | ์ ์ฒด | ์ค์น ๋ฐฉ๋ฒ | ๋ฐ์ดํฐ๊ฐ ์ธ๋ถ๋ก ๋๊ฐ๋๊ฐ |
|---|---|---|---|
| vLLM | ๋ก์ปฌ ์๋น ํ๋ ์์ํฌ | pip install vllm โ ์์ฒด ์๋ฒ์์ ์คํ | ๋๊ฐ์ง ์์. localhost์์ API ์ ๊ณต |
| Vercel AI SDK | npm ํจํค์ง (ํด๋ผ์ด์ธํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ) | npm install ai โ ์์ฒด ์ฝ๋์์ import | ๋๊ฐ์ง ์์. Vercel ํด๋ผ์ฐ๋์ ๋ฌด๊ด |
| @ai-sdk-tool/parser | npm ํจํค์ง (middleware) | npm install @ai-sdk-tool/parser | ๋๊ฐ์ง ์์. ๋ก์ปฌ์์ ํ๋กฌํํธ ๋ณํ/ํ์ฑ |
๋ฐ์ดํฐ๊ฐ ์ธ๋ถ๋ก ๋๊ฐ๋๋๋ SDK ์์ฒด๊ฐ ์๋๋ผ, SDK์ ์ด๋ค ๋ชจ๋ธ์ ์ฐ๊ฒฐํ๋๋์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค:
anthropic("claude-opus-4-6") โ Anthropic ์๋ฒ๋ก ์์ฒญ (์ธ๋ถ ๋๊ฐ)
ollama("qwen3:8b") โ localhost Ollama๋ก ์์ฒญ (์ธ๋ถ ์ ๋๊ฐ)
createOpenAICompatible({ baseURL: "http://๋ด์๋ฒ:8000/v1" }) โ ์์ฒด vLLM์ผ๋ก ์์ฒญ (์ธ๋ถ ์ ๋๊ฐ)
์จํ๋ ๋ฏธ์ค ๊ตฌ์ฑ ์์
์์ฒด ์๋ฒ (๋ด๋ถ๋ง)
โโโ vLLM (๋ชจ๋ธ ์๋น) โ pip install, localhost:8000
โโโ Vercel AI SDK (npm ํจํค์ง) โ npm install, ๊ฐ์ ์๋ฒ์์ ์คํ
โโโ @ai-sdk-tool/parser (npm) โ npm install, ๊ฐ์ ์๋ฒ์์ ์คํ
โโโ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ โ tool ์ ์ + ์คํ ํจ์
๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๊ณ ๊ฐ์ฌ ๋ด๋ถ๋ง์์ ์ฒ๋ฆฌ, ์ธ๋ถ ํต์ ์์.
Harness ์ค๊ณ๊ฐ ์ฑ๋ฅ์ ๊ฒฐ์ ํ๋ค
AI harness๋ โ๋ชจ๋ธ์ โ๋งํ๋ ๋โ์์ โ์ผํ๋ ์์คํ โ์ผ๋ก ๋ง๋๋ ์ ์ฒด ์คํ ํ๋ ์(์ค์บํด๋ฉ)โ์ด๋ค. Orchestration, Memory, Tools, Verification, Artifacts๋ฅผ ๋ชจ๋ ํฌํจํ๋ค (Anthropic, The Harness Problem ๋ชจ๋ ๋์ผํ ๋์ ์๋ฏธ๋ก ์ ์).
The Harness Problem ๋ธ๋ก๊ทธ๋ ์ด harness์ ๊ตฌ์ฑ์์ ์ค Tools ๋ ์ด์ด์ ํ์ ์ค๊ณ๋ฅผ ์คํ์ผ๋ก ๊ฒ์ฆํ๋ค. โ์ฝ๋ ํธ์งโ์ด๋ผ๋ ๊ณผ์ ์์, tool์ด ์์ ์ฌํญ์ ์ด๋ค ํ์์ผ๋ก ํํํ๋๋์ ๋ฐ๋ผ ์ฑ๋ฅ์ด ๊ทน์ ์ผ๋ก ๋ฌ๋ผ์ง๋ค๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค.
harness (์ ์ฒด ์คํ ํ๋ ์)
โโโ Orchestration (๊ณํ โ ์คํ โ ๊ด์ฐฐ ๋ฃจํ)
โโโ Memory (์ํ ๋ณด์กด, ์ธ์
๋ธ๋ฆฌ์ง)
โโโ Tools โ The Harness Problem์ด ์คํํ ์์ญ
โ โโโ ์ฝ๋ ํธ์ง tool์ ํ์
โ โโโ patch
โ โโโ str_replace
โ โโโ hashline
โโโ Verification (ํ
์คํธ, ๊ฒ์ฆ)
โโโ Artifacts (๋ก๊ทธ, git history)
16๊ฐ ๋ชจ๋ธ์ ๋์์ผ๋ก ์ฝ๋ ํธ์ง tool์ 3๊ฐ์ง ํ์์ ๋น๊ตํ ๊ฒฐ๊ณผ:
| tool ํ์ | ๋์ ๋ฐฉ์ | ๋ํ์ ๋ฌธ์ |
|---|---|---|
| patch | diff ํ์์ผ๋ก ์์ ํํ (- ์ญ์ , + ์ถ๊ฐ) | Grok 4: 50.7% ์คํจ. diff ๋ฌธ๋ฒ ์์ฑ ์์ฒด์์ ์ค๋ฅ ๋ฐ์ |
| str_replace | ์๋ณธ ํ ์คํธ๋ฅผ ์ ํํ ๋งค์นญํ์ฌ ๊ต์ฒด | ๊ณต๋ฐฑ/๋ค์ฌ์ฐ๊ธฐ ๋ถ์ผ์น๋ก โString to replace not foundโ ๋น๋ฒ |
| hashline | ๋ผ์ธ๋ณ content hash๋ก ์์น๋ฅผ ์ฐธ์กฐ | ๋๋ถ๋ถ์ ๋ชจ๋ธ์์ str_replace์ ๋๋ฑํ๊ฑฐ๋ ์ฐ์ธ |
ํต์ฌ ์ธ์ฌ์ดํธ:
โ๋ชจ๋ธ์ด ๊ณผ์ ๋ฅผ ์ดํดํ์ง ๋ชปํ๋ ๊ฒ์ด ์๋๋ค. harness(์ tool ํ์ ์ค๊ณ)์์ ์คํจํ๋ ๊ฒ์ด๋ค.โ
Grok Code Fast ๋ชจ๋ธ์ ๊ฒฝ์ฐ, tool ํ์๋ง ๋ณ๊ฒฝํ์ฌ 6.7% โ 68.3% (10๋ฐฐ ํฅ์)๋ฅผ ๋ฌ์ฑํ๋ค. ์ด๊ฒ์ ๋ชจ๋ธ ์์ฒด๋ฅผ ์ ๊ทธ๋ ์ด๋ํ ๊ฒ์ด ์๋๋ผ, harness์ tool ํ์ ์ค๊ณ๋ง ๋ฐ๊พผ ๊ฒฐ๊ณผ๋ค.
hashline์ ๋์ ๋ฐฉ์
hashline์ ์ ํ์์ ๋ณด๋ฏ patch, str_replace์ ๊ฐ์ ๋ ๋ฒจ์ ์ฝ๋ ํธ์ง tool ํ์ ์ค ํ๋๋ค. ํ์ผ์ ์ฝ์ ๋ ๊ฐ ๋ผ์ธ์ content hash๋ฅผ ๋ถ์ฌ:
1:a3|function hello() {
2:f1| return "world";
3:0e|}
๋ชจ๋ธ์ ์ ํํ ํ ์คํธ๋ฅผ ์ฌํํ ํ์ ์์ด, hash๋ก ๋ผ์ธ์ ์ฐธ์กฐ:
- โ๋ผ์ธ
2:f1์ ๊ต์ฒดํด์คโ - โ๋ผ์ธ
1:a3๋ถํฐ3:0e๊น์ง ๋ฒ์๋ฅผ ๊ต์ฒดํด์คโ - hash๊ฐ ๋ถ์ผ์นํ๋ฉด ํ์ผ์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด๋ฏ๋ก ์๋์ผ๋ก ๊ฐ์ง
vLLM - ์๋น ํ๋ ์์ํฌ์ ์ญํ
์คํ์์ค ๋ชจ๋ธ์ ๋ค์ด๋ก๋ํ๋ฉด ๋ชจ๋ธ ๊ฐ์ค์น๋ง ์กด์ฌํ๋ค. ์ด๊ฒ์ OpenAI API ํธํ HTTP ์๋ฒ๋ก ๊ฐ์ธ์, Claude/GPT API์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ฃผ๋ ๊ฒ์ด vLLM ๊ฐ์ ์๋น ํ๋ ์์ํฌ๋ค.
vLLM์ด ์ ๊ณตํ๋ ๊ฒ:
- tool parser: ๋ชจ๋ธ๋ณ tool call ์ถ๋ ฅ ํ์์ ๊ฐ์งํ์ฌ OpenAI API ํธํ ํํ๋ก ๋ณํ (Hermes, Mistral, Llama ๋ฑ ์ ์ฉ ํ์)
- guided decoding: constrained decoding์ ์๋น ๋ ๋ฒจ์์ ์ง์ (4ํธ์์ ๋ค๋ฃฌ JSON schema ๊ฐ์ )
- chat template: ๋ชจ๋ธ์
tokenizer_config.json์์ chat template์ ์๋ ๋ก๋ (2ํธ์์ ๋ค๋ฃฌ ๋ณํ ์๋ํ)
๋ค์ ํธ: ๊ทธ๋ฌ๋ฉด ์ง์ ๋ง๋ค์ด๋ณด์
์ด ๊ธ์์ Native ๋ชจ๋ธ๊ณผ Non-native ๋ชจ๋ธ์ ๊ตฌ์กฐ์ ์ฐจ์ด๋ฅผ ํ์ธํ๋ค. Non-native ๋ชจ๋ธ์๋ 5๊ฐ ๋ ์ด์ด ์ค ๋๋ถ๋ถ์ด ์๊ณ , ์ด๋ฅผ ์ธ๋ถ์์ ๋ฉ์ฐ๋ ๊ฒ์ด Middleware๋ค.
๋ค์ ํธ์์๋ ์ด Middleware๋ฅผ ์ง์ ๋ง๋ค์ด๋ณธ๋ค. ํ๋กฌํํธ ์กฐ๋ฆฝ, ์ถ๋ ฅ ํ์ฑ, ์คํ ๋ฃจํ์ 3๊ฐ์ง ์ญํ ์ ์ฝ๋๋ก ๊ตฌํํ๋ค.
์ฐธ๊ณ ๋ฌธ์
- ai-sdk-tool-call-middleware - ์ค์ middleware ๊ตฌํ์ฒด (Vercel AI SDK ๊ธฐ๋ฐ)
- ai-sdk-tool-call-middleware PR #178 - XML protocol ๊ฐ์
- The Harness Problem - harness ์ค๊ณ๊ฐ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ, hashline ์๊ฐ. Grok Code Fast 6.7% โ 68.3%
- Vercel AI SDK - Language Model Middleware - wrapLanguageModel, middleware ๊ตฌ์กฐ
- vLLM - Tool Calling - ์๋น ํ๋ ์์ํฌ์ tool parser, guided decoding
- @ai-sdk-tool/parser npm - XML/Hermes ํ๋กํ ์ฝ ๊ธฐ๋ฐ tool call parser middleware