1. 함수 호출 소개
GPT 모델에서 함수 호출은 API를 통해 모델에 설명적인 함수를 제공하여 한 개 이상의 함수를 호출하는 데 필요한 매개변수를 포함한 JSON 객체를 지능적으로 선택하고 출력하는 것을 의미합니다. 채팅 완성 API는 함수 호출을 직접 실행하는 것이 아니라 코드에서 함수를 실행할 수 있는 JSON을 생성하는 것에 중점을 둡니다.
간단히 말해, 함수 호출 기능은 GPT 모델에 함수 정의(함수 설명 및 매개변수 설명 포함) 세트를 제공하는 것을 의미합니다. 모델은 그 후에 사용자의 쿼리에 따라 어떤 함수를 호출할지 결정합니다. 모델은 외부 함수를 실행할 수 없으므로 호출할 함수(함수 호출 매개변수 포함)를 요청하기만 합니다. 모델의 요청 결과를 받은 후에 우리의 프로그램은 해당 함수 호출을 로컬에서 실행합니다. 함수 호출 결과는 프롬프트와 연결된 후 최종 결과를 사용자에게 반환하기 전에 모델로 다시 전송됩니다.
2. 함수 호출의 응용 시나리오
다음은 함수 호출의 실제 응용 사례 몇 가지입니다:
- 외부 API를 호출하여 질문에 답하는 어시스턴트 생성, 예를 든들어
send_email(to: string, body: string)
또는get_current_weather(location: string, unit: 'celsius' | 'fahrenheit')
와 같은 함수를 정의합니다. - 자연어를 API 호출로 변환하여 내부 API 호출을 수행하는 예로 "내 최고 고객은 누구입니까?"를
get_customers(min_revenue: int, created_before: string, limit: int)
로 변환합니다. - 텍스트에서 구조화된 데이터 추출, 예를 들어
extract_data(name: string, birthday: string)
또는sql_query(query: string)
와 같은 함수를 정의합니다.
함수 호출 기능을 활용하여 최신 날씨 조회, 주식 가격 확인, 테이크아웃 주문 또는 항공편 예약과 같은 지역 시스템 및 데이터베이스와 상호 작용하는 AI 에이전트를 구현할 수 있습니다.
3. 함수 호출 지원 모델
모든 버전의 모델이 함수 호출 데이터로 훈련되는 것은 아닙니다. 현재 함수 호출을 지원하는 모델은 gpt-4
, gpt-4-turbo-preview
, gpt-4-0125-preview
, gpt-4-1106-preview
, gpt-4-0613
, gpt-3.5-turbo
, gpt-3.5-turbo-1106
, 그리고 gpt-3.5-turbo-0613
입니다.
뿐만 아니라, gpt-4-turbo-preview
, gpt-4-0125-preview
, gpt-4-1106-preview
및 gpt-3.5-turbo-1106
모델은 병렬 함수 호출을 지원하여 한 번에 여러 함수 호출을 실행하고 이러한 함수 호출을 동시에 처리하여 효과적이고 효율적인 결과를 만들어냅니다.
참고: 함수 호출 기능과 관련된 잠재적인 리스크는 모델이 잘못된 매개변수(예: 가짜 매개변수)를 생성할 수 있다는 것입니다. 따라서 이메일 전송, 온라인 게시, 구매 등 실제 세계에 영향을 미치는 어떤 조치를 취하기 전에 제품 수준에서 사용자 확인 프로세스를 통합하여 함수가 사용자 확인 이후에만 실행되도록 하는 것이 좋습니다.
4. 함수 호출 예제
4.1 파이썬 예제
OpenAI 플랫폼에서 함수 호출을 구현하는 것은 일반적으로 아래에 설명된 기본 단계를 따릅니다. 다음은 파이썬 코드 예제를 통해 날씨 조회에 중점을 두어 전체 과정을 상세히 설명할 것입니다.
단계 1: 모델에 대해 호출 가능한 함수 및 함수 정의를 준비합니다.
먼저, GPT 모델에서 호출할 수 있는 함수를 정의해야 합니다. 이것은 일반적으로 제공된 입력 매개변수를 기반으로 특정 작업을 수행할 수 있는 함수를 준비하는 것을 의미합니다. 이 작업은 보통 제3자 API와 통신할 수 있는 자체 함수를 준비하는 것을 의미합니다.
import json
def get_current_weather(location, unit="fahrenheit"):
return json.dumps({
"location": location,
"temperature": "18",
"unit": unit
})
단계 2: 쿼리 및 도구 매개변수를 기반으로 모델 호출
그다음으로, Chat Completion API를 통해 GPT 모델을 호출해야 합니다. 이때 사용자의 쿼리(예: "현재 날씨는 어떻습니까?")와 방금 정의한 get_current_weather
함수의 설명을 포함하는 tools
매개변수를 전달해야 합니다.
from openai import OpenAI
client = OpenAI()
tools = [{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "특정 위치의 현재 날씨 가져오기",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "예: '산프란시스코, CA'와 같이 도시 이름"
},
"unit": {
"type": "string",
"enum": ["섭씨", "화씨"]
}
},
"required": ["location"]
}
}
}]
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "산프란시스코의 현재 날씨는 어떻게 되나요?"}],
tools=tools
)
단계 3: 로컬에서 함수 실행
모델이 반환하는 결과에는 일반적으로 tool_calls
응답 매개변수에 포함된 함수 호출 정보가 포함됩니다. 그런 다음, tool_calls
매개변수에 설명된 함수 호출 정보를 기반으로 해당 함수 호출을 로컬에서 실행할 수 있습니다.
tool_calls = response.choices[0].message.tool_calls
if tool_calls:
arguments = json.loads(tool_calls[0].function.arguments)
weather_info = get_current_weather(**arguments)
print(weather_info) # 여기에서 함수 호출로 조회한 날씨 정보를 볼 수 있습니다
단계 4: 함수 반환 결과를 사용하여 모델 다시 호출
이제 함수의 반환 결과를 새 메시지로 모델에 전송하여, 모델이 이러한 결과를 처리하고 사용자에 맞는 응답을 생성할 수 있도록 해야 합니다.
follow_up_response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[
{"role": "user", "content": "산프란시스코의 현재 날씨는 어떻게 되나요?"},
{"role": "function", "name": "get_current_weather", "content": weather_info}
],
tools=tools
)
설명: 위 예제에서 함수 반환 내용은 다음과 같은 함수 메시지를 통해 GPT 모델에 전송됩니다:
{"role": "function", "name": "get_current_weather", "content": weather_info}
실제로는, 답변하는데 AI가 참조하는 함수 반환 내용을 시스템 메시지 프롬프트에 간단히 넣을 수도 있습니다.
단계 5: 모델로부터 최종 응답 얻기
마지막으로, 모델의 최종 응답을 검색하여 사용자에게 제공할 수 있습니다. 이 단계에서 모델은 우리가 제공한 날씨 정보를 기반으로 사용자 친화적인 답변을 출력할 것입니다.
final_output = follow_up_response.choices[0].message.content
print(final_output) # 이 출력은 사용자에게 보여줄 날씨 정보입니다
위 단계를 따라하면, GPT 모델 및 함수 호출을 사용하여 날씨를 조회하는 완벽한 예제를 완료하게 됩니다.
4.2. 함수 호출 함수 정의 설명
4.2.1 'Tools' Parameter Fields의 의미
함수를 호출할 때, tools
매개변수에 함수에 대한 관련 정보를 정의해야 합니다. tools
매개변수는 여러 함수 정의가 포함된 배열이며, 각 함수 정의는 다음과 같은 필드를 포함합니다:
-
type
: 이 필드는 도구의 유형을 나타냅니다. 함수 호출 시, 이 필드는"function"
으로 설정해야 합니다. -
function
: 이 필드는 함수에 대한 자세한 정보를 포함하고 다음 구체적인 필드들을 갖는 객체입니다:-
name
: 함수의 이름으로 문자열입니다. -
description
: 함수의 목적에 대한 설명으로, 모델이 사용자의 기대에 부합하는 매개변수를 생성하는 데 도움이 될 수 있습니다. -
parameters
: 함수의 매개변수 정의를 설명하며, 다음 하위 필드를 포함하는 객체입니다:-
type
: 매개변수의 유형을 정의하며, 대부분"object"
로 설정해야 합니다. -
properties
: 각 함수 매개변수의 구체적인 정의로, 각 매개변수 정의는 일반적으로 다음과 같은 하위 필드를 포함한 객체입니다:-
type
: 매개변수의 데이터 유형 ("string"
,"integer"
,"boolean"
등). -
description
: 매개변수의 목적을 모델이 이해하는 데 도움이 되는 설명. -
enum
(선택 사항):type
이"string"
일 때,enum
필드는 유효한 값의 집합을 나타내는 문자열 배열을 지정할 수 있습니다.
-
-
required
: 필수 매개변수의 이름을 포함하는 문자열 배열입니다.
-
-
4.2.2 도구 정의 예시
이제 각 필드가 어떻게 사용되는지 이해하는 데 도움이 되도록 tools
정의의 예시를 제공하겠습니다.
예시 1: 현재 날씨 정보 가져오기
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "지정된 위치의 현재 날씨 정보 가져오기",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "날씨를 조회할 도시, 예: '샌프란시스코, 캘리포니아'"
},
"unit": {
"type": "string",
"enum": ["celsius", "fahrenheit"],
"description": "온도 단위, 'celsius'는 섭씨, 'fahrenheit'는 화씨"
}
},
"required": ["location", "unit"]
}
}
}
위 예시에서, 우리는 지정된 위치의 현재 날씨를 가져오는 get_current_weather
함수를 정의했습니다. 매개변수로는 location
과 unit
이 있으며, unit
은 "celsius" (섭씨)와 "fahrenheit" (화씨) 이 두 가지 유효한 값이 있습니다.
예시 2: 특정 아티스트의 앨범 찾기
{
"type": "function",
"function": {
"name": "find_artist_albums",
"description": "특정 아티스트의 모든 앨범 찾기",
"parameters": {
"type": "object",
"properties": {
"artist_name": {
"type": "string",
"description": "아티스트의 이름"
}
},
"required": ["artist_name"]
}
}
}
이 예시에서, 우리는 특정 아티스트의 모든 앨범을 찾기 위한 find_artist_albums
함수를 생성했습니다. 이 함수는 오직 artist_name
(아티스트의 이름) 한 개의 매개변수만 필요로 합니다.
4.3. HTTP 요청 함수 호출의 예시
OpenAI는 HTTP 프로토콜을 통해 접근 가능한 API를 제공합니다. 아래에서는 HTTP API를 통해 함수 호출 기능을 사용하는 방법에 대해 설명하겠습니다. 다른 프로그래밍 언어의 개발자는 이 예시를 참고할 수 있습니다.
4.3.1. 단계 1: 사용자 쿼리 및 함수 선언과 함께 모델 호출
먼저, 사용자의 쿼리와 지원하는 함수 목록을 GPT 모델에게 보내어, 모델이 사용자의 질문에 기반하여 어떤 함수를 호출하여 응답할지 자동으로 분석할 수 있게 합니다.
다음 예시에서는, 우리는 'get_current_weather' 함수를 사용하여 지정된 도시의 날씨 정보를 조회할 수 있는 것을 GPT에게 알립니다.
curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {OPENAI_KEY}' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "상하이의 오늘 날씨는 어떻습니까?"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "지정된 위치의 현재 날씨 정보를 가져옵니다",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "날씨를 조회할 도시, 예: '샌프란시스코, 캘리포니아'"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "온도 단위, 'celsius'는 섭씨, 'fahrenheit'는 화씨"
}
},
"required": [
"location",
"unit"
]
}
}
}
]
}'
요청 매개변수 설명:
{
"model": "gpt-3.5-turbo", // 호출할 GPT 모델
"messages": [ // 사용자의 쿼리를 포함하는 GPT의 메시지 목록
{
"role": "user",
"content": "상하이의 오늘 날씨는 어떻습니까?"
}
],
"tools": [
// 사용 가능한 함수들을 GPT에게 알리는 함수 정의
]
}
'tools' 매개변수의 정의에 대한 내용은 섹션 4.2.2를 참조하십시오.
GPT 모델에 의한 일반적인 처리 과정에서, 다음과 유사한 API 응답을 받게 됩니다:
{
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"prompt_tokens": 122,
"completion_tokens": 27,
"total_tokens": 149
},
"id": "chatcmpl-8mL4hS4zNMocyR2ajKyAvSTcbNaao",
"created": 1706531447,
"choices": [
{
"index": 0,
"delta": null,
"message": {
"role": "assistant",
"tool_calls": [ // tool_calls 매개변수는 GPT가 호출하길 원하는 함수 목록을 나타냅니다
{
"id": "call_1iF09ttX1R9ESR18Ul2nLe1R",
"type": "function",
"function": {
"name": "get_current_weather", // GPT가 get_current_weather 함수를 호출하여 사용자의 쿼리에 답하길 원한다는 것을 나타냅니다
"arguments": "{\n \"location\": \"상하이, 중국\",\n \"unit\": \"celsius\"\n}" // get_current_weather 함수를 호출하기 위한 입력 매개변수입니다
}
}
]
},
"finish_reason": "tool_calls"
}
]
}
4.3.2. 단계 2: 로컬 함수 호출 실행
GPT 모델 자체는 특정 함수 호출을 실행할 수 없으며, 호출하길 원하는 함수만 알려줄 뿐입니다. 우리의 로컬 프로그램은 모델이 반환한 'tool_calls' 매개변수를 기반으로 특정 함수 호출을 실행해야 합니다. 로컬 함수를 실행하는 방식은 프로그래밍 언어마다 다릅니다. 예를 들어, 파이썬에서는 이전 섹션을 참조할 수 있습니다.
4.3.3. 단계 3: 함수의 반환 결과를 사용하여 모델 다시 호출하기
함수 호출이 로컬에서 실행되기 때문에 함수 실행의 결과와 사용자의 질문을 GPT 모델에 다시 전달하여 최종 응답을 만들어야 합니다.
curl --location 'https://api.aiproxy.io/v1/chat/completions' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer sk-Roc5MX1zEuVxiuaMaETV6wZ2jXcCehjUCzwP9AcNErUiwppQ' \
--data '{
"model": "gpt-3.5-turbo",
"messages": [
{
"role": "user",
"content": "오늘 상해의 날씨는 어떻습니까?"
},
{
"role": "function",
"name": "get_current_weather",
"content": "{\"city\":\"상해\", \"temperature\":\"25 도 섭씨\"}"
}
],
"tools": [
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "지정된 위치의 현재 날씨 정보 가져오기",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "날씨를 조회할 도시, 예: '샌프란시스코, CA'"
},
"unit": {
"type": "string",
"enum": [
"celsius",
"fahrenheit"
],
"description": "온도 단위, 섭씨인 경우 'celsius', 화씨인 경우 'fahrenheit'"
}
},
"required": [
"location",
"unit"
]
}
}
}
]
}'
참고: 위 요청에는 함수 메시지가 추가되어 GPT 모델에 함수의 반환 값을 알리고 있습니다. GPT는 함수의 반환 정보를 기반으로 사용자의 질문에 직접 답하며 함수를 다시 호출하지 않습니다.
함수 메시지는 함수의 반환 값을 나타내며 아래 형식을 따릅니다:
{
"role": "function", // 메시지 타입이 함수인 경우, 함수의 반환 값을 나타냄
"name": "get_current_weather", // 현재 메시지가 get_current_weather 함수의 반환 값임을 GPT에 알림
"content": "{\"city\":\"상해\", \"temperature\":\"25 도 섭씨\"}" // 함수 반환 내용, JSON 형식 또는 다른 텍스트 형식일 수 있음.
}
아래는 GPT에서 생성된 최종 응답입니다:
{
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"prompt_tokens": 144,
"completion_tokens": 17,
"total_tokens": 161
},
"id": "chatcmpl-8mLmvvKAjSql7rGF8fvQeddKhWYvr",
"created": 1706534189,
"choices": [
{
"index": 0,
"delta": null,
"message": {
"role": "assistant",
"content": "오늘 상해의 날씨는 25 도 섭씨 입니다."
},
"finish_reason": "stop"
}
]
}