Function Calling / Tool Use
Function Calling은 LLM이 외부 도구나 API를 호출할 수 있게 하는 핵심 패턴입니다. 모델이 직접 데이터를 조회하거나 계산하는 것이 아니라, 적절한 함수를 선택하고 인자를 생성하면 애플리케이션이 실행한 뒤 결과를 다시 모델에 전달합니다.실습
도구 정의 (JSON Schema)
Function Calling의 첫 단계는 LLM에게 사용 가능한 도구를 JSON Schema로 정의하는 것입니다.JSON Schema 작성 요령:
| 항목 | 설명 | 팁 |
|---|---|---|
name | 함수 이름 (영문, 스네이크 케이스) | 명확하고 구체적인 동사 사용 |
description | 함수의 용도 설명 | LLM이 언제 이 도구를 선택할지 결정하는 핵심 |
parameters | 입력 파라미터 스키마 | 각 파라미터에 description 필수 |
required | 필수 파라미터 목록 | 선택적 파라미터는 default 값 설정 |
Anthropic Tool Use
Anthropic Claude의 Tool Use는 개념은 동일하지만 API 구조가 다릅니다.OpenAI vs Anthropic Tool Use 비교:
| 항목 | OpenAI | Anthropic |
|---|---|---|
| 도구 스키마 키 | parameters | input_schema |
| 도구 호출 감지 | message.tool_calls 존재 여부 | stop_reason == "tool_use" |
| 결과 전달 | role: "tool" 메시지 | type: "tool_result" 콘텐츠 블록 |
| 다중 도구 호출 | 한 응답에 여러 tool_calls | 한 응답에 여러 tool_use 블록 |
멀티턴 도구 호출
실제 애플리케이션에서는 하나의 요청에서 여러 도구를 순차적으로 호출하는 경우가 많습니다.출력 예시:
LLM이 한 번의 응답에서 여러 도구를 동시에 호출할 수 있습니다 (Parallel Tool Calls). 이 경우
tool_calls 배열에 여러 항목이 포함되며, 각각에 대한 결과를 모두 메시지에 추가해야 합니다.트러블슈팅
LLM이 도구를 호출하지 않습니다
LLM이 도구를 호출하지 않습니다
도구의
description이 충분히 구체적인지 확인하세요. LLM은 description을 읽고 도구 선택을 결정합니다.- 모호한 설명: “데이터를 가져옵니다” (X)
- 구체적인 설명: “PostgreSQL DB에서 고객 이름, 이메일 기준으로 검색합니다” (O)
tool_choice="required"로 설정하면 반드시 도구를 호출합니다
function.arguments JSON 파싱이 실패합니다
function.arguments JSON 파싱이 실패합니다
LLM이 생성한 JSON이 올바르지 않은 경우가 드물게 있습니다.
json.loads()전에 기본적인 검증을 추가하세요- 스트리밍 사용 시
arguments가 분할되어 올 수 있으므로 누적 후 파싱합니다 gpt-4o이상 모델은 JSON 생성 정확도가 매우 높습니다
여러 도구 호출 결과의 순서가 중요한가요?
여러 도구 호출 결과의 순서가 중요한가요?
tool_call_id로 각 호출과 결과가 매칭되므로 순서는 중요하지 않습니다. 다만 모든 tool_calls에 대해 빠짐없이 tool 역할의 결과 메시지를 추가해야 합니다.Anthropic에서 tool_use 블록이 여러 개인 경우
Anthropic에서 tool_use 블록이 여러 개인 경우
response.content를 순회하며 type == "tool_use"인 블록을 모두 처리하세요. 각 블록의 id에 대응하는 tool_result를 모두 포함하여 다음 요청을 보내야 합니다.
