Function Calling (Tool Use)
함수 호출 또는 도구 사용을 통해 언어 모델은 JSON 인수와 함께 외부 함수를 요청하고, 애플리케이션은 해당 함수를 실행해 결과를 반환합니다.
함수 호출은 도구 호출 또는 도구 사용이라고도 하며, 대규모 언어 모델(LLM)이 일반 텍스트 대신 외부 함수를 실행해 달라는 요청으로 답변하는 기능입니다. 애플리케이션은 사용 가능한 각 도구를 이름, 목적, 인수에 대한 JSON 스키마로 설명합니다. 요청에 실시간 데이터나 작업이 필요하면 모델은 도구 이름과 JSON 인수로 응답하고, 애플리케이션이 함수를 실행한 뒤 모델은 결과를 바탕으로 답변을 작성합니다. 모델 자체는 아무것도 실행하지 않습니다. Meta의 Toolformer는 2023년 2월 모델이 자체 텍스트에 API 호출을 삽입하도록 스스로 학습할 수 있음을 보였으며, OpenAI는 2023년 6월 13일 API에 함수 호출을 추가했습니다. 함수가 필요한 시점을 감지하고 시그니처에 맞는 인수를 구성하도록 파인튜닝된 모델을 사용했습니다. 이제 모든 주요 모델 공급자가 이를 지원하며, 오픈 모델은 명령어 튜닝과 채팅 템플릿을 통해 함수 호출을 학습합니다.
함수 호출 작동 방식#
도구 호출은 모델과 애플리케이션 사이의 왕복 과정이며, 모델이 필요한 정보를 얻을 때까지 반복됩니다:
아래 코드는 OpenAI의 함수 호출 가이드 형식으로 한 번의 왕복 과정에서 모델과 애플리케이션의 양쪽 역할을 모두 수행합니다. API 키 없이 실행되도록 모델 응답을 코드에 직접 작성했습니다.
import json
from jsonschema import validate
# 요청과 함께 전송된 도구 정의: 이름, 목적, 인수용 JSON Schema
tool = {
"type": "function",
"name": "get_order_status",
"description": "Look up the shipping status of an order by its number.",
"parameters": {
"type": "object",
"properties": {"order_id": {"type": "string", "pattern": "^[0-9]+$"}},
"required": ["order_id"],
},
}
# 모델의 출력은 함수 호출이며, 인수는 JSON 문자열로 전달됩니다
call = {"type": "function_call", "call_id": "call_1", "name": "get_order_status", "arguments": '{"order_id": "4417"}'}
args = json.loads(call["arguments"])
validate(args, tool["parameters"]) # 인수가 스키마를 위반하면 어떤 작업도 실행되기 전에 오류를 발생시킵니다
# 애플리케이션은 자체 함수를 실행하고 동일한 call_id 아래에 결과를 반환합니다
orders = {"4417": "Shipped, arriving Thursday"}
print({"type": "function_call_output", "call_id": call["call_id"], "output": orders[args["order_id"]]}){'type': 'function_call_output', 'call_id': 'call_1', 'output': 'Shipped, arriving Thursday'}을 출력합니다. 이는 모델을 다시 호출하기 전에 애플리케이션이 대화에 추가하는 항목입니다. 도구에 "strict": true을 설정하면 API가 제약 디코딩을 적용하므로 모델이 생성하는 인수는 항상 스키마와 일치합니다.
도구 선택 및 연결#
모델은 한 번의 턴에서 여러 개의 독립적인 호출을 내보낼 수 있습니다. 예를 들어 주문 두 건을 한꺼번에 확인할 수 있으며, 애플리케이션은 특정 도구를 강제하거나, 도구를 하나 이상 사용하도록 요구하거나, 해당 턴에서 도구 사용을 금지할 수 있습니다. 각 결과가 다음 호출을 결정하도록 턴을 거쳐 호출을 연결하는 루프가 모델을 AI 에이전트로 바꾸어 에이전트 하네스 안에서 실행합니다. Berkeley 함수 호출 리더보드는 적절한 함수 선택, 인수 입력, 병렬 및 다중 턴 호출, 적합한 도구가 없을 때의 거절 등 이러한 기능을 평가합니다. 도구 결과는 입력으로 모델에 반환되므로 도구가 가져온 웹 페이지나 문서에 프롬프트 인젝션이 포함될 수 있습니다. 따라서 애플리케이션은 도구에 필요한 최소 권한만 부여하고 구매, 삭제 또는 메시지 전송 전에는 사용자에게 확인을 요청합니다.
비전 모델은 출력이 이미 구조화되어 있으므로 자연스러운 도구가 됩니다. Ultralytics YOLO에서 Results.summary()은 YOLO26 모델이 찾은 각 객체를 클래스 이름, 클래스 인덱스, 신뢰도, 박스 좌표를 포함한 딕셔너리로 반환하며, json.dumps는 이 목록을 도구 결과로 바로 변환합니다. 따라서 채팅 모델이나 비전 언어 모델(VLM)은 예측 모드를 호출하여 사진 속 객체를 세고 위치를 찾을 수 있습니다.
함수 호출과 관련 용어 비교#
- 컴퓨터 사용 에이전트: 스크린샷, 클릭, 키 입력을 통해 소프트웨어를 조작하므로 API가 없는 애플리케이션도 다룰 수 있습니다. API가 있는 경우 함수 호출은 구조화된 요청 한 번으로 동일한 결과에 도달합니다.
- 구조화된 출력: 송장에서 필드를 추출하는 것처럼 모델의 최종 응답을 스키마에 맞게 제한합니다. 함수 호출은 동일한 스키마를 사용해 작업을 요청하고 결과를 돌려받습니다.
- 검색 증강 생성(RAG): 검색한 문서를 프롬프트에 추가합니다. 검색 도구를 사용해 RAG를 구현할 수 있으며, 에이전틱 RAG를 사용하면 모델이 검색 시점과 검색 대상을 결정합니다.
- 모델 컨텍스트 프로토콜(MCP): Anthropic이 2024년 11월에 도입한 개방형 프로토콜로, 애플리케이션이 외부 프로그램에서 제공하는 도구를 검색할 수 있게 합니다. 모델은 여전히 함수 호출을 통해 MCP 도구를 호출합니다.










