jhpka's blog

[AI] 플랫폼 별 다른 Tool Calling

Admin User

최근 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):

json
{
  "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):

json
{
  "role": "assistant",
  "content": [
    {
      "type": "text",
      "text": "네, 서울의 날씨를 확인해 보겠습니다." // <-- 텍스트 블록
    },
    {
      "type": "tool_use", // <-- 툴 사용 블록
      "id": "tool_call_xyz789",
      "name": "get_current_weather",
      "input": { // <-- JSON 객체
        "location": "Seoul",
        "unit": "celsius"
      }
    }
  ]
}

📊 툴 콜링 비교 요약표

특징OpenAI / DeepSeekAnthropic (Claude)
반환 위치메시지 객체 내 tool_calls 배열메시지 객체 내 content 배열
인자 형식JSON 문자열 (String)JSON 객체 (Object)
텍스트와 혼용GPT-4o부터 가능기본 구조 (블록 방식)

개발자 Tip: Anthropic(Claude) 방식으로 개발하면 OpenAI/DeepSeek과 호환되지 않습니다. 만약 여러 모델을 동시에 지원해야 한다면, 각 플랫폼의 응답을 표준화된 형식으로 변환하는 '어댑터(Adapter)' 계층을 구현하는 것이 좋습니다.

댓글을 불러오는 중...