구글 PS2팀 채영욱
1. Apps script 기반 Chat App 개요
apps script는 Google Workspace에서 제공하는 제품으로 간단한 코드를 개발해서 서비스 할 수 있는 환경입니다.
https://script.google.com 사이트에서 신규 프로젝트를 생성하고, 채팅 앱을 개발하여 빌드합니다. 채팅 아키텍처는 아래 그림과 같이 사용자가 구글 챗을 통해 메시지를 전송하면 구글 클라우드의 Apps script 채팅 앱이 메시지를 수신하고 처리합니다. 처리한 메시지는 다시 구글 챗으로 응답을 보내서 사용자가 수신을 하는 패턴입니다.
Apps script 채팅 아키텍처 패턴
2. Google cloud platform 프로젝트 생성 및 구성
채팅 앱을 구현하기 위해서는 구글 클라우드의 프로젝트가 필요합니다. 구글 클라우드 프로젝트는 구글 계정을 생성하고, Google Cloud Console 에서 프로젝트를 생성 할 수 있습니다. 프로젝트를 생성하면 Chat API 사용을 설정하고 OAuth 동의 화면을 구성합니다.
- API 사용 설정
GCP 콘솔에서 Chat API를 API 사용하기로 설정합니다.
- OAuth 동의 화면 구성 절차
- Google Cloud 콘솔에서 메뉴 menu > API 및 서비스 > OAuth 동의 화면으로 이동합니다.
- 앱의 사용자 유형을 선택한 다음 만들기 버튼을 클릭합니다.
- 앱 등록 양식을 작성한 다음 저장 후 계속 버튼을 클릭합니다.
- 지금은 범위 추가를 건너뛰고 저장 후 계속을 클릭해도 됩니다. 앞으로 Google Workspace 조직 외부에서 사용할 앱을 만들 때는 앱에 필요한 승인 범위를 추가하고 확인해야 합니다.
- 사용자 유형으로 외부를 선택한 경우 테스트 사용자를 추가합니다.
- 테스트 사용자에서 사용자 추가를 클릭합니다.
- 이메일 주소 및 승인된 다른 테스트 사용자를 입력한 다음 저장하고 계속하기를 클릭합니다.
- 앱 등록 요약을 검토합니다. 변경하려면 수정을 클릭합니다. 앱 등록이 확인되면 대시보드로 돌아가기를 클릭합니다.
3. 템플릿으로 Chat App 구현 및 배포
Apps script에서 제공하는 Chat App 템플릿을 사용하여 프로젝트를 생성한 다음 테스트 배포를 통해 앱 게시를 준비합니다.
- 스크립트 설정
- Apps Script 시작하기 로 이동합니다.
- 하단의 채팅 앱 템플릿을 클릭합니다.
- 편집기 상단의 제목을 AI Chatbot으로 변경하고, 왼쪽 하단의 프로젝트 설정() 프로젝트 설정 아이콘을 클릭합니다.
- Google Cloud Platform(GCP) 프로젝트에서 프로젝트 변경 버튼을 클릭합니다.
- GCP 프로젝트에서 프로젝트 번호를 복사하여 Google Cloud 프로젝트 번호를 붙여넣고 프로젝트 설정 버튼을 클릭합니다.
- 앱 게시를 위해서 App 배포가 필요합니다. 채팅 앱 Apps Script 프로젝트에서 오른쪽 상단 배포 버튼에서 배포 테스트를 클릭합니다.
- 이후 단계에서 사용하기 위해 배포 ID를 복사하고 완료를 클릭합니다.
4. Google cloud platform에서 Chat App 게시
- Chat App 게시하기
- Google Cloud 콘솔에서 Google Chat API를 검색하고 Google Chat API를 클릭하고, 관리 버튼을 클릭합니다.
- 구성 버튼을 클릭하고 채팅 앱에서 다음과 같이 설정합니다.
- 앱 이름 필드에 AI Chatbot을 입력합니다.
- 아바타 URL 필드에 https://developers.google.com/chat/images/quickstart-app-avatar.png를 입력합니다.
- 설명 필드에 AI Chatbot을 입력합니다.
- 기능에서 1:1 메시지 수신 및 스페이스 및 그룹 대화 참여를 선택합니다.
- 연결 설정에서 Apps Script 프로젝트를 선택하고 배포 ID를 필드에 붙여넣습니다.
- 공개 상태에서 내 도메인의 특정 사용자 및 그룹을 선택하고 이메일을 입력합니다.
- 저장을 클릭하고 페이지를 새로고침합니다.
- 상단 앱 상태를 활성 – 사용가능 설정하고 저장합니다.
- Chat App 테스트
- Chat을 열고 새 채팅에서 AI Chatbot을 선택합니다..
- 대화창에 ‘Thank you for adding me to 스페이스 이름’이 표시됩니다.
- 메시지창에 글을 입력하면 입력한 내용으로 Chatbot이 응답합니다.
5. Gemini api를 구현하여 Chatbot에 연동하기
Apps script에서 Google cloud에서 제공하는 Gemini api 호출을 하기 위해 OAuth 인증을 설정하고 API를 호출하는 코드를 구현한 다음 Chat 코드와 연동합니다.
- Gemini API 구현 및 Chat 연동
- Apps script에서 파일 추가(+) 버튼을 클릭하고 스크립트를 선택한다음 파일명을 gemini로입력합니다.
- gemini API를 호출하는 함수를 다음과 같이 구현합니다.
function callGeminiAIP(message){ // oAuth 인증 정보 조회 const geminiService = oAuth(); if (!geminiService.hasAccess()) { Logger.log("Credential Error: "+ geminiService.getLastError()); } // GCP 프로젝트 정보 const API_ENDPOINT="asia-northeast3-aiplatform.googleapis.com" const PROJECT_ID="GCP 프로젝트명" const MODEL_ID="gemini-1.0-pro-vision-001" const LOCATION_ID="asia-northeast3" const apiUrl = 'https://'+API_ENDPOINT+'/v1/projects/' + PROJECT_ID + '/locations/'+LOCATION_ID+'/publishers/google/models/' + MODEL_ID + ':streamGenerateContent'; // Http Header 구성 const headers = { Authorization: `Bearer ${geminiService.getAccessToken()}`, 'Content-Type': 'application/json' }; // 요청 본문 구성 const requestData = { 'contents': [ { 'role': 'user', 'parts': [ { 'text': message } ] } ], 'generation_config': { "maxOutputTokens": 2048, "temperature": 0.4, "topP": 1, "topK": 32 }, 'safetySettings': [ { 'category': 'HARM_CATEGORY_HATE_SPEECH', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_DANGEROUS_CONTENT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_SEXUALLY_EXPLICIT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' }, { 'category': 'HARM_CATEGORY_HARASSMENT', 'threshold': 'BLOCK_MEDIUM_AND_ABOVE' } ] }; // Gemini 응답 결과 const response = UrlFetchApp.fetch(apiUrl, { 'method': 'post', 'headers': headers, 'muteHttpExceptions': true, 'payload': JSON.stringify(requestData) }); // 응답 결과에서 답변 추출 후 전달 const responseData = JSON.parse(response.getContentText()); return responseData[0].candidates[0].content.parts[0].text; }
- OAuth 인증을 위해 라이브러리 등록이 필요하며, 왼쪽 메뉴의 라이브러리(+)를 클릭하고 스크립트 ID에 1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF 를 입력후 조회하고 추가합니다.
- Apps script에서 파일 추가(+) 버튼을 클릭하고 스크립트를 선택한다음 파일명을 oauth로 입력합니다.
- OAuth 인증을 위한 코드를 아래와 같이 구현합니다. GCP 서비스 계정은 구글 클라우드 공식 문서에서 확인 할 수 있습니다.
// GCP service key const CREDENTIALS_PALM = { PRIVATE_KEY: "-----BEGIN PRIVATE KEY--GCP의 서비스 계정에 대한 키 정보 ---END PRIVATE KEY-----\n", CLIENT_EMAIL: "서비스 계정 정보" } // OAuth 인증 정보 조회 function oAuth() { return ( OAuth2.createService("vertexai") .setTokenUrl("https://accounts.google.com/o/oauth2/token") .setPrivateKey(CREDENTIALS_PALM.PRIVATE_KEY) .setIssuer(CREDENTIALS_PALM.CLIENT_EMAIL) .setPropertyStore(PropertiesService.getScriptProperties()) .setCache(CacheService.getUserCache()) .setLock(LockService.getUserLock()) .setScope(["https://www.googleapis.com/auth/cloud-platform"]) ) }
- gemini API 호출을 위해 Code.gs의 onMessage 함수에서의 아래 내용을 다음과 같이 변경합니다.
var message = name + " said \"" + event.message.text + "\""; 아래와 같이 변경 var message = callGeminiAIP(event.message.text);
- AI 챗봇 서비스 테스트
위 과정은 Gemini API의 기본 설정을 통해 Chatbot을 구현하였습니다. 다시 Google Chat 의 AI Chatbot 메시지창에 입력하고 질문을 하면 아래 화면과 같이 Gemini를 통한 답변을 받을 수 있습니다.