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
결과물도 멋지게~~ 짠!!
'데이터&AI > LLM' 카테고리의 다른 글
Tavily(타빌리)는 무엇일까?? (인공지능을 통한 검색!) (1) | 2024.01.29 |
---|---|
Openai API로 DALL·E 이미지 생성하기!! (feat. python) (1) | 2024.01.27 |
GPT API의 모델 종류 알아보기 (openai gpt models)- 24년 1월 기준 최신 버전! (0) | 2024.01.25 |
GPT API 활용하기 (feat. pip install openai)- 24년 1월 기준 최신버젼!! (1) | 2024.01.24 |
chatgpt 스토어를 알아보쟈!! (1) | 2024.01.15 |
댓글