함수 호출 정의 만들기
모델에 도구를 붙일 때 파라미터를 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 로 잡힙니다.
붙여넣은 코드가 서버로 가나요?
가지 않습니다. 브라우저 안에서만 처리하고 어디에도 보내거나 저장하지 않습니다. 사내 설정 파일이나 운영 쿼리처럼 밖으로 내보내기 곤란한 것도 그래서 쓸 수 있습니다. 인터넷을 끊고도 동작합니다.