OpenAI의 Chat Completions API 업데이트: Function Calling을 활용한 날씨 조회 튜토리얼

반응형

2023년 6월 13일에 OpenAI의 Chat Completions API에 새로운 기능인 function calling이 업데이트되었습니다. 자세한 내용은 아래 링크에서 확인할 수 있습니다.
https://openai.com/blog/function-calling-and-other-api-updates

이 글은 function calling을 사용하여 날씨 함수를 호출하고 응답하는 과정을 간단하게 설명합니다.


먼저, 날씨 조회를 위한 인터페이스 역할을 하는 더미 함수를 작성합니다.

import json

def get_current_weather(arguments):
    """현재 위치의 현재 날씨를 확인합니다"""
    weather_info = {
        "location": arguments['location'],
        "temperature": "72",
        "unit": arguments['unit'],
        "forecast": ["맑음"],
    }
    return json.dumps(weather_info)


그 다음 OpenAI API에서 사용할 함수를 정의합니다.

function_descriptions = [
    {
        # name은 함수 이름입니다.
        "name": "get_current_weather", \
        # description은 함수가 수행하는 작업에 대한 설명입니다. GPT는 이 정보를 사용하여 함수를 호출여부를 결정합니다.
        "description": "현재 위치의 현재 날씨를 확인합니다", 
        # parameters에는 함수에 필요한 모든 입력 필드가 포함됩니다. 다음과 타입을 사용할 수 있습니다: String, Number, Boolean, Object, Null, AnyOf.
        "parameters": {
            "type": "object",
            "properties": {
                "location": {
                    "type": "string",
                    "description": "도시(예: 서울)",
                },
                "unit": {
                    "type": "string",
                    "description": "사용할 온도 단위입니다. 사용자 위치에서 이를 유추합니다.",
                    "enum": ["섭씨", "화씨"]
                },
            },
            # required는 함수를 수행하는 데 필요한 필수 매개변수입니다. 나머지 매개변수는 옵션으로 취급됩니다.
            "required": ["location", "unit"],
        },
    }
]


위에서 정의한 함수와 함께 사용자 입력을 사용하여 gpt-3.5-turbo-0613 모델을 호출합니다.

import openai

user_query = "서울 날씨는?"

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[{"role": "user", "content": user_query}],
    functions=function_descriptions,
    function_call="auto",
)

print(response)


그럼 다음과 같이 응답 메시지를 받게 됩니다.

{
  "choices": [
    {
      "finish_reason": "function_call",
      "index": 0,
      "message": {
        "content": null,
        "function_call": {
          "arguments": "{\n  \"location\": \"서울\",\n  \"unit\": \"섭씨\"\n}",
          "name": "get_current_weather"
        },
        "role": "assistant"
      }
    }
  ],
  "created": 1686753796,
  "id": "chatcmpl-7RM0KwgwOpiaZ1H2YUZoYyahzzcWd",
  "model": "gpt-3.5-turbo-0613",
  "object": "chat.completion",
  "usage": {
    "completion_tokens": 28,
    "prompt_tokens": 98,
    "total_tokens": 126
  }
}


응답 메시지에서 choices의 첫 번째 항목의 message에서 function_call을 확인하고 다음과 같이 함수를 호출합니다.

# 함수명과 인자값 파싱
response_message = response["choices"][0]["message"]
function_name = response_message['function_call']['name']
arguments = json.loads(response_message['function_call']['arguments'])

# 함수에 인자값을 넣어 실행하기
function_response = eval(f"{function_name}(arguments)")
print(function_response)

응답:

'{"location": "서울", "temperature": "72", "unit": "섭씨", "forecast": ["맑음"]}'


최종 응답을 받기 위해 지금 까지 받은 응답 메시지를 다시 gpt-3.5-turbo-0613 모델에 보냅니다.

response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo-0613",
    messages=[
	    {"role": "user", "content": user_query},
	    {"role": "assistant", "content": response_message['content'], "function_call": response_message['function_call']}, 
	    {"role": "function", "name": function_name, "content": function_response}
	 ],
    functions=function_descriptions,
    function_call="auto",
)

print(response['choices'][0]['message']['content'])

최종 응답:

현재 서울의 날씨는 72°C이며, 강수량은 없습니다.

or

[카카오페이로 후원하기] [토스페이로 후원하기]

반응형