GPT function calling
OpenAI의 GPT API에서 얼마전부터 새롭게 제공하는 function calling 기능에 대한 설명입니다.
GPT function calling은 게임 체이저(Game changer)라고 블릴 만큼 굉장히 편하고 유용한 기능입니다. 이 기능을 이용하면 괜찮은 GPT 응용 애플리케이션을 매우 간단하게 만들 수 있습니다.
GPT function calling 설명
GPT function calling을 GPT에게 프롬프트와 함께 함수의 정의 목록을 함께 전달하면 GPT가 프롬프트를 보고 전달된 함수 중 하나를 호출해야 한다고 판단하면 그 중 하나를 호출해서 결과를 자신에게 전달해 달라고 하고 그 전달된 결과를 입력 받아 최종 메세지를 만드는 것을 말 합니다.
간단하게 플로우를 그려 보면 다음과 같습니다.
- GPT에게 프롬프트(질문)과 함께 함수 목록을 전달
- GPT가 프롬프트를 보고 함수를 실행 안해도 되면 그대로 메세지를 답변
- 만약 함수를 실행해서 그 결과가 필요하다면 함수를 실행해달라는 결과를 리턴
- GPT가 호출해달라고 한 함수를 사용자가 호출해서 결과값을 GPT에게 주고 다시 호출
- GPT가 이전의 프롬프트와 함수의 결과를 다 합쳐서 메세지를 만들어서 전달
- 만약 5에서 다시 다른 함수를 호출해야 한다면 3번으로 가게 됨
GPT function calling 예제 코드
아래 Python 코드를 살펴보시면 됩니다. 무척 쉽습니다.
중요한 점은 콘텍스트를 계속 유지해줘야 한다는 것입니다.
그래서 과거의 대화내역 뒤에 함수의 결과값을 다시 붙여줘야 제대로 대답합니다.
import openai
openai.api_key = "***** openai api key *****"
chat_completion: openai.ChatCompletion = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{
"role": "system",
"content": "your name is Ironman. you anser in Korean",
},
{
"role": "user",
"content": """What is the weather like today?""",
}
],
functions=[
{
"name": "get_wether",
"description": "get wether information",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "city or nation name",
}
},
"required": ["location"],
},
}],
function_call="auto",
)
if chat_completion.choices[0].finish_reason == "function_call":
function_name = chat_completion.choices[0].message.function_call.name
functoin_arguments = chat_completion.choices[0].message.function_call.arguments
# 함수 실행 부분을 추가
# function_result에는 함수를 실행하고 난 결과값을 넣어준다.
function_result = "function result"
messages = [
{
"role": "system",
"content": "your name is Ironman. you anser in Korean",
},
{
"role": "user",
"content": """What is the weather like today?""",
},
{
"role": "function",
"name": function_name,
"content": function_result
}
]
second_chat_completion: openai.ChatCompletion = openai.ChatCompletion.create(
model="gpt-4",
messages=messages,
)
result_message = second_chat_completion.choices[0].message.content
else:
result_message = chat_completion.choices[0].message.content
print(result_message)