구글 시트에 예약정보 저장하기
실행 준비
!pip install openai
!pip install gradio
google drive 연결하기
from google.colab import drive
drive.mount('/content/drive')
필요한 라이브러리 설치 및 인증
!pip install --upgrade gspread gspread-dataframe
from google.colab import auth
auth.authenticate_user()
import gspread
from gspread_dataframe import set_with_dataframe
from gspread_dataframe import get_as_dataframe
import pandas as pd
구글 시트 API 인증
from google.auth import default
creds, _ = default()
gc = gspread.authorize(creds)
구글 시트 저장 함수 정의
def update_sheet(sheet_name, df_new):
# ✅ 기존 파일이 존재하는지 확인
spreadsheet_list = gc.list_spreadsheet_files()
sheet = None
for f in spreadsheet_list:
if f['name'] == sheet_name:
sheet = gc.open_by_key(f['id'])
break
# ✅ 파일이 없으면 새로 생성
if sheet is None:
sheet = gc.create(sheet_name)
# 워크시트 선택 (없으면 기본 워크시트 사용)
worksheet = sheet.get_worksheet(0)
# ✅ 기존 데이터 불러오기 (비어있을 수도 있음)
try:
df_existing = get_as_dataframe(worksheet, evaluate_formulas=True)
df_existing.dropna(how="all", inplace=True) # 전부 NaN이면 제거
except:
df_existing = pd.DataFrame()
# ✅ 기존 데이터에 새 데이터 추가
df_combined = pd.concat([df_existing, df_new], ignore_index=True)
# ✅ 시트 초기화 후 업데이트
worksheet.clear()
set_with_dataframe(worksheet, df_combined)
구글 시트에 회의실 예약 정보 저장하기
from openai import OpenAI
import gradio as gr
import json
client = OpenAI()
def predict(message, history):
history_openai_format = []
history_openai_format.append({"role": "user", "content":"지시사항: 회의실 예약을 위해 주어진 정보가 수집될 때 까지 대화를 요청해줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름, 예약날짜, 예약시간, 예약자이름을 알때 까지 대화를 요청해줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름은 A룸, B룸, C룸이 있어."})
history_openai_format.append({"role": "user", "content":"지시사항: 사용자가 회의실 예약을 요청한 경우, A룸, B룸, C룸 중에서 어느 룸으로 할 지 물어봐줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름, 예약날짜, 예약시간, 예약자이름을 모두 알면 meeting_reservation 함수를 호출해 주고, 그렇지 않으면 계속 질문해줘."})
for human, assistant in history:
history_openai_format.append({"role": "user", "content": human })
history_openai_format.append({"role": "assistant", "content":assistant})
history_openai_format.append({"role": "user", "content": message})
completion = client.chat.completions.create(
model='gpt-4o-mini',
messages= history_openai_format,
temperature=1.0,
functions=[
{
"name": "meeting_reservation",
"description": "회의실 예약을 처리하는 함수",
"parameters": {
"type": "object",
"properties": {
"room_name": {
"type": "string",
"description": "회의실 이름",
},
"reserv_date": {
"type": "string",
"description": "회의실 예약 날짜",
},
"reserv_time": {
"type": "string",
"description": "회의실 예약 시간",
},
"reserv_name": {
"type": "string",
"description": "회의실 예약자 이름",
}
},
"required": ["room_name", "reserv_date", "reserv_time", "reserv_name"]
}
}
]
)
response = completion.choices[0].message;
print(response)
if completion.choices[0].message.function_call:
arguments = completion.choices[0].message.function_call.arguments
function_name = completion.choices[0].message.function_call.name
if function_name == "meeting_reservation":
arguments_obj = json.loads(arguments)
room_name = arguments_obj.get('room_name')
reserv_date = arguments_obj.get('reserv_date')
reserv_time = arguments_obj.get('reserv_time')
reserv_name = arguments_obj.get('reserv_name')
sheet_name = "회의실예약"
df_new = pd.DataFrame({
'회의실 이름': [room_name],
'날짜': [reserv_date],
'시간': [reserv_time],
'예약자 이름': [reserv_name]
})
update_sheet(sheet_name, df_new)
return "회의실 예약을 저장하였습니다: " + room_name + " / " + reserv_date+ " / " + reserv_time+ " / " + reserv_name
else:
return response.content
with gr.Blocks() as demo:
gr.Markdown(
"""
# AI 정보 수집 챗봇
제시된 질문에 답해 주세요!
""")
gr.ChatInterface(predict)
demo.launch()
새롭계 예약을 요청하거나 다시 요청하는 경우에 대한 보완
from openai import OpenAI
import gradio as gr
import json
client = OpenAI()
def predict(message, history):
history_openai_format = []
history_openai_format.append({"role": "user", "content":"지시사항: 회의실 예약을 위해 주어진 정보가 수집될 때 까지 대화를 요청해줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름, 예약날짜, 예약시간, 예약자이름을 알때 까지 대화를 요청해줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름은 A룸, B룸, C룸이 있어."})
history_openai_format.append({"role": "user", "content":"지시사항: 사용자가 회의실 예약을 요청한 경우, A룸, B룸, C룸 중에서 어느 룸으로 할 지 물어봐줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실 예약을 다시 요청하거나 새롭게 요청할 경우, 기존의 예약 정보는 모두 초기화 하고 다시 예약 정보를 수집해줘."})
history_openai_format.append({"role": "user", "content":"지시사항: 회의실이름, 예약날짜, 예약시간, 예약자이름을 모두 알면 meeting_reservation 함수를 호출해 주고, 그렇지 않으면 계속 질문해줘."})
for human, assistant in history:
history_openai_format.append({"role": "user", "content": human })
history_openai_format.append({"role": "assistant", "content":assistant})
history_openai_format.append({"role": "user", "content": message})
completion = client.chat.completions.create(
model='gpt-4o-mini',
messages= history_openai_format,
temperature=1.0,
functions=[
{
"name": "meeting_reservation",
"description": "회의실 예약을 처리하는 함수",
"parameters": {
"type": "object",
"properties": {
"room_name": {
"type": "string",
"description": "회의실 이름",
},
"reserv_date": {
"type": "string",
"description": "회의실 예약 날짜",
},
"reserv_time": {
"type": "string",
"description": "회의실 예약 시간",
},
"reserv_name": {
"type": "string",
"description": "회의실 예약자 이름",
}
},
"required": ["room_name", "reserv_date", "reserv_time", "reserv_name"]
}
}
]
)
response = completion.choices[0].message;
print(response)
if completion.choices[0].message.function_call:
arguments = completion.choices[0].message.function_call.arguments
function_name = completion.choices[0].message.function_call.name
if function_name == "meeting_reservation":
arguments_obj = json.loads(arguments)
room_name = arguments_obj.get('room_name')
reserv_date = arguments_obj.get('reserv_date')
reserv_time = arguments_obj.get('reserv_time')
reserv_name = arguments_obj.get('reserv_name')
sheet_name = "회의실예약"
df_new = pd.DataFrame({
'회의실 이름': [room_name],
'날짜': [reserv_date],
'시간': [reserv_time],
'예약자 이름': [reserv_name]
})
update_sheet(sheet_name, df_new)
return "회의실 예약을 저장하였습니다: " + room_name + " / " + reserv_date+ " / " + reserv_time+ " / " + reserv_name
else:
return response.content
with gr.Blocks() as demo:
gr.Markdown(
"""
# AI 정보 수집 챗봇
제시된 질문에 답해 주세요!
""")
gr.ChatInterface(predict)
demo.launch()