함수 호출 정의 만들기

모델에 도구를 붙일 때 파라미터를 JSON Schema로 적어야 하는데, 손으로 쓰면 required를 빠뜨리거나 중첩 객체의 type을 잊습니다. 그 실수는 모델이 엉뚱한 인자를 넘겨야 드러납니다. 받고 싶은 인자를 예시로 넣으면 스키마를 뽑아 드립니다.

{
  "name": "get_weather",
  "description": "도시의 날씨를 가져온다",
  "input_schema": {
    "type": "object",
    "properties": {
      "city": {
        "type": "string",
        "description": ""
      },
      "days": {
        "type": "integer",
        "description": ""
      },
      "unit": {
        "type": "string",
        "description": ""
      }
    },
    "required": [
      "city",
      "days",
      "unit"
    ],
    "description": ""
  }
}

예시에 있던 인자는 모두 required 로 둡니다 — 빼는 편이 넣는 것보다 쉽습니다. description 은 비워 두었으니 채워 넣으세요. 예시에 없던 선택 인자는 잡히지 않습니다.

예시 JSON 이 뼈대가 됩니다

맨 바깥은 중괄호로 감싼 객체여야 합니다 — 배열이나 값 하나는 받지 않습니다. 열쇠 하나가 속성 하나가 되고 값의 생김새가 type 이 됩니다. 소수점 없는 수는 integer, 있으면 number 입니다. 객체는 안까지 내려가 제 required 를 갖고, 배열은 첫 원소의 모양을 items 로 삼습니다. null 은 ["null", "string"] 이 됩니다.

세 탭이 내는 것

Anthropic 은 name·description·input_schema, OpenAI 는 type: "function" 아래 function 에 name·description·parameters 를 넣은 꼴입니다. 「스키마만」은 감싸지 않은 JSON Schema 입니다. 이름 칸을 비우면 my_tool 이 되고, 설명 칸의 문장은 세 탭에 똑같이 들어갑니다.

표본으로 짐작하는 일의 한계

예시에서 읽는 것은 이름과 type 뿐입니다. "unit": "celsius" 를 넣어도 enum 이 되지 않고, 범위나 format 도 붙지 않습니다. 배열에 종류가 섞이면 첫 원소만 보고, 빈 배열은 string 으로 둡니다.

브라우저 안에서 읽습니다

JSON 은 JSON.parse 로 읽으므로 끝에 남은 쉼표나 주석이 있으면 파서가 준 말을 그대로 보여줍니다. 넣은 예시는 서버로 가지 않습니다.

자주 묻는 질문

OpenAI와 Anthropic이 왜 다른가요?

감싸는 모양이 다릅니다. OpenAI는 type과 function으로 한 겹 더 감싸고 파라미터 이름이 parameters이며, Anthropic은 한 겹 덜 감싸고 input_schema를 씁니다. 안에 들어가는 JSON Schema 자체는 같아서 둘 다 함께 냅니다.

description은 왜 비어 있나요?

사람이 채워야 합니다. 모델이 이 도구를 언제 쓸지 판단하는 근거가 그 문장이라, 비워 두면 도구가 겉돕니다. 자동으로 지어 넣으면 그럴듯하지만 틀린 설명이 붙어 더 나쁩니다.

선택 인자는 어떻게 하나요?

예시에 있던 것은 일단 모두 required로 둡니다. 빼는 편이 넣는 것보다 쉽기 때문입니다. 예시에 없던 인자는 아예 잡히지 않으니 손으로 더하세요.

3.0 을 넣었는데 integer 로 나옵니다

JSON 에는 정수와 실수의 구분이 없어 3.0 은 읽는 순간 3 이 됩니다. number 로 받으려면 3.5 처럼 0 이 아닌 소수를 적으세요.

값을 아직 모르는 인자는 어떻게 적나요?

생김새라도 맞는 값을 넣으세요. 빈 배열은 items 가 string 이 되므로 숫자 배열이면 [1] 처럼 하나라도 넣어야 integer 로 잡힙니다.

붙여넣은 코드가 서버로 가나요?

가지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다. 사내 설정 파일이나 운영 쿼리처럼 밖으로 내보내기 곤란한 것도 그래서 쓸 수 있습니다. 인터넷을 끊고도 동작합니다.