TL;DR
- 社内問い合わせの業務負荷を減らすため、Vertex AI SearchとADKでSlackチャットボットを構築しました
- データストアとしてGoogle Driveを直参照せず、あえてCloud Storageを経由させる方式を採用しました
- 信頼度評価により、有識者に補足を求める機能を付けています
はじめに
私の会社では、社員の多くがPMOやITコンサルの方々ですが、私はLXサービス「Mill」という自社開発のAIソリューションプロダクトの開発に携わっています。
このプロダクトのPdMとしてリリースしてからはや2ヶ月が経過しようとしていますが、全くと言っていいほど人手が足りません。
開発スタッフが2,3名なのもそうですが、マーケティングなども含めてもプロジェクトメンバーが5人ほどしかいないので、プロダクトに関する社内からの質問対応もなかなかの業務負荷です。
ひとまず、現在の営業資料のありかや、販促状況、今後のロードマップなどの質問はGoogle Driveにそれなりの情報があったので、Vertex AIでこれらの情報を基にしたSlackチャットボットを作ろうと決意しました。
AIチャットボットにやってほしいこと
AIチャットボット開発に着手する前に、今回のチャットボットが答えてほしい質問について書き出してみました。
- 「最新の営業資料どこ?」
- 「今の販売価格はいくら?」
- 「今後のアップデートでできる機能って何?」
- 「セキュリティ対策ってどうなってる?」
こんな感じの質問が普段社内から飛んでくるので、ひとまずこのあたりの対応ができるようになれば良しとします。
今回のケースだと、営業担当者とプロダクトチームとの認識を埋め合わせる支援になりそうです。
構成
全体構成はこんな感じになっています。
Slackに専用チャンネルを作成しておき、Slack Appにメンション付きの質問が飛んできた際に、Cloud Run経由でVertex AI Searchから回答生成を行えるようなチャットボットをイメージしています。
データストアはCloud Storageにしており、Cloud Schedulerの定期実行でGoogle Driveと同期します。
なぜVertex AI SearchをGoogle Driveに繋げなかったのか
一度でもVertex AIを触ったことがある方であれば「Vertex AI SearchのデータストアをGoogle Driveにすればいいじゃん」と言われるかと思います。
もちろん気づかなかったわけではなく、最初はGoogle Drive APIに繋ぐ予定だったのですが、企業での利用用途の場合、サービスアカウントでDrive内をクロールできるようにするよりも、Driveから指定のフォルダ配下を明示的にCloud Storageに同期させた方が後で社内で釘を刺されづらいと判断しました。
ADK x Cloud Run でAIエージェントを構築する
今回はADK(Agent Devlopment Kit)とCloud Runを使用してAIエージェントを構築しました。
エージェントのシステムインストラクションは下記のような構成にしています。
あなたは社内のプロダクト開発状況や計画に関する質問に回答するアシスタントです。
以下のルールに従ってください:
- Vertex AI Search を使って社内ドキュメントを検索し、その情報に基づいて回答してください
- 検索対象には開発ドキュメント、プロジェクト計画、タスク管理情報などが含まれます
- 検索結果に該当する情報がない場合は、正直に「該当する情報が見つかりませんでした」と回答してください
- 回答は日本語で、簡潔かつ正確に行ってください
- 情報の出典がわかる場合は、ドキュメント名を記載してください
- 推測や憶測で回答しないでください
## ドキュメントパスの案内ルール
- 検索結果に含まれるドキュメントのパスを案内する際は、「{gcs_bucket_prefix}」部分を「{google_drive_root}」に読み替えて、Google Driveの共有ドライブ上のパスとして案内してください
- パスの区切りは「\」を使ってください(例: {google_drive_root}\フォルダ名\ファイル名.pdf)
- GCSのパス(gs://...)をそのまま回答に含めないでください
## 回答メタデータ(必須)
回答の最後に、必ず以下の形式でメタデータブロックを付与してください。
メタデータブロックは回答本文の後に改行を入れ、区切り文字の行から始めてください。
---METADATA---
confidence: <1-5の整数>
category: <development|sales|other>
### confidence(信頼度)の基準:
- 5: 検索結果に明確な根拠があり、質問に完全に回答できている
- 4: 検索結果に十分な根拠があり、ほぼ正確に回答できている
- 3: 検索結果に部分的な情報があるが、一部推測を含む可能性がある
- 2: 検索結果に関連情報が少なく、回答の正確性に自信がない
- 1: 該当する情報が見つからない、または質問の意図が不明確
### category(カテゴリ)の基準:
- development: プロダクト開発、技術、エンジニアリング、バグ、コード、設計、インフラに関する質問
- sales: 営業、顧客、商談、売上、マーケティング、契約に関する質問
- other: 上記に当てはまらない質問(総務、人事、一般的な質問など)
一般的なRAG付チャットボットに加え、下記のような対応ができるようにしています。
- 回答の信頼性が怪しかった場合は、有識者に補足を求める
- 資料のパスを聞かれた際は、Google Driveのパスに読み換えて回答する
信頼度チェックの部分は下記の記事を参考にしました。
現在のチーム構成では、開発関連と営業関連と全体的な質問でそれぞれ対応依頼するべき方が変わるので、質問のカテゴリに応じて各カテゴリの有識者をSlackユーザーIDで登録しておき、メンションで補足を求めるようにしています。
これによってAIが間違った回答をしたり、自信の無い回答をした際に、人間がフォローできず誤った情報が広がるリスクを下げてくれることを期待しています。
さらにこのチャットボットではデータソースとしてGoogle Cloud Storageを使用しているものの、実際のStorageはチャットボット利用者が参照できないようになっているため、「営業資料の場所は?」などと聞かれた際にCloud Storageのパスを回答されると利用者の混乱につながります。
幸いCloud Storageのバケットに対象のGoogle Driveフォルダを構造そのまま入れているので、バケット名をフォルダパスに変換することで対処しました。
Slack Appを作る
今回のチャットボット用のSlack Appを作成していきます。
必要スコープ
OAuth & Permissionsで下記のスコープを許可します。
ボットトークンのスコープ
app_mentions:readchat:writeincoming-webhook
イベント設定
Event Subscriptionsの設定を行います。
- Enable Events: on
- Subscribe to bot events:
app_mention
実際に動かしてみる
プロダクトの営業資料に関しての質問
実際の利用想定をしていた営業資料の場所をしっかりと答えてくれています。
データストアに載っていない開発関連の質問
データストアに載っていない質問に関しても、それなりの回答をしつつ、しっかりと開発関連の有識者に助けを求めてくれています。質問者自身が有識者なので質問者自身に助けを求めているのはご愛敬ですね。
注意点
今回Google Driveから定期的にCloud Storageに同期するという手段を取っていますが、プロダクト開発などの情報をGoogle Driveに保存している場合、oldフォルダの扱いが一番厄介になります。
今回のチャットボットでは、Google Driveの同期の際にoldフォルダ配下はすべてCloud Storageにはもっていかないようにしていますが、この場合逆に言うと最新情報には強いですが、過去の情報との変更履歴などはエージェント側で追えないものになります。
1社員同等のコミュニケーションをこなしてもらうために、仕様の変遷などの情報が重要視されるかは今後の利用ログから判断していこうと思いますが、社内の声を聴きながらこのあたりはブラッシュアップをしていければなと思っています。
さいごに
MSOL Digitalでは、ミッション・ビジョンの実現に向けて、新たな仲間を募集しています。
少しでもご興味をお持ちいただけましたら、ぜひエントリーをご検討ください。
また、すぐに転職をお考えでない場合でも、カジュアル面談からのスタートも大歓迎です。
まずはお気軽にお話しできますと幸いです!
■エントリーページ
■カジュアル面談の申し込み


