[AI] 플랫폼 별 다른 Tool Calling
최근 AI 모델은 단순히 대답하는 것을 넘어, 외부 API를 호출하고 데이터를 가져오는 '행동'을 수행할 수 있게 되었습니다.
이 핵심 기술이 바로 **'툴 콜링(Tool Calling)'**입니다.
하지만 OpenAI, Anthropic, DeepSeek 등 주요 AI 플랫폼들은 툴을 호출하는 방식, 특히 API 응답 형식이 모두 다릅니다.
또한 OpenAI는 GPT-5를 출시하며 기존의 Chat Completions API 외에 Conversations API와 Responses API라는 새로운 방식을 도입했습니다.
이 글에서는 개발자가 AI 에이전트를 구축할 때 반드시 알아야 할 두 가지 핵심 주제를 정리합니다.
1. 플랫폼별 툴 콜링 응답 형식 비교
2. OpenAI의 3가지 API 비교 (Chat vs Conversations vs Responses)
1. 플랫폼별 툴 콜링 비교
모델이 사용자의 요청(예: "서울 날씨 알려줘")을 받고 get_weather라는 도구를 호출해야겠다고 판단했을 때, 개발자에게 보내는 JSON 응답은 다음과 같이 다릅니다.
OpenAI (GPT-4o/5) 및 DeepSeek
OpenAI가 사실상의 표준을 만들었고 DeepSeek이 이를 따릅니다. 텍스트 응답(content)과 툴 호출(tool_calls)이 분리된 필드에 담겨 오는 것이 특징입니다.
- 구조: content 필드와 별개로 tool_calls라는 배열이 존재합니다.
- 인자(Arguments): JSON **문자열(String)**로 반환됩니다. (파싱 필요)
- 특징 (최신 모델): GPT-4o 이후 모델부터는 content에 "날씨를 확인해 볼게요."와 같은 텍스트와 tool_calls가 동시에 반환될 수 있습니다.
예시 응답 (OpenAI/DeepSeek):
{
"role": "assistant",
"content": "네, 서울의 현재 날씨를 확인해 보겠습니다.", // 텍스트와 툴 콜이 공존
"tool_calls": [
{
"id": "call_abc123",
"type": "function",
"function": {
"name": "get_current_weather",
"arguments": "{\"location\": \"Seoul\", \"unit\": \"celsius\"}" // <-- JSON 문자열
}
}
]
}Anthropic (Claude)
Anthropic은 텍스트와 툴 사용을 '콘텐츠 블록'의 일부로 취급하는, 근본적으로 다른 구조를 사용합니다.
- 구조: tool_calls라는 별도 필드가 없습니다. 대신 content 배열 내부에 type: "tool_use" 라는 블록으로 포함됩니다.
- 인자(Input): JSON 문자열이 아닌 JSON 객체(Object) 그 자체로 반환됩니다.
- 특징: content 배열 안에 type: "text" 블록과 type: "tool_use" 블록이 자연스럽게 섞여 들어옵니다.
예시 응답 (Anthropic):
{
"role": "assistant",
"content": [
{
"type": "text",
"text": "네, 서울의 날씨를 확인해 보겠습니다." // <-- 텍스트 블록
},
{
"type": "tool_use", // <-- 툴 사용 블록
"id": "tool_call_xyz789",
"name": "get_current_weather",
"input": { // <-- JSON 객체
"location": "Seoul",
"unit": "celsius"
}
}
]
}📊 툴 콜링 비교 요약표
| 특징 | OpenAI / DeepSeek | Anthropic (Claude) |
|---|---|---|
| 반환 위치 | 메시지 객체 내 tool_calls 배열 | 메시지 객체 내 content 배열 |
| 인자 형식 | JSON 문자열 (String) | JSON 객체 (Object) |
| 텍스트와 혼용 | GPT-4o부터 가능 | 기본 구조 (블록 방식) |
개발자 Tip: Anthropic(Claude) 방식으로 개발하면 OpenAI/DeepSeek과 호환되지 않습니다. 만약 여러 모델을 동시에 지원해야 한다면, 각 플랫폼의 응답을 표준화된 형식으로 변환하는 '어댑터(Adapter)' 계층을 구현하는 것이 좋습니다.