はじめに

この記事ではBigQueryの内容を元にVertex AIから応答を取得してみる話をします。いわゆる、RAG構成というものをGoogle Cloudてんこ盛りで実現しました。※今回は現時点でpreview版のサービスを使って構成を考えています。

なお、AIのモデルについてはtext-bison-32kを利用しています。
また、AIの学習データとして公開事例を学習させるようなことはしていません。

突然ですが、皆さんに質問です

アイレットの導入事例をご存知ですか?
弊社の導入事例が詰まったサイトです。たくさんの導入事例がございます。たくさんあるけども。。。

どこの何が問題なの?

簡単に説明すると事例の一覧にはなるんですが、実はフリーワードによるページ内検索ができません。
cloudpackドメインの事例ページではトグルベースの検索ができますが
同様にフリーワードで検索ができません。

たとえば、特定のサービスで特定の機能をどれだけ導入事例で扱っているのか横断的に知りたいこともあると思います。
とくに技術の種類は日々増えていくもので弊社も要求された内容に対して柔軟にサービスを活用していきます。
そのために検索UIを変更したり、検索結果を逐一どこかに保存して集計するなどの作業はとても大変です。

また、その中でお客様に対してどのような導入提案をしているのかを横断的になんとなく知りたいということもあると思います。
そこで今回は社内向けにパブリックな事例ページを横断的に検索して柔軟に回答を得たり、要約させたり、ふわっとした質問にも対応できるようなSlack botを作成してみました。

実際に作ったもの

使い方としては「⚪︎⚪︎⚪︎のサービスを使っている公開事例ではどのような機能が使われたの?」や「⚪︎⚪︎⚪︎のサービスを使っているけどどういう風に活用してどんな実績を残したの?どんな公開事例があるの?」みたいなふんわりとした質問を投げたいときにその旨を表現するプロンプトを作成してAIに質問します。

具体例としては下記の内容です。

具体例1:NewRelicを扱った公開事例のタイトルからどんな機能を活用したかを質問する

質問内容に則したプロンプト

「NewRelic を活用した外形監視を導入し、ユーザー視点に寄り添った監視・運用保守を実現!」の公開事例では
NewRelicのどんな機能を使っていますか? 3行で説明してください。

回答

NewRelic を活用した外形監視を導入し、ユーザー視点に寄り添った監視・運用保守を実現!」の公開事例では、以下の3つのNewRelicの機能を使っています。1. Synthetics Monitoring:Webサイトのパフォーマンス計測やダウンタイムインシデント、詳細な統計情報などにアクセスできます。
2. ScriptBrowser:ユーザー操作をシミュレーションした外形監視をスクリプトで実装できます。
3. New Relic APM:アプリケーションのパフォーマンスを監視できます。

公開事例の中身を見ると回答に記載されているNewRelicの機能が全て使われています。

具体例2:利用しているサービス名から公開事例のURLを質問する

質問内容に則したプロンプト

NewRelicを活用した公開事例のリンクを教えてください。タイトルは不要です。

回答

- https://www.iret.co.jp/works/144.html
- https://www.iret.co.jp/works/117.html
- https://www.iret.co.jp/works/090.html

事例リンクが列挙されました。列挙されたすべての事例リンクにNewRelicの記載がありますのでうまいこと応答してくれています。

具体例3:公開事例を検索して要約する

質問内容に則したプロンプト

NewRelicを活用した公開事例をひとつ挙げ、公開事例のリンクをつけて3行で要約してください。
クライアント名については「A様」表記としてください。

回答

A様は、運営しているお客様専用サポートサイトや管理サイトの監視強化を計画しており、監視実装および運用保守をアイレットが担当しました。
NewRelicを活用した外形監視を実装することで、ユーザー視点に寄り添ったWebサイトパフォーマンスの監視を実現しました。
https://www.iret.co.jp/works/144.html

本文を要約して返信できました。また、返信の難易度を少しだけ上げて「クライアント名」を「A様」と表記させることに成功しました。

やったこと、仕組みなど

無事に動いたところで仕組みを簡単に説明します。SlackのメンションをSlack Boltのイベントサブスクリプションにした上で以下の工程を実行しています。

  1. BigQuery Vector SearchをSlackから実行(LangChainをCloud Runで実行)
  2. Vertex AIがSlackの文章とBigQuery内にあるEmbeddingを比較
  3. 一番類似度の高いものを取得して返信

なお、今回は弊社の公開事例ページから直接Webページを取得するといったことはしていません。理由としては検索のたびにWebページを取得するようにしてしまうと事例公開ページへの負荷が高まってしまうためです。
ゆえに、BigQueryにあらかじめ公開事例のデータを格納しています。格納方法としては以下の工程です。

  1. 弊社の事例ページを特定のキーワードで検索してURLを取得
  2. URLからWebページを取得して必要な本文だけを抜き出し、HTMLパースを実行
  3. HTMLパースを実行したらBigQueryにデータを格納
  4. Vertex AIのデータソースとしてBigQueryを指定

ここでちょっとしたポイントですが、BigQueryに本文を格納するときは本文にメタデータを含めておくと精度が高まります。
今回の作成したものでは公開事例本文の先頭に事例のタイトルや掲載リンクをつけた状態で保存しています。

また、BigQueryに格納したデータはLooker Studioで検索するようにしました。
全くもって何が書いてあるのかまったくわからないダッシュボードですが、1列目にはEmbeddingしたデータ、2列目にはUUIDが表示されています。もちろん、保存された本文も確認できます。

アーキテクチャ

以下のような構成のインフラを構築しました。Looker Studioはデータポータルのアイコンを使っています。
理由としては弊社ではLookerも活用しているので見分けるためにアイコンを変えています。

技術的にはどんなことをやっているか(もうちょっと詳しく)

ここからはもう少し掘り下げて説明したいと思います。具体的には以下の内容です。

Cloud RunからVertex AIのAPIを実行

Cloud RunでVertex AIのAPIを実行するため、山田オリジナルのLangChainコンテナを起動しています。
イメージのレジストリにはArtifact Registry を使っており、コンテナイメージとBigQueryの運用にはVertex AI Workbench(マネージドなノートブック)を使っています。

LangChainコンテナのイメージを更新する際はVertex AI Workbenchを使います。今回はSlack Boltを使っています。検証環境のデバッグにはソケットモードを使っていますが、ローカル端末のVisual Studio Codeで検証しているため、説明は省きます。
※別の機会に記事にしたいと思います。

Cloud Monitoring によるコンテナの稼働状況チェック

コンテナオーケストレーションをしているとサーバに対してSSHログインするような運用はコンテナの数が増えると難しくなります。今回作成したものでは単一コンテナの運用でかつまだテスト段階であるため、コンテナを止めて原因を追求するということができます。しかし不具合の大きさに関係なく、いちいちコンテナを止めているような運用では正常に動かし続けることは難しいです。
コンテナの運用の基本としてはサーバのように中に入ってエラーを特定するのではなく、コンテナ自身がモニタリングサービスと通信して正常性を確認できる必要があります。

また、Cloud Runはリクエストがあるときだけ起動する性質があるため、「不具合が起きたコンテナにログインして調査」ということはできません。

Secret Manager を使ったコンテナオーケストレーション

Cloud Runを使っていることもありますが、コンテナを使っているのでシークレット情報はSecret Managerを使って管理しています。環境変数を読み取られてもSlackなどのシークレット情報が見えないようにしています。
コンテナを利用するうえで重要なことのひとつとしてシークレット情報をコンテナイメージに記録しないことが挙げられます。

生成AIの検索ソースとして専用のDWHを構築・利用

前述したとおり、Webサイトのへの負荷を考えて生成AIのソースには専用のDWHを構築しています。検索にはBigQuery Vector Searchを使っており、事例データとEmbeddingされた事例データを格納しています。

なお、今回はプログラム可能なGoogle検索エンジンを利用していますが、Vertex AI Search & Conversationを使うと同じことができます。本番ではVertex AI Search & Conversationを使うと良いでしょう。

BigQuery Introduction to vector search
プログラム可能なGoogle検索エンジン

ベクトル化したデータの可視化にはLooker Studioを利用

生成AIに対してQAを実行したときに質問と結果の組み合わせが正当かどうかを知りたいことがあると思います。
まだ実現できてはいないので恐縮ですが、ベクトル化したデータの類似度を計算するフィールドを作成してグラフに描画すれば、「納得感のあるAI構築ができるのかな?」と考えています。
※質問内容に対しての回答がなぜそうなったのかなどのトレースができます

まとめ

今回の構成ではBigQueryのVector Searchがまだpreview版の機能があるため
お金が絡むもしくはクリティカルな本番では使えませんが、社内向けでラフに使う分には使えると思いました。

なお、本記事に登場する実装について詳しく書きたいところですが、詳しく書こうとすると1つの記事では収まらないため、今回は軽い紹介とさせていただきました。

今後は実装についての深掘りとLooker Studioで生成AIのパフォーマンスを計測するような環境を構築できないか模索していきたいと思います。