์‹œ๋ฆฌ์ฆˆ: LLM Tool Calling ๋‚ด๋ถ€ ์›๋ฆฌ๋ถ€ํ„ฐ ์—์ด์ „ํŠธ ์ง์ ‘ ๊ตฌํ˜„๊นŒ์ง€

์ด ์‹œ๋ฆฌ์ฆˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ž์—ฐ์–ด ํ•œ ์ค„์ด tool ์‹คํ–‰์œผ๋กœ ๋ฐ”๋€Œ๋Š” ๋‚ด๋ถ€ ์ฒ˜๋ฆฌ ๊ณผ์ •์„ ๋‹จ๊ณ„๋ณ„๋กœ ํ•ด๋ถ€ํ•˜๊ณ , ์ตœ์ข…์ ์œผ๋กœ ์˜คํ”ˆ์†Œ์Šค ๋ชจ๋ธ + ์ž์ฒด middleware๋กœ ๋‚˜๋งŒ์˜ ์—์ด์ „ํŠธ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด๋‹ค.

ํŽธ๋‚ด์šฉํ•ต์‹ฌ
1ํŽธ์ „์ฒด ์กฐ๊ฐ๋„์ž์—ฐ์–ด โ†’ tool ์‹คํ–‰๊นŒ์ง€ 5๊ฐœ ๋ ˆ์ด์–ด์˜ ์กด์žฌ๋ฅผ ํ™•์ธ
2ํŽธ (๋ณธ๋ฌธ)Chat TemplateJSON์ด ๋ชจ๋ธ์— ์ง์ ‘ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค
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 = ์—์ด์ „ํŠธ ์™„์„ฑ

  • Chat Template์€ API๊ฐ€ ๋ฐ›์€ tools JSON๊ณผ messages๋ฅผ ๋ชจ๋ธ์ด ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•˜๋‚˜์˜ ๊ธด ํ”„๋กฌํ”„ํŠธ ํ…์ŠคํŠธ๋กœ ์กฐ๋ฆฝํ•˜๋Š” ๋ณ€ํ™˜ ๋ ˆ์ด์–ด
  • LLM์€ JSON์„ ์ง์ ‘ ํŒŒ์‹ฑํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ชจ๋“  ์ž…๋ ฅ์€ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋˜์–ด ๋ชจ๋ธ์— ์ „๋‹ฌ๋˜๋Š” ๊ตฌ์กฐ์  ์ „์ฒ˜๋ฆฌ ๊ณผ์ •
  • ๋ฒค๋”๋งˆ๋‹ค ๋ณ€ํ™˜ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋ฉฐ(Claude๋Š” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ, OpenAI๋Š” ๋น„๊ณต๊ฐœ ํ…œํ”Œ๋ฆฟ, Gemini๋Š” function_declarations, Mistral์€ control token, GLM์€ XML ํƒœ๊ทธ), ์ด๊ฒƒ์ด ๋ชจ๋ธ์ด ์‹ค์ œ๋กœ ๋ณด๋Š” ์ž…๋ ฅ์˜ ์‹ค์ฒด

ํ•ด๋‹น ๊ฐœ๋…์ด ํ•„์š”ํ•œ ์ด์œ 

  • 1ํŽธ์—์„œ 5๊ฐœ ๋ ˆ์ด์–ด ์ค‘ ์ฒซ ๋ฒˆ์งธ๊ฐ€ Chat Template์ด๋ผ๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ โ€œJSON์ด ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜๋œ๋‹คโ€๋Š” ๊ฒƒ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์˜๋ฏธ์ธ์ง€๋Š” ์•„์ง ๋ธ”๋ž™๋ฐ•์Šค๋‹ค
  • tool ์ •์˜๋ฅผ ์ž˜ ์ž‘์„ฑํ•˜๋ ค๋ฉด, ๊ทธ๊ฒƒ์ด ๋ชจ๋ธ์—๊ฒŒ ์–ด๋–ค ํ˜•ํƒœ๋กœ ๋ณด์ด๋Š”์ง€ ์•Œ์•„์•ผ ํ•œ๋‹ค. description์ด ๊ธธ๋ฉด ํ† ํฐ์„ ๋งŽ์ด ์†Œ๋น„ํ•˜๋Š” ์ด์œ ๋„ ์—ฌ๊ธฐ์— ์žˆ๋‹ค
  • ๋ฒค๋”๋งˆ๋‹ค ๋ณ€ํ™˜ ํ˜•ํƒœ๊ฐ€ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์€, ๊ฐ™์€ tool ์ •์˜๋„ ๋ชจ๋ธ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒŒ ํ•ด์„๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค

AS-IS

sequenceDiagram
    autonumber
    box ๊ฐœ๋ฐœ์ž ์˜์—ญ
        participant Dev as ๊ฐœ๋ฐœ์ž
    end
    box AI ์„œ๋น„์Šค ์˜์—ญ
        participant API as API ์„œ๋ฒ„
        participant LLM as LLM
    end

    Dev->>API: tools JSON + messages JSON
    Note over API,LLM: JSON์ด ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ์— ๋“ค์–ด๊ฐ„๋‹ค?
    LLM-->>API: tool_use ์‘๋‹ต

TO-BE

sequenceDiagram
    autonumber
    box ๊ฐœ๋ฐœ์ž ์˜์—ญ
        participant Dev as ๊ฐœ๋ฐœ์ž
    end
    box AI ์„œ๋น„์Šค ์˜์—ญ
        participant API as API ์„œ๋ฒ„
        participant CT as Chat Template
        participant LLM as LLM
    end

    Dev->>API: tools JSON + messages JSON
    API->>CT: JSON ๋ถ„ํ•ด
    CT->>LLM: ํ•˜๋‚˜์˜ ๊ธด ํ”„๋กฌํ”„ํŠธ ํ…์ŠคํŠธ
    Note over CT,LLM: "In this environment you have access to..."
    LLM-->>API: tool_use ์‘๋‹ต

API JSON์€ ๋ชจ๋ธ์— ์ง์ ‘ ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค

๊ฐœ๋ฐœ์ž๊ฐ€ API์— ๋ณด๋‚ด๋Š” ๊ฒƒ์€ structured JSON์ด๋‹ค:

const response = await anthropic.messages.create({
  model: "claude-opus-4-6",
  tools: [{
    name: "get_weather",
    description: "Get the current weather in a given location",
    input_schema: {
      type: "object",
      properties: {
        location: { type: "string", description: "The city and state" }
      },
      required: ["location"]
    }
  }],
  messages: [{ role: "user", content: "์„œ์šธ ๋‚ ์”จ ์•Œ๋ ค์ค˜" }]
});

ํ•˜์ง€๋งŒ LLM์€ JSON ํŒŒ์„œ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์ด JSON์€ API ์„œ๋ฒ„์—์„œ Chat Template์„ ํ†ตํ•ด ํ•˜๋‚˜์˜ ํ…์ŠคํŠธ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜๋œ ํ›„ ๋ชจ๋ธ์— ์ „๋‹ฌ๋œ๋‹ค.

Claude์˜ Chat Template - ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์‚ฝ์ž…

Anthropic์€ ๊ณต์‹ ๋ฌธ์„œ์—์„œ ์ด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณต๊ฐœํ•˜๊ณ  ์žˆ๋‹ค. tools ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด API๊ฐ€ ์ž๋™์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค:

In this environment you have access to a set of tools you can use to answer the user's question.
{{ FORMATTING INSTRUCTIONS }}
String and scalar parameters should be specified as is, while lists and objects should use JSON format.
Note that spaces for string values are not stripped.
The output is not expected to be valid XML and is parsed with regular expressions.
Here are the functions available in JSONSchema format:
{{ TOOL DEFINITIONS IN JSON SCHEMA }}
{{ USER SYSTEM PROMPT }}
{{ TOOL CONFIGURATION }}

์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๋‚ธ tools JSON ๋ฐฐ์—ด์ด {{ TOOL DEFINITIONS IN JSON SCHEMA }} ์ž๋ฆฌ์— ํ…์ŠคํŠธ๋กœ ์‚ฝ์ž…๋œ๋‹ค. ๋ชจ๋ธ ์ž…์žฅ์—์„œ๋Š” ์ด๊ฒƒ์ด ๊ทธ๋ƒฅ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์˜ ์ผ๋ถ€ ํ…์ŠคํŠธ์ผ ๋ฟ์ด๋‹ค.

์ด๊ฒƒ์ด ์˜๋ฏธํ•˜๋Š” ๊ฒƒ:

  • tool์˜ description์ด ๊ธธ์ˆ˜๋ก ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ๊ฐ€ ๊ธธ์–ด์ง€๊ณ , ์ž…๋ ฅ ํ† ํฐ์ด ์ฆ๊ฐ€ํ•œ๋‹ค
  • Anthropic ๊ณต์‹ ๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด tool use ์‹œ ๋ชจ๋ธ๋ณ„๋กœ 313~530๊ฐœ์˜ ์ถ”๊ฐ€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํ† ํฐ์ด ์†Œ๋น„๋œ๋‹ค (tool ์ •์˜ ํ† ํฐ ์ œ์™ธ)
  • โ€œ๋ชจ๋ธ์ด tool์„ ์ดํ•ดํ•œ๋‹คโ€๋Š” ๊ฒƒ์€ ๋งˆ๋ฒ•์ด ์•„๋‹ˆ๋ผ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ ํžŒ ์ง€์‹œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋‹ค

OpenAI(GPT)์˜ Chat Template - ๋น„๊ณต๊ฐœ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ

OpenAI๋Š” Claude์™€ ๋™์ผํ•˜๊ฒŒ tool ์ •์˜๋ฅผ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€์— ์‚ฝ์ž…ํ•˜์ง€๋งŒ, ์ •ํ™•ํ•œ ๋‚ด๋ถ€ ํฌ๋งท์€ ๊ณต๊ฐœํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ณต์‹์ ์œผ๋กœ ํ™•์ธ๋œ ๊ฒƒ:

  • tool ์ •์˜(description, param types ๋“ฑ)๊ฐ€ ํ”„๋กฌํ”„ํŠธ์˜ ์ผ๋ถ€๋กœ ๋ชจ๋ธ์— ์ „๋‹ฌ๋œ๋‹ค
  • ํŠน์ˆ˜ ํ† ํฐ์œผ๋กœ tool ์ •์˜์˜ ์‹œ์ž‘๊ณผ ๋์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถ”์ •๋˜์ง€๋งŒ, ์ •ํ™•ํ•œ ํ† ํฐ์€ ๋น„๊ณต๊ฐœ
  • tool ์ •์˜๋Š” ์ž…๋ ฅ ํ† ํฐ์œผ๋กœ ๊ณ„์‚ฐ๋˜์–ด ๊ณผ๊ธˆ๋œ๋‹ค

GPT-4.1 ๊ณต์‹ ๊ฐ€์ด๋“œ์—์„œ๋Š” tool ์Šคํ‚ค๋งˆ๋ฅผ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ง์ ‘ ์‚ฝ์ž…ํ•˜๋Š” ๋Œ€์‹  API์˜ tools ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. API๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•˜๋ฉด ๋ชจ๋ธ์ด ํ•™์Šต๋œ ๋‚ด๋ถ€ ํฌ๋งท์— ๋งž๊ฒŒ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜๋™ ์‚ฝ์ž… ๋Œ€๋น„ SWE-bench์—์„œ 2% ๋†’์€ ์„ฑ๋Šฅ์„ ๋ณด์˜€๋‹ค.

Gemini(Google)์˜ Chat Template - function_declarations

Gemini๋Š” OpenAPI ์Šคํ‚ค๋งˆ ํ˜ธํ™˜ ํ˜•์‹์œผ๋กœ tool์„ ์ •์˜ํ•œ๋‹ค:

const response = await ai.models.generateContent({
  model: "gemini-3-flash",
  contents: "์„œ์šธ ๋‚ ์”จ ์•Œ๋ ค์ค˜",
  config: {
    tools: [{
      functionDeclarations: [{
        name: "get_weather",
        description: "Get current weather by city name",
        parameters: {
          type: "object",
          properties: {
            city: { type: "string", description: "City name" }
          },
          required: ["city"]
        }
      }]
    }]
  }
});

Gemini๋„ ๋‚ด๋ถ€ ๋ณ€ํ™˜ ํฌ๋งท์„ ๊ณต๊ฐœํ•˜์ง€ ์•Š์ง€๋งŒ, Gemini 2.5/3 ์‹œ๋ฆฌ์ฆˆ๋Š” ๋‚ด๋ถ€ โ€œthinkingโ€ ๊ณผ์ •์„ ํ†ตํ•ด ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ• ์ง€, ์–ด๋–ค ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ํŒ๋‹จํ•œ๋‹ค.

Mistral์˜ Chat Template - Control Token

Mistral(ํ”„๋ž‘์Šค AI ๊ธฐ์—…, ๋Œ€ํ‘œ ๋ชจ๋ธ: Mistral Large, Mixtral, Codestral)์€ ๋‚ด๋ถ€ ํฌ๋งท์„ ๊ฐ€์žฅ ์ƒ์„ธํ•˜๊ฒŒ ๊ณต๊ฐœํ•œ ๋ฒค๋”๋‹ค. ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ control token์œผ๋กœ tool ์ •์˜ ์˜์—ญ์„ ๊ฐ์‹ผ๋‹ค:

<s>[AVAILABLE_TOOLS] [{"type": "function", "function": {"name": "calculator",
"description": "Performs mathematical calculations", "parameters": {"type":
"object", "properties": {"operation": {"type": "string"}},
"required": ["operation"]}}}] [/AVAILABLE_TOOLS]
[INST] What's 2+2? [/INST]
[TOOL_CALLS] [{"name": "calculator", "arguments": {"operation": "2+2"}}]</s>
[TOOL_RESULTS] [{"name": "calculator", "content": 4}] [/TOOL_RESULTS]
2+2=4</s>

์—ฌ๊ธฐ์„œ [AVAILABLE_TOOLS], [TOOL_CALLS], [TOOL_RESULTS]๋Š” ์ผ๋ฐ˜ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ control token์ด๋‹ค. ์ด ์ฐจ์ด๋Š” 3ํŽธ(Tokenization)์—์„œ ์ž์„ธํžˆ ๋‹ค๋ฃฌ๋‹ค.

ํ•ต์‹ฌ์€ ๋™์ผํ•˜๋‹ค: JSON์ด ๊ทธ๋Œ€๋กœ ๋ชจ๋ธ์— ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ํŠน์ • ํ˜•ํƒœ์˜ ํ…์ŠคํŠธ ์‹œํ€€์Šค๋กœ ๋ณ€ํ™˜๋œ๋‹ค.

GLM์˜ Chat Template - ํŠน์ˆ˜ ํ† ํฐ + XML ํƒœ๊ทธ

GLM(์ค‘๊ตญ ์นญํ™”๋Œ€ THUDM ํŒ€, ๋Œ€ํ‘œ ๋ชจ๋ธ: GLM-4, ChatGLM, GLM-4.6)์€ ํŠน์ˆ˜ ํ† ํฐ์œผ๋กœ ์—ญํ• ์„ ๊ตฌ๋ถ„ํ•˜๊ณ , XML ํƒœ๊ทธ๋กœ tool์„ ์ •์˜ํ•œ๋‹ค:

[gMASK]<sop><|system|>
# Tools
You may call one or more functions to assist with the user query.
You are provided with function signatures within <tools></tools> XML tags:
<tools>
{"type": "function", "function": {"name": "get_weather",
"description": "Get current weather by city name",
"parameters": {"type": "object", "properties":
{"city": {"type": "string"}}, "required": ["city"]}}}
</tools>
For each function call, output the function name and arguments within
the following XML format:
<tool_call>{function_name}<arg_key>{key}</arg_key>
<arg_value>{value}</arg_value></tool_call>
<|user|>
์„œ์šธ ๋‚ ์”จ ์•Œ๋ ค์ค˜
<|assistant|>
<think>

์—ฌ๊ธฐ์„œ:

  • [gMASK]<sop> - ๋ชจ๋ธ์˜ ์‹œ์ž‘ ํŠน์ˆ˜ ํ† ํฐ
  • <|system|>, <|user|>, <|assistant|> - ์—ญํ•  ๊ตฌ๋ถ„ ํŠน์ˆ˜ ํ† ํฐ
  • <tools>...</tools> - tool ์ •์˜ ์˜์—ญ
  • <tool_call>...<arg_key>...<arg_value>...</tool_call> - tool ํ˜ธ์ถœ ์ถœ๋ ฅ ํ˜•์‹
  • <think> - ๋ชจ๋ธ์˜ ์‚ฌ๊ณ  ๊ณผ์ • ์‹œ์ž‘

๋ฒค๋”๋ณ„ ๋น„๊ต

์„ธ ๋ฒค๋” ๋ชจ๋‘ โ€œJSON โ†’ ํ…์ŠคํŠธ ๋ณ€ํ™˜โ€์ด๋ผ๋Š” ๋™์ผํ•œ ๋ชฉ์ ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ๋ฐฉ์‹์ด ๋‹ค๋ฅด๋‹ค:

ClaudeOpenAI (GPT)GeminiMistralGLM
tool ์ •์˜ ์œ„์น˜์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ํ…์ŠคํŠธ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์‚ฝ์ž… (๋น„๊ณต๊ฐœ)๋น„๊ณต๊ฐœ[AVAILABLE_TOOLS] control token<tools> XML ํƒœ๊ทธ
์—ญํ•  ๊ตฌ๋ถ„API ๋ ˆ๋ฒจ์—์„œ ์ฒ˜๋ฆฌAPI ๋ ˆ๋ฒจ์—์„œ ์ฒ˜๋ฆฌAPI ๋ ˆ๋ฒจ์—์„œ ์ฒ˜๋ฆฌ[INST] ํƒœ๊ทธ<|system|> <|user|> ํŠน์ˆ˜ ํ† ํฐ
tool call ์ถœ๋ ฅJSON (์ •๊ทœ์‹ ํŒŒ์‹ฑ)JSON (๋น„๊ณต๊ฐœ ํŒŒ์‹ฑ)JSON (functionCall)[TOOL_CALLS] + JSON<tool_call> XML ํƒœ๊ทธ
๊ฒฝ๊ณ„ ํ‘œ์‹œํ…์ŠคํŠธ ์ง€์‹œ๋ฌธํŠน์ˆ˜ ํ† ํฐ (์ถ”์ •)๋น„๊ณต๊ฐœcontrol token (injection ๋ถˆ๊ฐ€)ํŠน์ˆ˜ ํ† ํฐ + XML
๋‚ด๋ถ€ ํฌ๋งท ๊ณต๊ฐœํ…œํ”Œ๋ฆฟ ๊ตฌ์กฐ ๊ณต๊ฐœ๋น„๊ณต๊ฐœ๋น„๊ณต๊ฐœํ† ํฐ ์ˆ˜์ค€ ๊ณต๊ฐœ๋ชจ๋ธ ์ฝ”๋“œ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ

ํ•ต์‹ฌ: ๊ฒฐ๊ตญ ๋ชจ๋“  ๊ฒƒ์€ ํ…์ŠคํŠธ

์„ธ ๋ฒค๋”์˜ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ๋ณด์ด์ง€๋งŒ, ๊ณตํ†ต์ ์€ ํ•˜๋‚˜๋‹ค:

API JSON โ†’ ํ•˜๋‚˜์˜ ๊ธด ํ…์ŠคํŠธ ์‹œํ€€์Šค โ†’ ๋ชจ๋ธ์— ์ž…๋ ฅ

๋ชจ๋ธ์€ ์ด ํ…์ŠคํŠธ๋ฅผ ์ฝ๊ณ :

  1. โ€œ์–ด๋–ค tool์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ์ง€โ€ ํŒŒ์•…ํ•˜๊ณ 
  2. โ€œ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌด์—‡์„ ์›ํ•˜๋Š”์ง€โ€ ์ดํ•ดํ•˜๊ณ 
  3. โ€œ์–ด๋–ค tool์„ ์–ด๋–ค ์ธ์ž๋กœ ํ˜ธ์ถœํ• ์ง€โ€ ๊ฒฐ์ •ํ•œ๋‹ค

์ด ๊ฒฐ์ •์ด ๋งˆ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ ํžŒ ์ง€์‹œ๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ฒƒ + fine-tuning์œผ๋กœ ํ•™์Šต๋œ ํŒจํ„ด์˜ ์กฐํ•ฉ์ด๋‹ค.

๋‹ค์Œ ํŽธ: ์ด ํ…์ŠคํŠธ๊ฐ€ ๋ชจ๋ธ์— ๋ฐ”๋กœ ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ๋„ ์•„๋‹ˆ๋‹ค

Chat Template์ด JSON์„ ํ…์ŠคํŠธ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋ชจ๋ธ์€ ํ…์ŠคํŠธ๋„ ์ง์ ‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค.

๋ชจ๋ธ์€ ์ˆ˜ํ•™ ์—ฐ์‚ฐ(ํ–‰๋ ฌ ๊ณฑ์…ˆ)์œผ๋กœ ๋™์ž‘ํ•˜๋ฏ€๋กœ, ํ…์ŠคํŠธ๋ฅผ **์ˆซ์ž(ํ† ํฐ ID)**๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณผ์ •์—์„œ Mistral์˜ [AVAILABLE_TOOLS] ๊ฐ™์€ control token์ด ์ผ๋ฐ˜ ํ…์ŠคํŠธ์™€ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋Š”์ง€๊ฐ€ ๋“œ๋Ÿฌ๋‚œ๋‹ค.

๋‹ค์Œ ํŽธ์—์„œ ์ด Tokenization ๊ณผ์ •์„ ์‚ดํŽด๋ณธ๋‹ค.

์ฐธ๊ณ  ๋ฌธ์„œ