반응형
2023년 6월 13일에 OpenAI의 Chat Completions API에 새로운 기능인 function calling이 업데이트되었습니다. 자세한 내용은 아래 링크에서 확인할 수 있습니다.
https://openai.com/blog/function-calling-and-other-api-updates
이 글은 function calling을 사용하여 날씨 함수를 호출하고 응답하는 과정을 간단하게 설명합니다.
먼저, 날씨 조회를 위한 인터페이스 역할을 하는 더미 함수를 작성합니다.
import json
def get_current_weather(arguments):
"""현재 위치의 현재 날씨를 확인합니다"""
weather_info = {
"location": arguments['location'],
"temperature": "72",
"unit": arguments['unit'],
"forecast": ["맑음"],
}
return json.dumps(weather_info)
그 다음 OpenAI API에서 사용할 함수를 정의합니다.
function_descriptions = [
{
# name은 함수 이름입니다.
"name": "get_current_weather", \
# description은 함수가 수행하는 작업에 대한 설명입니다. GPT는 이 정보를 사용하여 함수를 호출여부를 결정합니다.
"description": "현재 위치의 현재 날씨를 확인합니다",
# parameters에는 함수에 필요한 모든 입력 필드가 포함됩니다. 다음과 타입을 사용할 수 있습니다: String, Number, Boolean, Object, Null, AnyOf.
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "도시(예: 서울)",
},
"unit": {
"type": "string",
"description": "사용할 온도 단위입니다. 사용자 위치에서 이를 유추합니다.",
"enum": ["섭씨", "화씨"]
},
},
# required는 함수를 수행하는 데 필요한 필수 매개변수입니다. 나머지 매개변수는 옵션으로 취급됩니다.
"required": ["location", "unit"],
},
}
]
위에서 정의한 함수와 함께 사용자 입력을 사용하여 gpt-3.5-turbo-0613
모델을 호출합니다.
import openai
user_query = "서울 날씨는?"
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[{"role": "user", "content": user_query}],
functions=function_descriptions,
function_call="auto",
)
print(response)
그럼 다음과 같이 응답 메시지를 받게 됩니다.
{
"choices": [
{
"finish_reason": "function_call",
"index": 0,
"message": {
"content": null,
"function_call": {
"arguments": "{\n \"location\": \"서울\",\n \"unit\": \"섭씨\"\n}",
"name": "get_current_weather"
},
"role": "assistant"
}
}
],
"created": 1686753796,
"id": "chatcmpl-7RM0KwgwOpiaZ1H2YUZoYyahzzcWd",
"model": "gpt-3.5-turbo-0613",
"object": "chat.completion",
"usage": {
"completion_tokens": 28,
"prompt_tokens": 98,
"total_tokens": 126
}
}
응답 메시지에서 choices의 첫 번째 항목의 message에서 function_call을 확인하고 다음과 같이 함수를 호출합니다.
# 함수명과 인자값 파싱
response_message = response["choices"][0]["message"]
function_name = response_message['function_call']['name']
arguments = json.loads(response_message['function_call']['arguments'])
# 함수에 인자값을 넣어 실행하기
function_response = eval(f"{function_name}(arguments)")
print(function_response)
응답:
'{"location": "서울", "temperature": "72", "unit": "섭씨", "forecast": ["맑음"]}'
최종 응답을 받기 위해 지금 까지 받은 응답 메시지를 다시 gpt-3.5-turbo-0613
모델에 보냅니다.
response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-0613",
messages=[
{"role": "user", "content": user_query},
{"role": "assistant", "content": response_message['content'], "function_call": response_message['function_call']},
{"role": "function", "name": function_name, "content": function_response}
],
functions=function_descriptions,
function_call="auto",
)
print(response['choices'][0]['message']['content'])
최종 응답:
현재 서울의 날씨는 72°C이며, 강수량은 없습니다.
or
반응형
'개발 > AI 개발' 카테고리의 다른 글
오픈소스 Code Interpreter API를 활용한 데이터 시각화, 주식 차트 그리기, 이미지 편집 방법 (0) | 2023.07.24 |
---|---|
GPT Engineer를 활용한 프로젝트 생성과 실행 (0) | 2023.07.22 |
랭체인에서 사용가능한 벡터DB 비교 (0) | 2023.05.27 |
(라마인덱스) 내 옵시디언 노트 기반으로 답변하는 봇 구축하기 (0) | 2023.05.20 |
랭체인으로 유튜브 요약하기 (1) | 2023.05.18 |