open api의 function call

반응형

최근에 chat gpt로 python을 공부하다가 function call이라는 기능이 나와서 정리할겸 포스팅.

 

function call은 어떤 기능인가?

사용자가 정의한 함수(function)를 GPT가 호출(call)하도록 하는 것.

 

이게 왜 필요할까?

걍 gpt에 문의하면 gpt가 답해주는거 아님?

 

이 기능의 핵심은. GPT에게 함수를 밀리 알려주면 필요할 때 함수를 

GPT가 호출할 수 있도록 해 준다는거다.

즉, 내가 chat gpt를 통해 얻은 데이터를 내가 원하는 방식으로 원하는 포멧으로

저장하는 함수를 구현 한 다음 이를 chat gpt가 호출 해 줄 수 있다는 거.

 

 

예제는 뭐 구글링 해 보면 많이 나오니까. 개념만 이해하고 넘어가자.

https://platform.openai.com/docs/guides/text-generation/function-calling

 

import openai
import json

openai.api_key = 이건비밀
# from api_keys import openai_api_key # API key가 github에 올라가면 폐기되기 때문에 따로 import 했습니다.
# openai.api_key=openai_api_key  # API key가 github에 올라가면 폐기되기 때문에 따로 import 했습니다.

# get_current_weather 함수를 실제로 구현한다면 실제 날씨 정보 API를 이용해야 하지만,
# 여기서는 예시를 위해 간단하게 하드 코딩된 함수를 제공합니다.
# minwoo : gpt에게 알려줄 함수.
def get_current_weather(location, unit="fahrenheit"):
    """location으로 받은 지역의 날씨를 알려 주는 기능"""
    weather_info={
        "location": location,
        "temperature": "72",
        "unit": unit,
        "forecast": ["sunny", "windy"],
    }
    return json.dumps(weather_info)

def run_conversation():
    # 1단계: messages뿐만 아니라 사용할 수 있는 함수에 대한 설명 추가하기
    # leeminwoo : 펑션 정의는 이름(name)과 설명(description), 인자(parameters)를 포함해야하며 필수 파라미터는 "required"
    messages=[{"role": "user", "content": "What's the weather like in Boston?"}]
    functions=[
        {
            "name": "get_current_weather",
            "description": "Get the current weather in a given location",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and state, e.g. San Francisco, CA",
                    },
                "unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},
                },
            "required": ["location"],
            },
        }
    ]
   
    # leeminwoo : openai api에 대화와 함수정보를 전달하고 응답을 확인한다.
    response=openai.ChatCompletion.create(
        model="gpt-3.5-turbo",
        messages=messages,
        functions=functions,
        function_call="auto", # auto가 기본 설정입니다.
    )
    response_message=response["choices"][0]["message"]

    # leeminwoo : 테스트용 출력
    # print("첫번재 응답")
    # print(response)
 
    # 2단계: GPT의 응답이 function을 실행해야 한다고 판단했는지 확인하기
    if response_message.get("function_call"):
        # 3단계: 해당 함수 실행하기
        available_functions = {
            "get_current_weather": get_current_weather,
        } # 이 예제에서는 사용할 수 있는 함수가 하나뿐이지만, 여러 개를 설정할 수 있습니다.
        function_name = response_message["function_call"]["name"]
        function_to_call = available_functions[function_name]
        function_args = json.loads(response_message["function_call"]["arguments"])
        function_response = function_to_call(
            location=function_args.get("location"),
            unit=function_args.get("unit"),
        )
       
        # 4단계: 함수를 실행한 결과를 GPT에게 보내 답을 받아오기 위한 부분
        # leeminwoo : 위에서 받은 첫번째 응답값을 messages에 추가한다.
        messages.append(response_message) # GPT의 지난 답변을 messages에 추가하기
        messages.append( #leeminwoo : messages에 함수의 실행결과를추가한다.
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            }
        )
       
        # 함수 실행 결과도 GPT messages에 추가하기
        # leeminwoo : 두번째 openai api 요청
        second_response = openai.ChatCompletion.create(
            model="gpt-3.5-turbo",
            messages=messages,
        ) # 함수 실행 결과를 GPT에 보내 새로운 답변 받아오기

        # leeminwoo : 두번째 응답 출력
        # print("두번재 응답")
        # print(second_response)
        return second_response["choices"][0]["message"]["content"]
   
print(run_conversation())

 

TAGS.

Comments