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 로 전달하게 되면 정확한 답을 얻을 수 있는데, 여기서는 구하는 방법을 안내한다.
이와 같은 차이가 발생하는 이유는, 웹 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 을 이용해서 질의에 대한 답을 구하려고 한다.
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 |