Vertex AI Searchでベクトル検索+RAGを試してみた
はじめに
社内システムを開発している中で、AIアシスタントに質問する際、関連するマニュアルを自動で検索して回答してほしいという要件が出てきました。
いわゆる**RAG(Retrieval-Augmented Generation)**機能ですね。
最初は「どうやって実装するんだろう...」と調べていたところ、Google CloudのVertex AI Searchというサービスを発見。GCPコンソールだけで簡単にベクトル検索+RAGが実現できたので、その経験を共有します。
※本記事は、同様の実装を検討されている方の参考になればと思い、備忘録として残しています。
本記事では、RAGの基本概念から、Vertex AI Searchを選んだ理由、GCPでのセットアップ手順まで、実際に試した知識を元にテストサンプルを作成して紹介します。
RAGとは?
RAG(Retrieval-Augmented Generation)は、大規模言語モデル(LLM)に外部のドキュメントを検索させて、その情報を元に回答を生成させる技術です。
なぜRAGが必要なのか?
従来のLLM(ChatGPTやGeminiなど)には、以下のような課題がありました:
課題1: 学習データの時点までの情報しか知らない
例えば、「2024年の新製品について教えて」と質問しても、LLMの学習データが2023年までだった場合、正確な回答ができません。
課題2: 企業固有の情報を知らない
「うちの会社の経費精算ルールは?」と聞いても、LLMは一般的な回答しかできません。社内マニュアルの内容は学習データに含まれていないからです。
課題3: ハルシネーション(事実と異なる情報を生成)
LLMは、知らない情報を聞かれると、もっともらしい嘘の情報を生成してしまうことがあります。
RAGの仕組み
RAGは、これらの課題を以下の3ステップで解決します:
1. Retrieval(検索)
↓ ユーザーの質問に関連するドキュメントを検索
2. Augmentation(拡張)
↓ 検索したドキュメントの内容をプロンプトに追加
3. Generation(生成)
↓ ドキュメントの情報を元にLLMが正確な回答を生成
具体例でわかるRAG
シチュエーション: 社内の経費精算について質問する
質問: 「出張時の交通費の精算方法を教えて」
【従来のLLM】
→ 社内ルールを知らない
→ 「一般的には領収書を添付して...」という一般論のみ
【RAG使用】
1. 「経費精算マニュアル.pdf」から関連情報を検索
2. 「交通費は事前申請が必要です。ICカードの履歴をエクスポートして...」
という具体的な社内ルールを発見
3. LLMがマニュアルの内容を元に回答を生成
→ 「御社の経費精算規定によると、出張時の交通費は事前申請が必要です。
ICカードの利用履歴をエクスポートして、経費精算システムに添付してください。
(出典: 経費精算マニュアル.pdf)」
もう一つの例: 最新情報への対応
質問: 「2024年の新製品について教えて」
【従来のLLM(学習データが2023年まで)】
→ 「申し訳ございませんが、2024年の情報は持っていません」
【RAG使用】
1. 「2024年製品カタログ.pdf」から情報を検索
2. 「新製品Xは2024年3月発売予定。特徴は...」という最新情報を発見
3. LLMがカタログの内容を元に回答を生成
→ 「2024年の新製品Xは3月に発売予定です。主な特徴は〇〇で...
(出典: 2024年製品カタログ.pdf)」
RAGのメリット
- ✅ 常に最新情報を提供: ドキュメントを更新すれば、LLMを再学習させずに最新情報に対応
- ✅ 企業固有の情報に対応: 社内マニュアルや規定など、特有の情報を活用可能
- ✅ ハルシネーション対策: ドキュメントに基づいた回答なので、嘘の情報を生成しにくい
- ✅ 出典が明確: どのドキュメントから情報を取得したか明示できる
Vertex AI Searchを選んだ理由
RAG機能を実装するにあたり、Vertex AI Searchを選んだ理由は以下の2点です:
1. Cloud Storageでマニュアル管理(将来的にはGoogleドライブも検討)
当初は、Googleドライブをデータソースとして使用し、ユーザーが直接マニュアルを管理できるようにする予定でした。これにより、AWS Bedrockのように開発者がS3にアップロードする手間を省けるはずでした。
しかし、サービスアカウントにGoogleドライブのアクセス権を共有しようとしたところ、企業のセキュリティポリシーの関係で、外部のサービスアカウントとの共有ができませんでした。
そのため、今回はCloud Storageをデータソースとして採用しました。
運用フロー:
【AWS Bedrockの場合】
ユーザー → マニュアル更新 → 開発者に依頼 → 開発者がS3にアップロード → 同期
【今回の実装(Cloud Storage)】
ユーザー → マニュアル更新 → 開発者に依頼 → 開発者がCloud Storageにアップロード → 同期
【将来的な理想形(Googleドライブ)】
ユーザー → Googleドライブでマニュアル更新 → 自動同期 ✅
※企業ポリシー変更または企業管理外のドライブで実現可能
選択のポイント:
- Cloud Storageは同じGCP内で管理できるため、アクセス制御がシンプル
- 将来的に企業ポリシーが変更されれば、Googleドライブへの切り替えも可能
- Vertex AI SearchはCloud Storage、Googleドライブ、BigQueryなど複数のデータソースに対応しており、拡張性が高い
2. Geminiを使いたかった
プロジェクトではVertex AIのGeminiモデルを使いたかったため、同じGoogle Cloudプラットフォームで統一できるVertex AI Searchを選択しました。Google Cloudのサービス同士のため、連携もスムーズです。
3. RAG検索機能を自前実装しなくていい
RAGを自前で実装する場合、以下のような作業が必要になります:
- ベクトルデータベースの構築: Pinecone、Weaviateなどの選定と構築
- ドキュメントの埋め込み(Embedding)処理: テキストをベクトルに変換する処理の実装
- 検索ロジックの実装: ベクトル類似度検索の実装
- LLMへのプロンプト生成とAPI呼び出し: 検索結果をプロンプトに埋め込んでLLMに送信
Vertex AI Searchを使えば、これらすべてを委託でき、開発工数を大幅に削減できます。
また、Google側で継続的に検索精度の改善が行われるため、最新の技術を自動的に享受できるのも大きなメリットです。
Vertex AI Searchとは?
Vertex AI Search(旧Discovery Engine)は、RAGの仕組みを完全に委託して、API連携だけで使えるGoogle Cloudのサービスです。
自分でベクトルデータベースを構築したり、検索ロジックを実装する必要がなく、ドキュメントをアップロードしてAPIを叩くだけでRAG検索が利用できます。
類似サービス
他のクラウドプラットフォームでも、同様のRAGサービスが提供されています:
- AWS Bedrock Knowledge Bases: AWS BedrockのRAG機能
- Azure AI Search: Microsoft AzureのRAG対応検索サービス
これらのサービスを使えば、どのクラウドでもRAGを簡単に実装できます。
GCPでの準備と設定
ここでは、Vertex AI Searchを使うためのGCP側の設定を順を追って説明します。
1. GCPプロジェクトの準備
まず、GCPプロジェクトを作成します(既にプロジェクトがある場合はスキップ)。
- Google Cloud Consoleにアクセス
- 新しいプロジェクトを作成、またはプロジェクトを選択
2. 必要なAPIの有効化
Vertex AI SearchとVertex AIを使用するため、以下のAPIを有効化します。
- GCPコンソールで「APIとサービス」→「ライブラリ」を開く
- 以下のAPIを検索して有効化:
- Vertex AI API
- Discovery Engine API(Vertex AI Search)
※画像は既にAPIが有効化されている状態です。初めて有効化する場合は「有効にする」ボタンが表示されます。
コマンドラインから有効化する場合:
# gcloud CLIを使用
gcloud services enable aiplatform.googleapis.com
gcloud services enable discoveryengine.googleapis.com
3. Cloud Storageにドキュメントを保存
データストアを作成する前に、検索対象となるドキュメントをCloud Storageに保存します。
手順
- Cloud Storageバケットを作成(既にある場合はスキップ)
GCPコンソールから作成する場合:
- 「Cloud Storage」→「バケット」→「作成」をクリック
- バケット名、リージョンを設定して作成
コマンドラインから作成する場合:
# gsutilコマンドでバケット作成
gsutil mb gs://your-bucket-name
- ドキュメント(PDF、TXT、HTMLなど)をアップロード
GCPコンソールから:
- 作成したバケットを開く
- 「ファイルをアップロード」または「フォルダをアップロード」をクリック
- 検索対象のドキュメントを選択してアップロード
コマンドラインから:
# ファイルをアップロード
gsutil cp /path/to/your/documents/*.pdf gs://your-bucket-name/
# フォルダごとアップロード
gsutil cp -r /path/to/your/documents/ gs://your-bucket-name/
対応ファイル形式:
- HTML
- TXT
- DOCX
- PPTX
- 画像(PNG, JPG)
- 動画(MP4, MOV)
ヒント: 後でデータストアを作成する際に、このバケットのパス(例: gs://your-bucket-name/)を指定します。
4. データストアの作成
Vertex AI Searchで検索するドキュメントを格納するデータストアを作成します。
手順
- GCPコンソールで「Discovery Engine」を検索
- 左メニューから「データストア」を選択
- 「データストアを作成」をクリック
- データストアの設定:
- データストアタイプ: 「非構造化ドキュメント」を選択
- データソース: 「Cloud Storage」を選択
-
Cloud Storageのパス: 前の手順で作成したバケットのパスを指定(例:
gs://your-bucket-name/) - リージョン: 「global」を選択
-
データストア名: わかりやすい名前を入力(例:
test-manuals) -
同期頻度: Cloud Storageとの同期タイミングを設定
- デフォルト: 24時間ごとに自動同期
- カスタム: より頻繁な同期も設定可能(例: 1時間、6時間など)
-
「作成」をクリック
-
手動同期を実行してインデックスを作成
データストア作成直後は、Cloud Storageのファイルが自動的にインデックスされない場合があります。以下の手順で手動同期を実行してください。
- Discovery Engine > データストアの一覧から、作成したデータストアを選択
- データストアの詳細画面で「手動同期」ボタンをクリック
- インデックス作成が開始されます(数分〜数時間かかる場合があります)
- 「ドキュメント」タブでインデックスされたドキュメント数を確認できます
⚠️ 重要: 同期ボタンを押さないとインデックスが作成されず、検索結果が空になります。必ず手動同期を実行してください。
5. Search Engineの作成
データストアを作成したら、次にSearch Engine(検索アプリ)を作成します。
手順
-
GCPコンソールで「Discovery Engine」を開く
-
左メニューから「アプリ」を選択
-
アプリの設定:
- アプリタイプ: 「 カスタム検索」を選択
-
アプリ名: わかりやすい名前を入力(例:
test-manuals-app) - 会社名: 任意の名前を入力
- データストアの選択:
- 先ほど作成したデータストアを選択
- 複数のデータストアも選択可能
- 「作成」をクリック
8. 検索テスト
RAG検索が正しく動作しているか、実際に検索をテストしてみましょう。
テスト用ドキュメントの準備
今回は、以下の5人のプロフィールドキュメントを使用してテストします:
| 名前 | 年齢 | 職業 | 趣味 | 性格 | 好きな食べ物 |
|---|---|---|---|---|---|
| 田中太郎 | 36歳 | システムエンジニア | 読書、カメラ | 真面目で几帳面 | ラーメン |
| 山田花子 | 28歳 | マーケティング担当 | ヨガ、料理 | 明るくて社交的 | パスタ |
| 佐藤健一 | 42歳 | 営業部長 | ゴルフ、釣り | おおらかで優しい | 寿司 |
| 鈴木美咲 | 31歳 | フリーランスデザイナー | 旅行、写真撮影 | 冒険好きで好奇心旺盛 | カレー |
| 高橋誠 | 36歳 | プロジェクトマネージャー | ランニング、映画鑑賞 | 積極的で情熱的 | ハンバーグ |
これらのプロフィールには、各人物の詳細情報(性格の説明、趣味の詳細、仕事内容など)が含まれています。
検索テストの実施
- Search Engineの画面を開く
- 「プレビュー」タブを選択
- 検索クエリを入力して実行
テスト結果:RAG検索成功!
テストクエリ: 「36歳の人は誰ですか?」
結果:
-
回答: 「36歳の人は高橋誠さんと田中太郎さんです。」
-
高橋誠さんの詳細:
- 名前: 高橋誠(たかはし まこと)
- 年齢: 36歳
- 性格: 積極的で情熱的
- 職業: プロジェクトマネージャー
- 趣味: ランニング、映画鑑賞
- 好きな食べ物: ハンバーグ
-
田中太郎さんの詳細:
- 名前: 田中太郎(たなか たろう)
- 年齢: 36歳
- 性格: 真面目で几帳面
- 職業: システムエンジニア
- 趣味: 読書、カメラ
- 好きな食べ物: ラーメン
さらに、取得ソースのリンクまで表示してくれています。
まとめ
Vertex AI Searchを使うことで、GCPコンソールでの設定だけで簡単にRAG検索を実装できました。
テストでは、複数のドキュメントから正確に情報を抽出し、出典付きで回答が返ってきました。
また、今回作成したRAG検索は、Discovery Engine APIを通じてアプリケーションから呼び出すことができます。APIを叩くだけでRAG機能を利用できるので、非常に便利です。
誰かの参考になれば幸いです。
参考リンク
🌺沖縄から「21世紀を代表する会社」を創る仲間を募集
シーエー・アドバンスは、「沖縄のインターネット産業の未来を創る」をビジョンに掲げ、サイバーエージェントグループの一員として、ABEMAやAmebaを支える社内システムを開発しています。 勤務地は沖縄・那覇市 おもろまち。 Next.js、React、Ruby on Rails、AWS などモダンな技術で、東京・ベトナムのエンジニアと協業。若手が裁量権を持って挑戦できる環境です。
失敗を恐れず挑戦できる文化。一緒にアドバンス(進歩)しませんか?










