본문 바로가기
Etc/AI

[Chat GPT] Function Call 사용하기

by 천우산__ 2024. 8. 6.

Chat GPT API 를 사용하다보면, 특수한 기능을 사용해야 할 때가 있다.

예를 들면, 엑셀 데이터를 DataFrame 으로 전달하면서, 특정 행의 총 합을 구하거나

API를 사용하여 웹 검색 결과를 찾아 내용을 요약하는 경우가 그 때이다.

 

Chat GPT 유료 플랜 사용자라면, 나에게 맞는 기능을 갖춘 GPT를 커스텀 할 수 있지만

이렇게 만들어진 모델은 API를 통해 통신할 수 없다.

이런 경우에는 Chat GPT API의 Function Call 기능을 이용하여, GPT API를 통해 특정 업무를 지시할 때,

GPT가 Function을 사용하여 처리를 하는 과정에 대해서 설명하고자 한다.

 

1. 시작하기 전 - GPT API 키 발급 받기

OPEN AI 사이트에서 GPT API 키 발급과 관련된 문서, 혹은 GPT API 발급 받기 가이드 를 통해 확인 할 수 있다.

 

2. 기본 프롬프트 작성

1. 계산이 필요한 파일
2. GPT 로 전달할 프롬프트
3. GPT 설정 내용을 구현한다.

# main.py
import pandas as pd
import os
from dotenv import load_dotenv

load_dotenv()
api_key = os.getenv("OPENAI_API_KEY") # 발급 받은 API KEY

test_data = pd.read_excel("test_data.xlsx") 

req= f"다음 데이터의 비용 행 합을 구하시오 \n {test_data} "
message = {"role": "user", "content": req}

response = openai.ChatCompletion.create(
            model='gpt-4o-mini', # 모델 설정
            messages = message,
            temperature = 0.1,
            )
            

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

실행 결과 아래와 같이 응답을 진행한다.

 

GPT API 응답 예시

같은 파일을 웹 GPT 로 전달하게 되면 정확한 답을 얻을 수 있는데, 여기서는 구하는 방법을 안내한다.

이와 같은 차이가 발생하는 이유는, 웹 GPT의 경우 데이터 분석, 웹 검색 등 다양한 기능을 넣어 서비스 중이어서 가능한 것이고

우리가 API로 이용하는 것은 언어모델 그 자체이기 때문이다.

API로 사용할 때도 기능을 넣어주기 위해서는 Function Call을 구현, GPT API에 등록해 주어야 한다.

 

3. Function 구현

GPT API가 사용할 Function을 구현하는 것은 크게 두 가지로 해야 한다.

1. 함수의 이름과 기능, 필수 파라미터를 기재한 문서
2. 실제 실행할 함수

# tools.py
import json

# 함수에 대한 설명이 있는 함수
def mathematics_description():
    description = {
            "name": "mathematics",
            "description": "수식을 계산합니다.",
            "parameters" : {
                "type" : "object",
                "properties" :{
                    "expr": {
                        "type": "string",
                        "description" : "계산할 수학 공식"
                    }
                },
                "required" : ["expr"]
            }
        }
    return description

# 실제 사용할 함수
def mathematics(expr):
    """ 수학 공식을 계산해주는 함수"""
    exp = expr['expr']
    try:
        result = eval(exp)
        return json.dumps(result)
    
    except Exception as e:
        return json.dumps({"error": f"Invalid expression: {exp}, error: {str(e)}"})

Function 을 생성하였으면, 이제 GPT API 가 사용할 수 있도록 main.py 에서

openai.ChatCompletion.create() 부분에 새로 만든 기능을 추가해야 한다.

 

4. Function 등록하기

# main.py
import pandas as pd
import os
from dotenv import load_dotenv
from tool import mathematics, mathematics_description


load_dotenv()
api_key = os.getenv("OPENAI_API_KEY") # 발급 받은 API KEY

test_data = pd.read_excel("test_data.xlsx") 

req= f"다음 데이터의 비용 행 합을 구하시오 \n {test_data} "
message = {"role": "user", "content": req}


response = openai.ChatCompletion.create(
            model='gpt-4o-mini', # 모델 설정
            messages = message,
            temperature = 0.1,
            functions = [mathematics_description()], # funtion 등록
            function_call = "auto" # funtion 호출을 언제 할지 정하는 옵션
            )
            

response_message = response['choices'][0]['message'] # GPT 메세지를 보기 위해 수정
print(response_message)

새로 만든 Function을 기술하는 문서를 functions에 등록, function_call 을 auto로 지정하여

함수를 언제 호출할 것인지는 GPT의 판단에 맡기기로 한다.

또한, 어떤 메세지를 반환하는지 확인하기 위해 respose_message 는 content가 아닌, message 까지 확인해보자

 

Function을 호출하는 GPT API

아까와는 다르게, function 을 이용해서 질의에 대한 답을 구하려고 한다.

function call을 필요로 할 때, 해당 함수를 불러서 데이터를 처리해주는 로직을 추가한다.

 

5. Function Call 발생 시, 함수 실행하기

if response_message.get('function_call'):
	
    # 사용 가능한 함수 목록 등록
    available_function = {
        "mathematics" : mathematics 
    }
	
    # function call 함수 이름 확인
    function_name = response_message['function_call']['name']
	
    # 필요 함수 호출
    function_to_call = available_function[function_name]
    
    # 파라미터 저장
    function_args = json.loads(response_message['function_call']['arguments'])
	
    # 파라미터를 통해 함수 실행
    function_response = function_to_call(
        expr = function_args
    )
	
    # 응답 결과를 메세지에 추가
    message.append(response_message)
    message.append({
        'role': 'function',
        'name': function_name,
        'content' : function_response
    })

예시로 등록한 함수는 하나이지만, 여러 함수를 등록할 수 있으므로 available_function 변수에 함수들을 추가한다.

GPT API 응답이 function_call 인 경우, 함수 이름을 반환 받아서 실제 함수를 불러온다.

그 다음, 함수에 사용할 파라미터들을 넣어서 응답을 받고, 그 결과를 반환한다.

이 때 첫 번째 사용한 함수 결과만 반환한다면, 제대로 된 연산 결과를 얻기 힘들 수 있다.

2차, 3차 연산을 계획하고 데이터를 넣었을 수 있기 때문에, function call 이 발생하지 않을 때 까지 응답 결과를 확인해야 한다.

 

6. 전체 코드

# main.py
import pandas as pd
import os
from dotenv import load_dotenv
from tool import mathematics, mathematics_description


load_dotenv()
api_key = os.getenv("OPENAI_API_KEY") # 발급 받은 API KEY

test_data = pd.read_excel("test_data.xlsx") 

req= f"다음 데이터의 비용 행 합을 구하시오 \n {test_data} "
message = {"role": "user", "content": req}


while True: # function call 이 없을 때 까지 실행
        response = openai.ChatCompletion.create(
                    model='gpt-4o-mini', # 모델 설정
                    messages = message,
                    temperature = 0.1,
                    functions = [mathematics_description()], # funtion 등록
                    function_call = "auto" # funtion 호출을 언제 할지 정하는 옵션
                    )
       

		response_message = response['choices'][0]['message'] # function call 확인

        if response_message.get('function_call'):
            available_function = {
                "mathematics" : mathematics
            }

            function_name = response_message['function_call']['name']

            function_to_call = available_function[function_name]
            function_args = json.loads(response_message['function_call']['arguments'])
            
            function_response = function_to_call(
                expr = function_args
            )
            
            message.append(response_message)
            message.append({
                'role': 'function',
                'name': function_name,
                'content' : function_response
            })

        else:
            return response_message['content']
            
print(response_message)

 

'Etc > AI' 카테고리의 다른 글

[PandasAI] Python Pandas 데이터 AI로 분석하기  (0) 2024.08.09
[Chat GPT] GPT API Key 발급 받기  (0) 2024.08.02