콘텐츠로 이동

구글 시트에 예약정보 저장하기

실행 준비

!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()