【랜체인 학습일지】구글 캘린더와 연동된 일정관리 챗봇 만들기 (1)

안녕. 오늘 진행하는 프로젝트는 스케줄 관리 치에쯔봇을 만드는데 구글 달력 API와 연동하고 자연 언어로 일정을 추가, 삭제, 조회 등을 추진하려고 합니다.진행하는 내용이 많아서 두세개의 블로그에 나누어 해설하고 싶은데 오늘은 최초의 블로그에서 기본 환경 설정 및 구글의 달력 연동까지 알아보려고 합니다.Streamlit와 UI을 설계하고 OpenAI에서 제공하는 gpt-4o모델을 Google Calendar API와 연동하고 치에쯔봇를 만드는 과정은 다음과 같은 단계로 진행됩니다.환경 설정 및 라이브러리의 설치 터미널에서 다음과 같이 입력하고 주고 필요한 라이브러리를 설치한다.안녕. 오늘 진행하는 프로젝트는 스케줄 관리 치에쯔봇을 만드는데 구글 달력 API와 연동하고 자연 언어로 일정을 추가, 삭제, 조회 등을 추진하려고 합니다.진행하는 내용이 많아서 두세개의 블로그에 나누어 해설하고 싶은데 오늘은 최초의 블로그에서 기본 환경 설정 및 구글의 달력 연동까지 알아보려고 합니다.Streamlit와 UI을 설계하고 OpenAI에서 제공하는 gpt-4o모델을 Google Calendar API와 연동하고 치에쯔봇를 만드는 과정은 다음과 같은 단계로 진행됩니다.환경 설정 및 라이브러리의 설치 터미널에서 다음과 같이 입력하고 주고 필요한 라이브러리를 설치한다.

pip install streamlit google-api-python-client google-auth-httplib2 google-auth-oauthlib openai pip install streamlit google-api-python-client google-auth-httplib2 google-auth-oauthlib openai

웹 대화창을 만들어 주는 streamlit, OpenAI API을 사용하기 위한 openai, 그리고 Google API을 활용할 수 있는 라이브러리를 설치했다.오늘 블로그는 기본 환경만 설정하기 위한 것이므로 LangChain 같은 프레임워크는 다음의 블로그에서 이용할 예정이다.Google Calendar API설정의 해당 API을 설정하려면 Google Cloud Platform에서 프로젝트를 작성하고 API을 유효하게 할 필요가 있다.이하의 링크에 접속해서 새로운 프로젝트를 작성한다.https://console.cloud.google.com/웹 대화창을 만들어 주는 streamlit, OpenAI API을 사용하기 위한 openai, 그리고 Google API을 활용할 수 있는 라이브러리를 설치했다.오늘 블로그는 기본 환경만 설정하기 위한 것이므로 LangChain 같은 프레임워크는 다음의 블로그에서 이용할 예정이다.Google Calendar API설정의 해당 API을 설정하려면 Google Cloud Platform에서 프로젝트를 작성하고 API을 유효하게 할 필요가 있다.이하의 링크에 접속해서 새로운 프로젝트를 작성한다.https://console.cloud.google.com/

Google Cloud PlatformCouldn’t sign you in The browser you’re using doesn’t support JavaScript, or has JavaScript turned off. To keep your Google Account secure, try signing in on a browser that has JavaScript turned on. Learn more Help Privacy Termsconsole.cloud.google.com Google Cloud PlatformCouldn’t sign you in The browser you’re using doesn’t support JavaScript, or has JavaScript turned off. To keep your Google Account secure, try signing in on a browser that has JavaScript turned on. Learn more Help Privacy Termsconsole.cloud.google.com

APIs&Services(API서비스)에서 google calendar를 검색하고 Google Calendar API에 들어 Enable(사용)을 클릭하고 활성화하고 있다.’사용자 인증 정보'(Credentials)에서 ‘사용자 인증 정보 구축'(Create Credentials)->’OAuth Client ID’를 선택한다.OAuth Consent Screen(OAuth의 동의 화면)에서 External(외부)을 선택하여 앱의 이름, 지원 전자 메일, 개발자의 연락처 등 필수 입력 사항을 입력하고 주고 다음 단계에서 앱 사용 권한 범위를 설정해야 하고, 가장 아래 부분의 직접 범위 추가로 쓰인 곳에 ‘https://www.googleapis.com/auth/calendar’를 입력하고 모든 권한을 모두 부여했다. 구체적인 권한 설정 방식에 대해서는 이하의 링크를 참고한다. https://developers.google.com/calendar/api/auth?hl=ko APIs&Services(API서비스)에서 google calendar를 검색하고 Google Calendar API에 들어 Enable(사용)을 클릭하고 활성화하고 있다.’사용자 인증 정보'(Credentials)에서 ‘사용자 인증 정보 구축'(Create Credentials)->’OAuth Client ID’를 선택한다.OAuth Consent Screen(OAuth의 동의 화면)에서 External(외부)을 선택하여 앱의 이름, 지원 전자 메일, 개발자의 연락처 등 필수 입력 사항을 입력하고 주고 다음 단계에서 앱 사용 권한 범위를 설정해야 하고, 가장 아래 부분의 직접 범위 추가로 쓰인 곳에 ‘https://www.googleapis.com/auth/calendar’를 입력하고 모든 권한을 모두 부여했다. 구체적인 권한 설정 방식에 대해서는 이하의 링크를 참고한다. https://developers.google.com/calendar/api/auth?hl=ko

Google Calendar API범위 선택| Google for Developers가 페이지는 Cloud Translation API을 통해서 번역되었습니다.홈 Google Workspace Google Calendar가이드 Google Calendar API범위 선택 이 문서에는 Google Calendar API관련 승인 및 인증 정보가 포함되어 있습니다.이 문서를 읽기 전에 인증 및 승인 조사에서 Google Workspace의 일반적인 인증 및 승인 정보를 읽어 보세요.승인을 위해서 OAuth 2.0구성 OAuth의 동의 화면 구성이나 범위 선택을 통해서, 사용자나 앱은 검토자에게 표시하는 정보를…developers.google.com Google Calendar API범위 선택| Google for Developers가 페이지는 Cloud Translation API을 통해서 번역되었습니다.홈 Google Workspace Google Calendar가이드 Google Calendar API범위 선택 이 문서에는 Google Calendar API관련 승인 및 인증 정보가 포함되어 있습니다.이 문서를 읽기 전에 인증 및 승인 조사에서 Google Workspace의 일반적인 인증 및 승인 정보를 읽어 보세요.승인을 위해서 OAuth 2.0구성 OAuth의 동의 화면 구성이나 범위 선택을 통해서, 사용자나 앱은 검토자에게 표시하는 정보를…developers.google.com

3번째 단계에서는 Test Users에 구글 메일을 입력하고 시험 권한을 부여한다.애플리케이션 타입을 “데스크탑 앱”로 설정하여 사용자 인증 정보를 작성한다.생성된 JSON파일을 다운로드하고 안전한 위치에 저장한다.”credentials.json”이라는 이름으로 저장했다.)OpenAI API키는 이미 설정되어 있다고 가정하고 다음으로 넘어가고도 하지 않은 경우는 이하의 블로그를 참조한다.https://blog.naver.com/pinocchio5715/223611948661 3번째 단계에서는 Test Users에 구글 메일을 입력하고 시험 권한을 부여한다.애플리케이션 타입을 “데스크탑 앱”로 설정하여 사용자 인증 정보를 작성한다.생성된 JSON파일을 다운로드하고 안전한 위치에 저장한다.”credentials.json”이라는 이름으로 저장했다.)OpenAI API키는 이미 설정되어 있다고 가정하고 다음으로 넘어가고도 하지 않은 경우는 이하의 블로그를 참조한다.https://blog.naver.com/pinocchio5715/223611948661

OpenAI API 따끔따끔한, 키 발행, 간단한 사용방법 안녕하세요~ 오늘은 OpenAI의 API를 이용하는 방법에 대해서 간단하게 「따끔따끔」하려고 합니다만… blog.naver.com OpenAI API 따끔따끔하기, 키 발행, 간단한 사용방법 안녕하세요~ 오늘은 OpenAI의 API를 이용하는 방법에 대해서 간단하게 「따끔따끔」하려고 합니다만, blog.naver.com

구글 캘린더 API를 사용하기 위해서는 인증 코드를 생성하는 단계를 다시 진행해야 한다. 다음과 같은 코드를 실행하여 “token.json” 파일을 생성해 준다. 구글 캘린더 API를 사용하기 위해서는 인증 코드를 생성하는 단계를 다시 진행해야 한다. 다음과 같은 코드를 실행하여 “token.json” 파일을 생성해 준다.

import os.pathfrom google.auth.transport.requests import Requestfrom google.oauth2.credentials import Credentialsfrom google_auth_oauthlib.flow import InstalledAppFlowSCOPES=[‘https://www.googleapis.com/auth/calendar’]def get_credentials():creds=None if os.path.exists(‘token.json’):creds=Credentials.from_authorized_user_file(‘token.json’,SCOPES)if not creds or not creds.valid:if creds and creds.expired and creds.refresh_token:creds.refresh(Request()else:flow=InstalledAppFlow.from_client_secrets_file(‘credentials.json’, SCOPES)creds=flow.run_local_server(port=0)with open(‘token.json’,’w’)as token:token.write(creds.to_json()return credsif__name__==’__main__’:get_credentials()print(“인증 완료.token.json파일이 생성되었습니다.”)import os.pathfrom google.auth.transport.requests import Requestfrom google.oauth2.credentials import Credentialsfrom google_auth_oauthlib.flow import InstalledAppFlowSCOPES=[‘https://www.googleapis.com/auth/calendar’]def get_credentials():creds=None if os.path.exists(‘token.json’):creds=Credentials.from_authorized_user_file(‘token.json’,SCOPES)if not creds or not creds.valid:if creds and creds.expired and creds.refresh_token:creds.refresh(Request()else:flow=InstalledAppFlow.from_client_secrets_file(‘credentials.json’, SCOPES)creds=flow.run_local_server(port=0)with open(‘token.json’,’w’)as token:token.write(creds.to_json()return credsif__name__==’__main__’:get_credentials()print(“인증 완료.token.json파일이 생성되었습니다.”)

위의 코드가 적힌 파이썬 파일을 터미널에서 실행하면 구글의 달력을 사용 권한에 대해서 문의하는 웹 페이지가 사용하는 웹 브라우저에서 개장된다.여기에서 구글 계정을 선택하고 Continue를 클릭하면 인증이 완료되고 token.json파일이 생성되었는지 재확인한다.이렇게 하면 모든 준비 단계가 끝났으니 gpt-4o의 모델과 구글 달력을 연동하는 방법에 대해서 알아보자.먼저, 새로운 파이썬 파일을 생성하고, 다음과 같은 코드를 이용한 google calendar와 연동하고 있다.앞부분에서 생성한 인증 코드 JSON파일을 이용하면 된다.위의 코드가 적힌 파이썬 파일을 터미널에서 실행하면 구글의 달력을 사용 권한에 대해서 문의하는 웹 페이지가 사용하는 웹 브라우저에서 개장된다.여기에서 구글 계정을 선택하고 Continue를 클릭하면 인증이 완료되고 token.json파일이 생성되었는지 재확인한다.이렇게 하면 모든 준비 단계가 끝났으니 gpt-4o의 모델과 구글 달력을 연동하는 방법에 대해서 알아보자.먼저, 새로운 파이썬 파일을 생성하고, 다음과 같은 코드를 이용한 google calendar와 연동하고 있다.앞부분에서 생성한 인증 코드 JSON파일을 이용하면 된다.

import datetimeimport os.pathfrom google.auth.transport.requests import Requestfrom google.oauth2.credentials import Credentialsfrom googleapiclient.discovery import buildfrom googleapiclient.errors import HttpErrorSCOPES = [‘https://www.googleapis.com/auth/calendar’]def get_credentials(): creds = None if os.path.exists(‘token.json’): creds = Credentials.from_authorized_user_file(‘token.json’, SCOPES)if not creds or not creds.valid:if creds and creds.expired and creds.refresh_token: creds.refresh(Request())else:return None return creds import datetimeimport os.pathfrom google.auth.transport.requests import Requestfrom google.oauth2.credentials import Credentialsfrom googleapiclient.discovery import buildfrom googleapiclient.errors import HttpErrorSCOPES = [‘https://www.googleapis.com/auth/calendar’]def get_credentials(): creds = None if os.path.exists(‘token.json’): creds = Credentials.from_authorized_user_file(‘token.json’, SCOPES)if not creds or not creds.valid:if creds and creds.expired and creds.refresh_token: creds.refresh(Request())else:return None return creds

다음은 구글 캘린더에서 일정을 확인하는 함수를 정의한다. 다음은 구글 캘린더에서 일정을 확인하는 함수를 정의한다.

def get_calendar_events(timeMin, timeMax):creds=get_credentials()if not creds:return”Google Calendar인증에 실패했습니다.’get_credentials.py’를 실행하고 인증을 완료하세요.”try:service=build(‘calendar’,’v3′, credentials=creds)events_result=service.events(). list(calendarId=’primary’, timeMin=timeMin, timeMax=timeMax, singleEvents=True, orderBy=’startTime’). execute()events=events_result.get(‘items’,[])if not events:return”일정이 없습니다.”else:event_list=[]for event in events:start=event[‘start’]. get(‘dateTime’, event[‘start’]. get(‘date’)event_list.append(f”{start}:{event[‘summary’]}”)return”\n”. join(event_list)except HttpError as error:return f”오류 발생:{error}”def get_calendar_events(timeMin, timeMax):creds=get_credentials()if not creds:return”Google Calendar인증에 실패했습니다.’get_credentials.py’를 실행하고 인증을 완료하세요.”try:service=build(‘calendar’,’v3′, credentials=creds)events_result=service.events(). list(calendarId=’primary’, timeMin=timeMin, timeMax=timeMax, singleEvents=True, orderBy=’startTime’). execute()events=events_result.get(‘items’,[])if not events:return”일정이 없습니다.”else:event_list=[]for event in events:start=event[‘start’]. get(‘dateTime’, event[‘start’]. get(‘date’)event_list.append(f”{start}:{event[‘summary’]}”)return”\n”. join(event_list)except HttpError as error:return f”오류 발생:{error}”

해당 함수는 time Min부터 time Max까지의 기간 내에 Google 캘린더에 등록된 일정을 취득하도록 정의되었다. 다음은 구글 캘린더에 일정을 추가하는 함수를 만들어 준다. 해당 함수는 time Min부터 time Max까지의 기간 내에 Google 캘린더에 등록된 일정을 취득하도록 정의되었다. 다음은 구글 캘린더에 일정을 추가하는 함수를 만들어 준다.

def add_calendar_event(summary, start_time, end_time):creds=get_credentials()if not creds:return”Google Calendar인증에 실패했습니다.’get_credentials.py’를 실행하고 인증을 완료하세요.”try:service=build(‘calendar’,’v3′, credentials=creds)event={‘summary’:summary,’start’:{‘dateTime’:start_time,’timeZone’:’Asia/Seoul’,},’end’:{‘dateTime’:end_time,’timeZone’:’Asia/Seoul’,},}created_event=service.events(). insert(calendarId=’primary’, body=event). execute()return f”일정이 추가되었습니다:{created_event.get(‘htmlLink’)}”except HttpError as error:return f”오류 발생:{error}”def add_calendar_event(summary, start_time, end_time):creds=get_credentials()if not creds:return”Google Calendar인증에 실패했습니다.’get_credentials.py’를 실행하고 인증을 완료하세요.”try:service=build(‘calendar’,’v3′, credentials=creds)event={‘summary’:summary,’start’:{‘dateTime’:start_time,’timeZone’:’Asia/Seoul’,},’end’:{‘dateTime’:end_time,’timeZone’:’Asia/Seoul’,},}created_event=service.events(). insert(calendarId=’primary’, body=event). execute()return f”일정이 추가되었습니다:{created_event.get(‘htmlLink’)}”except HttpError as error:return f”오류 발생:{error}”

OpenAI에서 챗봇 모델을 불러온다. OpenAI에서 챗봇 모델을 불러온다.

from openai import OpenAIimport osfrom dotenv import load_dotenvload_dotenv()openai_api_key=os.getenv(“OPENAI_API_KEY”)client=OpenAI(api_key=openai_api_key)def generate_response(prompt):try:completion=client.chat.completions.create(model=”gpt-4o”, messages=[{“role”:”system”,”content”:”당신은 사용자의 스케줄을 관리하고 주었다 치에쯔봇이프니다.사용자에게 친절하고 정확하게 대답하세요.”}{“role”:”user”,”content”:prompt}], max_tokens=300, return completion.choices[0].message.content.strip()except Exception as e:return f”오류 발생:{e}”from openai import OpenAIimport osfrom dotenv import load_dotenvload_dotenv()openai_api_key=os.getenv(“OPENAI_API_KEY”)client=OpenAI(api_key=openai_api_key)def generate_response(prompt):try:completion=client.chat.completions.create(model=”gpt-4o”, messages=[{“role”:”system”,”content”:”당신은 사용자의 스케줄을 관리하고 주는 치에쯔봇이프니다.사용자에게 친절하고 정확하게 대답하세요.”}{“role”:”user”,”content”:prompt}], max_tokens=300, return completion.choices[0].message.content.strip()except Exception as e:return f”오류 발생:{e}”

마지막 단계로 Streamlit로 웹 환경을 구성하여 접속하면 된다. 마지막 단계로 Streamlit로 웹 환경을 구성하여 접속하면 된다.

import streamlit as stimport datetimest.title(“스케줄 관리 치에쯔봇”)if”messages”not in st.session_state:st.session_state.messages=[]for message in st.session_state.messages:with st.chat_message(message[“role”]):st.markdown(message[“content”])if prompt:=st.chat_input(” 알고 싶은 것을 물어보세요”):st.session_state.messages.append({“role”:”user”,”content”:prompt})with st.chat_message(“user”):st.markdown(prompt)if”이번 일정”in prompt:now=datetime.datetime.now()start_of_week=now-datetime.timedelta(days=now.weekday()end_of_week=start_of_week+datetime.timedelta(days=6)timeMin=start_of_week.replace(hour=0, minute=0, second=0, microsecond=0).isoformat()+’Z’timeMax=end_of_week.replace(hour=23, minute=59, second=59, microsecond=999999). isoformat()+’Z’response=get_calendar_events(timeMin, timeMax)else:response=generate_response(prompt)st.session_state.messages.append({“role”:”assistant”,”content”:response})with st.chat_message(“assistant”):st.markdown(response)import streamlit as stimport datetimest.title(“스케줄 관리 치에쯔봇”)if”messages”not in st.session_state:st.session_state.messages=[]for message in st.session_state.messages:with st.chat_message(message[“role”]):st.markdown(message[“content”])if prompt:=st.chat_input(” 알고 싶은 것을 물어보세요”):st.session_state.messages.append({“role”:”user”,”content”:prompt})with st.chat_message(“user”):st.markdown(prompt)if”이번 일정”in prompt:now=datetime.datetime.now()start_of_week=now-datetime.timedelta(days=now.weekday()end_of_week=start_of_week+datetime.timedelta(days=6)timeMin=start_of_week.replace(hour=0, minute=0, second=0, microsecond=0).isoformat()+’Z’timeMax=end_of_week.replace(hour=23, minute=59, second=59, microsecond=999999). isoformat()+’Z’response=get_calendar_events(timeMin, timeMax)else:response=generate_response(prompt)st.session_state.messages.append({“role”:”assistant”,”content”:response})with st.chat_message(“assistant”):st.markdown(response)

인위적으로 “이번 일정”이라는 단어가 들어가면 이번 주의 일정을 알고 출력하는 함수를 작성한 것에 해당 방법은 아주 구석기 시대의 방법이라고 한다.다음의 블로그는 구체적인 말씨들을 어떻게 gpt-4o-mini모델을 가지고 렝치에 인과 렝그레프을 활용하고 합리적으로 취급할 수 있는지 구체적으로 본다.이 블로그에서는 초기 환경 설정하는 단계까지 학습하려는 것으로 현재의 세팅에서 잘 동작하는지만 살펴보자.해당 파이썬 파일을 Streamlit로 실행하려면 터미널에서 다음과 같은 프롬프트를 입력해야 한다.인위적으로 “이번 일정”이라는 단어가 들어가면 이번 주의 일정을 알고 출력하는 함수를 작성한 것에 해당 방법은 아주 구석기 시대의 방법이라고 한다.다음의 블로그는 구체적인 말씨들을 어떻게 gpt-4o-mini모델을 가지고 렝치에 인과 렝그레프을 활용하고 합리적으로 취급할 수 있는지 구체적으로 본다.이 블로그에서는 초기 환경 설정하는 단계까지 학습하려는 것으로 현재의 세팅에서 잘 동작하는지만 살펴보자.해당 파이썬 파일을 Streamlit로 실행하려면 터미널에서 다음과 같은 프롬프트를 입력해야 한다.

streamlit run google_calendar_chatbot.py streamlit run google_calendar_chatbot.py

웹브라우저에서 아래 이미지와 같이 잘 작동하는 것을 볼 수 있다. 웹브라우저에서 아래 이미지와 같이 잘 작동하는 것을 볼 수 있다.

안타깝게도 현재 세팅에서는 다음 프롬프트를 입력할 때 구글 캘린더와의 연동이 끊기게 된다. 이러한 문제에 대한 해결 방식과 다양한 프롬프트에 대한 NLP에 대해서는, 다음의 블로그에서 학습하기로 한다. 안타깝게도 현재 세팅에서는 다음 프롬프트를 입력할 때 구글 캘린더와의 연동이 끊기게 된다. 이러한 문제에 대한 해결 방식과 다양한 프롬프트에 대한 NLP에 대해서는, 다음의 블로그에서 학습하기로 한다.

감사합니다! 감사합니다!