본문 바로가기
데이터&AI/LLM

GPT API 의 Function Calling 기능 알아보기!! (feat. Python)

by 일등박사 2024. 1. 26.

GPT를 활용한 스토어도 나오고!! 

API 의 기술이 많이 발전했는데요!! 

오늘은 Function Calling 기능에 대하여 알아보겠습니다~!


Function Calling - 함수 호출!!

이 기능을 간단히 소개하자면!!!

GPT를 통해 내 함수를 호출, 해당 결과를 return 하는것 입니다!!!

 

길게 소개하자면 아래와 같은 기능이 가능힙니다,

  • 챗봇 설계: 챗봇이 API와 연결, 필요한 데이터를 검색하거나 액션을 수행할 수 있도록 기능 호출을 사용 가능
  • 작업 자동화: 반복적인 작업 자동화 ex) 이메일 전송, 보고서 작성, 데이터 업데이트 등 자동화.
  • 정보 추출: 자연어로 입력된 문서에서 주요 정보를 식별하고 추출하기 위해 기능 호출을 사용.
                 
    이를 통해 데이터 분석, 질문 응답 시스템 등 다양한 응용 프로그램에 활용할 수 있습니다.
  •  

파이썬 으로 알아봅시다!!

 

여러분은 피자가게 사장입니다!!

고객이 피지가격을 물어보면 답변하는 챗봇을 GPT로 만들고싶습니다!!

어떻게해야할까요?

피자가격 데이터를 학습시켜 fine-tuning해야할까요?,

llama-index를 활용, 피자가격 메뉴판을 벡터화해서 저장해두고 검색해야할까요.?

 

더 쉬운 방법이있습니다!!

이때 바로 function call 기능을 활용하면됩니다!!!

 


 

 

피자가게의 가격 체계는 다음과 같습니다!

def get_pizza_info(pizza_name: str):
    if '치즈' in pizza_name :
        pizza_info = {
            "name": pizza_name,
            "price": "10.99",
        }
    else:
        pizza_info = {
            "name": pizza_name,
            "price": "9.99",
        }        
    return json.dumps(pizza_info)

 

피자 이름 치즈가 들어가면 10.99 달러이고,

그 외의 피자는 9.99 달러입니다!!

 

위 함수를 GPT API와 연동시켜, 피자 가격을 물어보면 답변하게 만들어봅시다!!

 

1. 패키지 호출 : json 및 openai 패키지를 호출합시다!!

import json
import openai
client = openai.OpenAI(api_key = '{나의 key}')

 

2. 함수 선언 및 함수 소개  json 작성

 - 함수를 선언하고, 해당 함수를 openai 의 gpt가 이해할 수 있도록 json 형식으로 만들어줍니다

함수 소개 json 에 필요한 요소로는 name / description, parameters가 있으며

parameters 는 type / properties, required 항목으로 구성됩니다

def pizza_price_info(pizza_name: str):
    if '치즈' in pizza_name :
        pizza_price = {
            "name": pizza_name,
            "price": "10.99",
        }
    else:
        pizza_price = {
            "name": pizza_name,
            "price": "9.99",
        }        
    return json.dumps(pizza_price)
    
functions = [
    {
        "name": "pizza_price_info",
        "description": "피자의 가격을 알아봅니다",
        "parameters": {
            "type": "object",
            "properties": {
                "pizza_name": {
                    "type": "string",
                    "description": "The name of the pizza, e.g. Salami",
                },
            },
            "required": ["pizza_name"],
        },
    }
]

 

3. openai api 호출 chat함수 선언

-  openai에 호출할 chat함수를 만들었습니다!

- 이때 주목하점은 messages 아래 functions에 위의 선언된 함수 설명이 들어간다는 것입니다!!

def chat(query):
    completion = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": query}],
    functions=functions,
    )
    message =  completion.choices[0].message
    return message

 

 

4. 프롬포트 시작!!!

query = "고구마치즈피자가 얼마야??"
message = chat(query)
message

 

이제!! 고구마치즈피자 가격을 물어봅시다!!

결과는 gpt가 질문을 잘 이해하소, pizza_price함수를 호출하는데, 

 이때 피자 이름은 고구마 치즈 피자임을 잘 인식해서 진행하였습니다!!

ㅁ 정말 잘할까?
다른 질문을 넣으면 어떻게될까요!?
아래의 이미지와 같이 뜬금없는 질문을 하게된다면 function_call이 작동하지 않습니다!!

 

5. 이어서, 함수를 프롬포트하기 

  ① 결과에서 function_call 이 None이 아닌것이 확인된다면,

  ② 이어서 함수 프롬포트를 진행합니다!!

     -a : 기존의 질문쿼리 "고구마치즈피자가 얼마야" 를 넣고

      -b : 해당하는 함수, pizza_price_info를 넣고

      -c : 함수의 결론,  10.99 달러를 넣습니다!

 

구럼!! 결론을 잘 산출하는 것을확인할 수 있지요~!^^

if message.function_call:
    function_name = message.function_call.name
    pizza_name = json.loads(message.function_call.arguments).get("pizza_name")
    print(pizza_name)
    function_response = pizza_price_info(
        pizza_name=pizza_name
    )

    second_response = client.chat.completions.create(
        model="gpt-3.5-turbo-0613",
        messages=[
            {"role": "user", "content": query},
            message,
            {
                "role": "function",
                "name": function_name,
                "content": function_response,
            },
        ],
    )

second_response

 

 

 

어때요! 함수 호출의 기능을 잘 이해하셨나요!?

이제 아래와 같이 복합적 기능을 통해서 피자가격을 알려주는 

gpt 기반의 챗봇 코드를 공유드립니다!!

 

def pizza_price_chatbot(query):
    message = chat(query)
    message
    if message.function_call:
        function_name = message.function_call.name
        pizza_name = json.loads(message.function_call.arguments).get("pizza_name")
        print(pizza_name)
        function_response = pizza_price_info(
            pizza_name=pizza_name
        )

        second_response = client.chat.completions.create(
            model="gpt-3.5-turbo-0613",
            messages=[
                {"role": "user", "content": query},
                message,
                {
                    "role": "function",
                    "name": function_name,
                    "content": function_response,
                },
            ],
        )

    return second_response.choices[0].message.content

 

결과물도 멋지게~~ 짠!!

댓글