📝

Vertex AI Search x LINE:社内チャットボット作成 vol.1

2024/02/07に公開

はじめに

こんにちは、クラウドエースの岸本です。
昨年から生成 AI が様々な分野で活用され始めています。
そこで、AI 分野に強い Google Cloud の Vertex AI Search and Conversation を使い、社内チャットボットを作成してみました。
さらに、今回は手軽に使えるように、LINE から利用できるようにしてみました。
以下は構築例です。

1

対象読者

  • Google Cloud の AI サービスを使ってみたい人
  • 社内チャットボットを作成したい人

やること・やらないこと

やること

  • LINE Messaging API の設定
  • Google Cloud のサービスの設定
  • LINE Messaging API と Google Cloud のサービスを連携させる
  • 社内チャットボットを作成する

やらないこと

  • LINE Messaging API の詳細な説明
  • Google Cloud のサービスの詳細な説明
  • コードの詳細な説明

構築手順

構築手順は以下の通りです。

  1. LINE Developers の設定
  2. Google Cloud の設定 - Vertex AI Search and Conversation
  3. ファイルの編集
  4. Google Cloud の設定 - Cloud Run
  5. 疎通確認

1. LINE Developers の設定

LINE Developers とは、LINE の API を利用するためのサービスです。
ここでは、構成図の以下の部分を設定します。
1-2

設定の手順としては以下の通りです。

  • 1-1. 新規プロバイダーの作成
  • 1-2. チャネルの作成
  • 1-3. チャネルのシークレットとアクセストークンの取得
  • 1-4. チャネルの設定

1-1. 新規プロバイダーの作成

まず、LINE Developers の登録を行います。
以下のリンクからLINE Developers のページにアクセスし、登録を行います。
登録の手順としては、以下を参照してください。

数分で登録が完了します。

早速、LINE Developers のページにログインし、プロバイダーを作成します。
プロバイダーの名前はなんでも構いません。

【登録後の画面】
2

【プロバイダー作成画面】
3

1-2. チャネルの作成

プロバイダーを作成したら、チャネルを作成します。
チャネルについて、詳しく知りたい方は以下を参照してください。

以下の画像のように、Messaging API を選択し、チャネルを作成します。

【チャネル選択画面】
4

以下がチャネルの設定例です。

項目
チャネルの種類 Messaging API
プロバイダー antonnion
会社・事業者の所在国・地域 日本
チャネル名 リサーチくん
チャネル説明 社内チャットボット
大業種 個人
小業種 個人(その他)
メールアドレス メールアドレス
LINE 公式アカウント利用規約 の内容に同意します チェック
LINE 公式アカウント API 利用規約 の内容に同意します チェック

設定後、確認画面に同意していくと、チャネルが作成されます。

1-3. チャネルのシークレットとアクセストークンの取得

チャネルが作成されたら、チャネルのシークレットとアクセストークンを取得します。
チャンルシークレットは「チャネル基本設定」の画面にあります。

【チャネルシークレット】
6

次にアクセストークンを取得します。
「チャネル基本設定」の隣の欄にある「Messaging API 設定」の画面を下にスクロールすると、「チャネルアクセストークン」があるので、[発行]をクリックします。

【チャネルアクセストークンの発行】
8

この上記 2 点、チャネルシークレットアクセストークンは、後ほど Google Cloud のサービスと連携させる際に使用します。

1-4. チャネルの設定

チャネルの設定を行います。
デフォルト設定の変更と、Webhook 送信の設定を行います。
「Messaging API 設定」の画面にある、応答メッセージの[編集]をクリックします。

【Messaging API 設定画面】
9

画面が切り替わり、応答設定の画面になります。
そこで以下の画像のように設定します。

【設定前】
10

【設定後】
11

以上で LINE Developers 側の設定は完了です。

2. Google Cloud の設定 - Vertex AI Search and Conversation

ここからは Google Cloud の設定を行います。
ここでは、Vertex AI Search and Conversation と Cloud Storage の設定を行います。
構成図では、以下の部分を設定します。
1-3

設定の手順としては以下の通りです。

  • 2-1. 架空の社内規程を Cloud Storage にアップロード
  • 2-2. Vertex AI Search and Conversation の設定

早速、手順に沿って設定を行っていきます。

2-1. 架空の社内規程を Cloud Storage にアップロード

まずは、架空の社内規程を Cloud Storage にアップロードします。
架空の社内規程は、生成 AI によって生成された文書です。
合計で 3 個の文書を用意しています

就業規則

株式会社仮想企画
就業規則(抜粋)

第 1 章 総則
第 1 条(目的)
本規則は、株式会社仮想企画(以下「当社」という)の従業員が守るべき基本的な就業条件及び行動規範を定めることを目的とする。

第 2 章 勤務
第 2 条(勤務時間)

正社員の一般的な勤務時間は、午前 9 時から午後 6 時までとする。休憩時間は、午後 12 時から午後 1 時までの 1 時間とする。
短時間勤務制度、フレックスタイム制度等の特別な勤務形態に関しては、別途規定に従う。
第 3 条(遅刻・早退)

遅刻や早退は、事前に上司に報告し、理由を明確にする。
無断での遅刻・早退は、給与控除等の措置をとることがある。
第 3 章 給与
第 4 条(給与の支払い)

給与は毎月末日に支払われる。ただし、支払日が休日の場合は前営業日に繰り上げて支払う。
給与の計算は、基本給、残業手当、その他手当等を含めて行う。
第 5 条(昇給・賞与)

昇給は年 1 回、人事評価に基づいて行う。
賞与は年 2 回、業績に応じて支給する。
第 4 章 休暇
第 6 条(有給休暇)

従業員には、入社半年経過後に 10 日間の有給休暇を付与する。
有給休暇の取得は、所属長への申請をもって認められる。
第 7 条(特別休暇)

結婚、出産、忌引き等の特別な事情がある場合、特別休暇を付与する。
特別休暇の日数や条件は、別途規定による。
第 5 章 安全衛生
第 8 条(安全衛生の確保)

従業員は、自身の安全と健康を確保するために必要な措置を講じる。
労働災害の防止及び職場環境の改善に努める。
第 6 章 規律及び行動規範
第 9 条(職場の秩序維持)

従業員は、職場の秩序維持に努める。
私的な用事で業務を妨げることのないようにする。
第 7 章 その他
第 10 条(規則の変更)
当社は、必要に応じて本規則を変更することができる。変更の際には、従業員に対して事前に通知する。

育児・介護休業規程

株式会社仮想企画
育児・介護休業規程(抜粋)

第 1 章 総則
第 1 条(目的)
本規程は、株式会社仮想企画(以下「当社」という)における育児・介護休業に関する事項を定めるものであり、従業員が仕事と家庭の両立を図ることを支援することを目的とする。

第 2 章 育児休業
第 2 条(育児休業の取得資格)

育児休業は、子が 1 歳に達するまでの間、子の世話を必要とする従業員が取得できる。子が障害を持つ場合は 2 歳に達するまで延長可能。
申請は、子の出産予定日の 2 ヶ月前、または子の誕生後でも 1 ヶ月前までに提出する。
第 3 条(育児休業の期間)

育児休業は、原則として子が 1 歳に達する日までとする。特別な事情がある場合には、この期間を最大 2 歳に達する日まで延長することができる。
育児休業は分割して取得することも可能である。
第 3 章 介護休業
第 4 条(介護休業の取得資格)

介護休業は、要介護状態にある家族を介護する必要がある従業員が取得できる。対象家族には配偶者、子、親、配偶者の親などが含まれる。
申請は、介護が必要になったことが判明した日から 14 日以内に提出する。
第 5 条(介護休業の期間)

介護休業は、原則として 1 回につき 93 日間までとする。ただし、対象家族が複数いる場合は、合計で最大 3 年間まで取得可能。
介護休業は分割して取得することも可能である。
第 4 章 休業中の待遇
第 6 条(休業中の給与)

育児・介護休業中は、原則として給与の支払いは行わない。ただし、育児休業手当や介護休業手当の支給制度を利用できる場合がある。
社会保険料は、法令に基づき継続して負担される。
第 7 条(復職)

育児・介護休業終了後は、従業員は原則として従前の職務に復帰する。ただし、復職後の職務調整が必要な場合は、事前に協議を行う。

賃金規程

株式会社仮想企画
賃金規程(抜粋)

第 1 章 総則
第 1 条(目的)
本規程は、株式会社仮想企画(以下「当社」という)における従業員の賃金に関する事項を定め、公平かつ透明な賃金体系を確立することを目的とする。

第 2 章 給与体系
第 2 条(給与の構成)

給与は以下の要素で構成される。

基本給
時間外手当
特別手当(役職手当、資格手当等)
その他手当(住宅手当、家族手当等)
基本給は、従業員の職務内容、経験年数、保有資格に基づいて決定される。

第 3 章 基本給
第 3 条(基本給の決定)

新入社員の基本給は、大学卒業者で月額 20 万円、大学院卒業者で月額 22 万円とする。
年 1 回、人事評価に基づいて基本給の見直しを行い、昇給を決定する。
第 4 章 手当
第 4 条(時間外手当)

法定労働時間を超える労働には、時間外手当を支給する。時間外手当の割増率は、平日及び土曜の残業は 25%増し、日曜及び祝日の残業は 50%増しとする。
時間外手当の計算基準は、基本給をもとにして行う。
第 5 条(特別手当)

役職手当は、係長で月額 2 万円、課長で月額 5 万円、部長で月額 10 万円とする。
資格手当は、所定の資格を保有する従業員に対して、資格ごとに月額 1 万円から 3 万円を支給する。
第 5 章 賃金の支払い
第 6 条(支払い日)

給与は毎月 25 日に支払われる。ただし、支払日が休日の場合は前営業日に繰り上げて支払う。
支払いは、指定された金融機関の口座に振り込むこととする。
第 7 条(賃金の計算)

賃金の計算期間は、前月の 26 日から当月の 25 日までとする。
欠勤等による控除は、法令及び規程に基づいて行う。
第 6 章 その他
第 8 条(規程の変更)
当社は、必要に応じて本規程を変更することができる。変更の際には、従業員に対して事前に通知する。

上記の文書を PDF に変換し、Cloud Storage にアップロードします。
コンソールの Cloud Storage 画面でバケットを作成します。

【バケットの作成】
12

バケット名は、グローバルで一意である必要があります。
それ以外はデフォルトで設定します。
そして以下のように PDF ファイルをアップロードします。

【ファイルのアップロード後の画面】
13

2-2. Vertex AI Search and Conversation の設定

次に Vertex AI Search and Conversation の設定を行います。
はじめにコンソール画面で「Vertex AI Search and Conversation」と検索しクリックすると、以下の画面に遷移します。API を有効にします。

【Vertex AI Search and Conversation の画面】
14

API を有効にし、[新しいアプリ]をクリックします。今回は[アプリ]の種類を[検索]にします。

【アプリの種類選択】
15

次に、「構成」についてですが以下のように設定します。

項目
アプリ名 Linebot
company name sample company
マルチリージョン global(グローバル)

【構成】
16

最後の「データ」は、先ほど作成したバケットのデータをデータストアにインポートします。
データストアの詳細は以下を参照してください。

[新しいデータストア作成]をクリックし、「ソース」、「データ」、「構成」をそれぞれ設定してきます。

【ソース】
17

「ソース」は、[Cloud Storage]を選択します。
【データ】
18

「データ」は先ほど作成したフォルダを選択します。

【構成】
19
「構成」は、データストア名を入力し、作成をクリックします。

これでデータストアに Cloud Storage からデータがインポートされます。
最後に作成したデータストアを選択し「作成」をクリックします。
以下の画面になればアプリの作成は完了です。

【アプリ作成完了】
20

左の欄の[プレビュー]で動作確認を行うことができます。

【プレビュー】
21
いい感じに検索できていることが確認できました。

3. ファイルの編集

ここでは、ファイルの編集を行います。
構成図では、以下の部分を設定します。

1-4
作成の手順としては、以下の通りです。

  • 3-1. ファイルの作成
  • 3-2. ファイルの編集

3-1. ファイルの作成

コンソール上部にある Cloud Shell を開きます。

【Cloud Shell】
22

Cloud Shell が開いたら、ホームディレクトリ(~)であることを確認し、以下のコマンドを実行します。

// 今回使用するディレクトリの作成
mkdir chatbot
// ディレクトリに移動
cd chatbot
// ファイルの作成
touch app.py
touch requirements.txt
touch Dockerfile
touch config.py

上記で作成したファイルを vim などで編集し、それぞれ以下のようにします。

3-2. ファイルの編集

app.py
import os
import config
from flask import Flask, request, abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine

app = Flask(__name__)

# LINE Bot APIとWebhook Handlerの初期化
line_bot_api = LineBotApi(config.token)
handler = WebhookHandler(config.secret)

# Google CloudのプロジェクトID、ロケーション、データストアIDの設定
PROJECT_ID = config.project_id
LOCATION = config.location
DATA_STORE_ID = config.datastore

# Google Discovery Engineのクライアントを取得する関数
def get_client():
    client_options = (
        ClientOptions(api_endpoint=f"{LOCATION}-discoveryengine.googleapis.com")
        if LOCATION != "global"
        else None
    )
    return discoveryengine.SearchServiceClient(client_options=client_options)

# 検索要約を取得する関数
def search_summaries(client, search_query: str) -> str:
    serving_config = client.serving_config_path(
        project=PROJECT_ID,
        location=LOCATION,
        data_store=DATA_STORE_ID,
        serving_config="default_config",
    )
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        page_size=3,
        content_search_spec={
            "summary_spec": {
                "summary_result_count": 3,
                "ignore_non_summary_seeking_query": True,
                "ignore_adversarial_query": True
            },
            "extractive_content_spec": {
                "max_extractive_answer_count": 1
            }
        }
    )
    response = client.search(request)
    app.logger.info(f"Full Vertex AI response: {response}")
    return response.summary.summary_text if response.summary else "該当する結果は見つかりませんでした。"



@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400)

    return 'OK'

@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    user_message = event.message.text
    client = get_client()
    bot_response = search_summaries(client, user_message)
    try:
        line_bot_api.reply_message(event.reply_token, TextSendMessage(text=bot_response))
    except Exception as e:
        app.logger.error(f"Error in reply_message: {e}")

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(debug=False, host='0.0.0.0', port=port)

config.py

config.py では、以下の 4 点が必要です。

  1. アクセストークン
  2. チャネルシークレット
  3. プロジェクト ID
  4. データストア ID

ひとつずつ確認していきます。

1. チャネルシークレットと 2. チャンルアクセストークン
先ほど LINE Developers で取得したものを入力します。

3. プロジェクト ID
コンソール上から確認できます。コンソールの左上のナビゲーションメニュー(3 本線)から「Cloud の概要」→「ダッシュボード」でクリックすると以下の画面が出てきます。

【プロジェクト ID】
23

4. データストア ID
Vertex AI Search and Conversation の画面から確認できます。Vertex AI Search and Conversation で作成したアプリを選択し、「統合」の「API」をクリックします。URL が表示されていますので、この URL の dataStores/の後ろから、次の/ までの文字列がデータストア ID です。

ex
curl -X POST ・・・
"https://discoveryengine.googleapis.com/・・・/dataStores/ここ!/・・・" \ ・・・は省略

【データストア ID】
24

最後にそれらを以下のように config.py に記述します。

token = "アクセストークン"
secret = "チャネルシークレット"
project_id = "プロジェクトID"
location = "global"
datastore = "データストアID"
Dockerfile
FROM python:3.8-slim

# 作業ディレクトリの設定
WORKDIR /chatbot

# 依存関係のコピーとインストール
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# アプリケーションのコードをコピー
COPY . .

# ポートの公開
EXPOSE 8080

# コンテナ起動時に実行されるコマンド
CMD ["python", "app.py"]
requirements.txt
Flask>=2.2.2
gunicorn==21.2.0
line-bot-sdk==3.7.0
google-cloud-aiplatform==2.15.0
google-api-core==2.14.0
google-cloud-discoveryengine==0.11.2

4. Google Cloud の設定 - Cloud Run

次に Cloud Run の設定を行います。
Cloud Run の概要は以下を参照してください。

ここでは、Cloud Run にサンプルをデプロイするまでを行います。
構成図では、以下の部分を設定します。
1-5

サンプルアプリのデプロイ

サンプルアプリをデプロイします。
流れは以下です。

  • 環境変数の設定
  • イメージをビルド
  • イメージにタグ付け
  • Artifact Registory に push
  • デプロイ

1 つずつ確認していきます。
Cloud Shell でchatbotディレクトリで作業します。

【環境変数の設定】

// 環境変数の設定
export project_id=プロジェクトID

【イメージのビルド】

// build
docker build -t chatbot .

// イメージの確認
docker images

【イメージにタグ付け】

// イメージのタグ付け
docker tag chatbot:latest asia-northeast1-docker.pkg.dev/$project_id/chatbot-repos/chatbot:latest

// タグ付け確認
docker images

【Artifact Registory に push】

// リポジトリの作成
gcloud artifacts repositories create chatbot-repos --repository-format=docker --location=asia-northeast1 --project=$project_id

// リポジトリの確認
gcloud artifacts repositories list --project=$project_id

// push
docker push asia-northeast1-docker.pkg.dev/$project_id/chatbot-repos/chatbot:latest

【デプロイ】

gcloud run deploy chatbot --image=asia-northeast1-docker.pkg.dev/$project_id/chatbot-repos/chatbot:latest --region=asia-northeast1 --platform=managed --project=$project_id

デプロイされると、以下のようにエンドポイントの Service URL が生成されます。

Deploying container to Cloud Run service [chatbot] in project [project_id] region [asia-northeast1]
OK Deploying... Done.
OK Creating Revision...
OK Routing traffic...
Done.
Service [chatbot] revision [chatbot-123-123] has been deployed and is serving 100 percent of traffic.
Service URL: https://chatbot-123-123.run.app

5. 疎通確認

上記で生成されたエンドポイントの URL をコピーし Webhook URL に設定します。
LINE Developer の Messaging API 設定の画面にある、Webhook の設定画面に移動します。
以下の画像の赤枠にエンドポイントの URL を貼り付けます。その後に/callbackを追加します。

【Webhook の設定画面】
26

その後、[更新]をクリックすると検証ボタンが出てきます。
[ Webhook 利用]を[オフ]から[オン]に変更します。
[検証]ボタンとクリックすると、以下のように「成功」と表示されます。
これで、疎通確認は完了です。

【成功】
27

実際に LINE からメッセージを送信してみます。
Webhook 設定の上の QR コードから追加を行い、メッセージを送信してみます。以下のように検索結果が返ってきます。

【検索結果】
28

まとめ

以上で LINE から社内チャットボットを作成することができました。
手軽に社内規定について質問できるのは便利だと思いました。

今後の課題としては、解答精度の向上と機能の拡張だと思いました。
具体的には、問い合わせ内容が多い件数を可視化し課題を特定することや、
社内規定に限らず、悩み相談など特定のテーマに特化したチャットボットの開発が考えられます。

また最近、自治体が災害対応に LINE を活用していることが注目されています。
このアプローチは、LINE と Google Cloud の Vertex AI Search and Conversation を組み合わせることでさらに強化される可能性があると思います。
この組み合わせを利用すれば、災害時に信頼性の高いデータに基づいて迅速かつ正確な回答を提供することが可能になります。
1 分 1 秒が大切な災害時に、このようなアプローチは有効だと思いました。

最後まで読んでいただきありがとうございます。

Discussion