Google Chat APIとVertex AIで作るGemini搭載Chatbotの作成方法
Vertex AIを用いてGoogle Chatのチャットボットを作成する方法を紹介します。
はじめに
今回はVertex AIを用いてGoogle Chatのチャットボットを作成しました。
作成する手順で難しいものがあったため、このブログで一から細かく説明しております。
使用するツールの説明
Vertex AI Agent Builderとは
Vertex AI Agent Builderは、機械学習モデルやAIエージェントを簡単に構築、デプロイ、管理するためのツールで、Google Cloudの強力なインフラとAI技術を活用します。
Google Chat APIとは
Google Chat APIは、Google Chatで動作するボットやアプリケーションを作成するためのツールであり、メッセージの送受信やインタラクティブなカードの使用をサポートします。
実装手順
チャットボットの作成手順は以下の通りです。
3.1 アプリの作成
3.2 アプリをデプロイ
3.3 Google Chat APIの設定
では、順に説明していきます。
3.1 アプリの作成手順
①Cloud Storage内でバケットを作成
1.バケットで「作成」をクリックします。
2.「バケットに名前を付ける」で任意の名前を付けてください
3.「データの保存場所の選択」のロケーションタイプとして「Multi-region」をクリックし、「asia」を選択してください。
4.「作成」をクリックします。
②作成したバケット内にデータをアップロード
1.バケット内から先ほど作成したバケットを選択します。
2.ファイルまたはフォルダをアップロードします。
③Agent Builderでデータストアを作成
1.「データストアを作成」をクリックします。
2.データストアで「Cloud Storage」を選択してください。
3.バケットにアップロードしたデータのファイル形式と同じものを選択します。
4.②のバケットをインポートします。
5.マルチリージョンを「global(グローバル)」とし、任意のデータストア名をつけて「作成」をクリックします。
④Agent Builderでアプリを作成
1.「アプリを作成する」をクリックします。
2.「検索」を選択します。
3.今回のチャットボットでは、要約文を生成する必要があるため、Advanced LLM featuresを有効化します。
4.任意のアプリ名、会社名を入力し、マルチリージョンを「global(グローバル)」にします。
5.先ほど作成したデータストアを選択し、「作成」をクリックしてください。
以上までがアプリの作成手順です。
自身が作ったアプリを選択すると検索機能を使うことができるので、正しい回答が返ってくるかをテストしてみましょう。
3.2 アプリをデプロイする手順
①ファンクションを作成
1.Cloud Functionsで「ファンクションを作成」をクリックします。
2.パラメータを以下の通りに設定してください。
環境:第2世代
関数名:任意の関数名
リージョン:asia-northeast1(東京)
トリガーのタイプ:HTTPS
※未認証の呼び出しを許可
※※サービスアカウント:「ディスカバリーエンジン閲覧者」を保有しているものを指定
ランタイム環境変数の変数を追加
PROJECT_ID:今回使用しているGoogle CloudのプロジェクトID
PROJECT_NUMBER:今回使用しているGoogle Cloudのプロジェクトナンバー
DATA_STORE:3.1で作成したデータストアのID
CHAT_ISSUER:「chat@system.gserviceaccount.com」
PUBLIC_CERT_URL_PREFIX:「https://www.googleapis.com/service_accounts/v1/metadata/x509/」
※Google Chat API と Cloud Funcitons による実装では、Cloud Functions の認証タイプを「未承認の呼び出しを許可」にする必要があります。
※※サービスアカウントで「ディスカバリーエンジン閲覧者」を保有しているものがない場合(または確認方法が分からない場合)
・サービスアカウントの「作成」をクリックします。
・任意のサービスアカウント名を入力し、「作成して実行」をクリックします。
・ロールを選択で「ディスカバリーエンジン閲覧者」を選択し、完了
以上のパラメータを設定したら「次へ」をクリックします。
3.ランタイムを「Python 3.11」、エントリポイントを「chatbot」とします。
4.以下にソースコードを記載します。
requirements.txt
functions-framework==3.*
google-cloud-discoveryengine==0.11.6
oauth2client==4.1.3
main.py
from typing import Any, Mapping
from google.cloud.discoveryengine_v1alpha import SearchServiceClient, SearchRequest
from google.protobuf.json_format import MessageToDict
from oauth2client import client
import functions_framework, flask, os
PROJECT_ID = os.environ.get("PROJECT_ID")
PROJECT_NUMBER = os.environ.get("PROJECT_NUMBER")
DATA_STORE = os.environ.get("DATA_STORE")
#Google Chatから送られてくるBearer Tokenの整合に使用 CHAT_ISSUER = os.environ.get("CHAT_ISSUER") PUBLIC_CERT_URL_PREFIX = os.environ.get("PUBLIC_CERT_URL_PREFIX") def search_document(text: str) -> Mapping[str, Any]: discov_client = SearchServiceClient() #Vertex AI Searchのアプリ等基本的な内容を設定 serving_config = discov_client.serving_config_path( project=PROJECT_ID, location="global", data_store=DATA_STORE, serving_config="default_config" ) #Vertex AI Searchの出力内容に関する設定 content_search_spec = SearchRequest.ContentSearchSpec( #スニペットを出力させない snippet_spec=SearchRequest.ContentSearchSpec().SnippetSpec( return_snippet=False ), #要約文を出力させる summary_spec=SearchRequest.ContentSearchSpec().SummarySpec( summary_result_count=3, include_citations=False, #Gemini Proを用いるように指定 model_spec=SearchRequest.ContentSearchSpec().SummarySpec().ModelSpec( version="preview" ) ) ) #Vertex AI Searchにクエリを投げる response = discov_client.search( SearchRequest( serving_config=serving_config, query=text, page_size=3, content_search_spec=content_search_spec ) ) #要約文取得 summary = response.summary.summary_text.replace("", "").replace("", "") #関連ファイル取得 references = [] for r in response.results: r_dct = MessageToDict(r._pb) link = r_dct["document"]["derivedStructData"]["link"] references.append(link.split("/")[-1]) result = { "summary":summary, "references":references } return result #チャットボットが実際に出力するメッセージを作成する def create_message(text: str) -> Mapping[str, Any]: result = search_document(text=text) reference_sentence = " ・".join(result["references"]) #返信文作成 cards = { "cardsV2": [ { "cardId": "searchResults", "card": { "sections": [ { "collapsible": False, "widgets": [ { "textParagraph": { "text": "回答文" + result["summary"] } }, { "divider": {} }, { "textParagraph": { "text": "関連ファイル・ " + reference_sentence } } ] } ] } } ] } return cards #チャットボットからメッセージを受信 #create_message() で作成した JSON を返す @functions_framework.http def chatbot(req: flask.Request): """ 正しいGoogle Chatから送られてきたリクエストかを確認 """ if req.method == "GET": return flask.make_response(flask.jsonify({"message": "Bad Request"}), 400) auth_header = req.headers.get("Authorization") #「Authorization」ヘッダーが存在するか確認 if not auth_header: print("Missing Authorization header") return flask.make_response(flask.jsonify({"message": "Unauthorized"}), 401) #「Authorization」ヘッダーが「Bearer」から始まるか確認 if auth_header.split()[0] != "Bearer": print("Authorization header format is incorrect") return flask.make_response(flask.jsonify({"message": "Unauthorized"}), 401) bearer_token = auth_header.split()[1] try: token = client.verify_id_token( bearer_token, PROJECT_NUMBER, cert_uri=PUBLIC_CERT_URL_PREFIX + CHAT_ISSUER) if token['iss'] != CHAT_ISSUER: print("Invalid issuee") return flask.make_response(flask.jsonify({"message": "Unauthorized"}),401) except: print("Invalid token") return flask.make_response(flask.jsonify({"message": "Unauthorized"}), 401) """ 受け取ったメッセージでVertex AI Searchに検索をかける 検索結果を整形し送信する """ request_json = req.get_json(silent=True) text = request_json["message"]["text"] response = create_message(text=text) return response
5.デプロイします。
3.3 Google Chat APIの設定方法
1.Google Chat APIを有効にする。
2.ナビゲーションメニューで「APIとサービス」の「有効なAPIとサービス」を選択します。
3.Google Chat APIを選択し、「構成」をクリックします。
4.以下の通りに設定してください。
アプリのステータス
アプリのステータス:ライブ-ユーザが利用可能
アプリケーション情報
・アプリ名:任意のアプリ名
・アバターのURL:任意の写真(チャットアプリのアイコン)
・説明:チャットアプリの説明文
インタラクティブ機能
・インタラクティブ機能を有効にする。
・1:1のメッセージを受信する
・スペースとグループの会話に参加する
・接続設定:アプリのURL
・アプリのURL:Cloud FunctionsでデプロイしたアプリのURL
・公開設定:任意のユーザーのメールアドレスを登録
ログ
・エラーをLoggingに記録する。
以上の設定が完了したら「保存」します。
結果
では実際に完成したチャットボットを使ってみましょう。
1.Google Chatを開きます。
2.「チャットを新規作成」をクリックします。
3.作成したアプリ名を検索してください。
4.質問したい内容をチャットしてください。
5.正しく回答が返ってきたら成功です。
まとめ
今回はGoogle Chat上で使用できるチャットボットを作成しました。
今回はGoogle Chatと連携しましたが、他にも様々なアプリケーションと連携させることができます。
また、Google Cloud Functionsのmain.pyのコード内容をカスタマイズすることでもっと便利なチャットボットを作成することができます。
【関連記事】