2025年8月7日 【Google Cloud】Vertex AI Vector Searchでハイブリット検索を実装しよう!<前半> Google Cloud Vertex AI 検索する Popular tags 生成AI(Generative AI) Vertex AI Search Looker Studio BigQuery AlloyDB Google Workspace 事例紹介 Cloud SQL Category Google Cloud Author えいきち SHARE 目次 はじめに:「密」+「疎」エンベディングとは何か ステップ1:データセットの準備 ステップ2:ハイブリット検索用のデータの作成 ステップ3:Cloud Storageバケットの作成&ファイルのアップロード ステップ4:インデックスをエンドポイントにデプロイ まとめ Content 前回の記事では、「ハイブリット検索」の基本的な仕組みと「Vertex AI Vector Search」の概要を紹介いたしました。 本記事では、前半パートとしてVertex AI Vector Searchでハイブリット検索を実装する手順を初学者の方向けに紹介いたします。 今後、後半パートとして、作成したインデックスを利用してハイブリット検索を行う手順も紹介予定です。 Google Cloudの公式ドキュメントでは、用途ごとにノートブックのチュートリアルリストが公開されています。 こちらを引用しながら、説明を行いたいと思います。 ハイブリット検索チュートリアル(GitHub) Vertex AI Vector Searchを利用する際の大まかな手順は下記です。 ①データの作成 ②Cloud Storageでバケットを作成し、①で作成したデータファイルのアップロード ③アップロードしたファイルを利用してインデックスを作成 ④インデックスをインデックスエンドポイントにデプロイ 本記事の目的: Vertex AI Vector Searchでハイブリット検索を実装する手順を学ぶ はじめに:「密」+「疎」エンベディングとは何か 今回は求職者の情報を利用して、ハイブリット検索を行うためのデータを準備していきたいと思います。 ハイブリット検索については以前の記事で紹介しましたが、簡単にいうと、従来の「キーワード検索」(例:同じ単語を含むものを探す)と最近注目されている「セマンティック検索」(文章の意味を数値で表し、似ている内容を探す)を組み合わせた検索手法です。 ※一般的にベクトル検索は密ベクトルを用いた検索を指すことが多く、セマンティック検索と同義で利用されることが多いですが、技術的に疎ベクトル検索もベクトル検索にあたりますので、区別するためにここではセマンティック検索と表現します。 ハイブリット検索では、上記のように2つの検索方法を組みわせるため、2種類のベクトルを利用して情報を検索します。 疎ベクトル(Sparse Vector):キーワード(トークンベース)検索に利用 ・単語の出現情報を反映 密ベクトル(Dense Vector):セマンティック検索に利用 ・テキストの意味や文章を表現 つまり、、 ハイブリット検索は「キーワード検索(疎ベクトルによる検索)」と「セマンティック検索(密ベクトルによる検索)」を組み合わせる検索手法 「疎」エンベディングとは、単語の出現頻度などからキーワードベースのベクトル(疎ベクトル)を作成すること 「密」エンベディングとは、意味に基づくベクトル(密ベクトル)を作成すること ステップ1:データセットの準備 では、早速2つのベクトルデータを作成していきます。 ハイブリット検索を利用する際の、入力データの形式はこちらで指示されています。 入力データの形式と構造 最終的には、以下のようなデータ形式となるように処理を行っていきます。 {"id": "5", "embedding": [5, 5, -5], "sparse_embedding": {"values": [0.1], "dimensions": [500]}} {"id": "6", "embedding": [6, 7, -8.1], "sparse_embedding": {"values": [0.1, -0.2], "dimensions": [40, 901]}} 生成AIに作成してもらった下記の架空の求職者のデータ(idと簡易的なsummary)を利用します。 import pandas as pd job_seekers = [ {"id": 1, "summary": "28歳のエンジニア。Webアプリ開発経験が5年あり、PythonとReactを得意とする。"}, {"id": 2, "summary": "32歳のUI/UXデザイナー。FigmaとAdobe XDを用いたプロダクト設計に強みがある。"}, {"id": 3, "summary": "25歳の営業職。IT業界での法人営業経験が3年あり、提案力とコミュニケーション力に自信がある。"}, {"id": 4, "summary": "30歳のマーケター。SNS広告運用とSEO対策を中心に、デジタルマーケの改善実績多数。"}, {"id": 5, "summary": "27歳のデータサイエンティスト。機械学習モデルの開発や分析ダッシュボードの構築経験が豊富。"}, ] # DataFrame に変換 df = pd.DataFrame(job_seekers) ステップ2:ハイブリット検索用のデータの作成 まずは、疎ベクトルのデータから作成したいと思います。 (今回ライブラリのインストールやGoogle Cloud projectの設定などは完了していることを前提としています。) 参考環境情報: Windows11 google-cloud-aiplatform==1.71.1 mecab-python3==1.0.10 scikit-learn==1.6.1 pandas==2.2.3 今回はTF-IDF(Term Frequency-Inverse Document Frequency)という方法を使って文章をベクトル化します。 TF(Term Frequency):その文章の中で、その単語がどれくらい登場するか? IDF(Inverse Document Frequency):他の文章ではあまり登場しない、珍しい単語か? 「ある文章の中で、よく出てくるけど、他の文章ではあまり登場しない単語」が、その文章を特徴づけるものとして高いスコアになります。 実際にコードを見てみましょう! import MeCab from sklearn.feature_extraction.text import TfidfVectorizer # MeCabの準備 tagger = MeCab.Tagger("-Owakati") def mecab_tokenizer(text): return tagger.parse(text).strip().split() # corpusはdfのsummaryカラムのリスト corpus = df["summary"].tolist() # TfidfVectorizerを日本語用トークナイザで初期化 vectorizer = TfidfVectorizer(tokenizer=mecab_tokenizer) vectorizer.fit(corpus) # コーパスで学習 # 疎ベクトルを作る関数 def get_sparse_embedding(text): tfidf_vector = vectorizer.transform([text]) values = [] dims = [] for i, tfidf_value in enumerate(tfidf_vector.data): values.append(float(tfidf_value)) dims.append(int(tfidf_vector.indices[i])) return {"values": values, "dimensions": dims} # 全タイトルをベクトル化してリストにまとめる items = [] for i in range(len(df)): id = i summary = df.summary[i] sparse_embedding = get_sparse_embedding(summary) items.append({"id": id, "summary": summary, "sparse_embedding": sparse_embedding}) ※日本語を利用する場合、日本語は英語と異なりスペースが文章の中にないため、単語ごとに区切る処理(トークナイズ)が必要になります 上記を実行すると下記のような出力になります(長いので一部です) {'id': 0, 'summary': '28歳のエンジニア。Webアプリ開発経験が5年あり、PythonとReactを得意とする。', 'sparse_embedding': {'values': [0.25609363514606825, 0.25609363514606825, ....], 'dimensions': [3, 7, 11, 12, ...]}} {'id': 1, 'summary': '32歳のUI/UXデザイナー。....} では次に密ベクトルも作成します。 密ベクトルはGoogle CloudのVertex AIのTextEmbeddingModelを利用して作成します。 こちらの処理は、チュートリアルの「How to create hybrid index」のコードを基本そのまま利用できるかと思います。 今回はembeddingの対象が英語ではなく、日本語のため、一部モデル部分の修正を行いました。 (適切なembeddingモデルは随時変更されますので、サポートされているモデルを確認し、変更してください) 修正前: model = TextEmbeddingModel.from_pretrained("text-embedding-005") 修正後: model = TextEmbeddingModel.from_pretrained("text-multilingual-embedding-002") 最終的に下記のようなデータが完成します。 { 'id': 0, 'sumarry': '28歳のエンジニア。Webアプリ開発経験が5年あり、PythonとReactを得意とする。', 'embedding': [0.022880317643284798, -0.03315234184265137, ... -0.03309667482972145, 0.04621824622154236], 'sparse_embedding': { 'values': [0.25609363514606825, 0.25609363514606825, ....], 'dimensions': [3, 7, 11, 12, ...] } } { 'id': 1, 'sumarry': '32歳のUI/UXデザイナー...',....} ※今回idは元データと一致しないため、idが重要な場合は、処理の修正が必要です。 ステップ3:Cloud Storageバケットの作成&ファイルのアップロード 次にステップ2で作成したデータをGoogle Cloud Storageに保存します。 バケット名は何でも問題ありませんが、ファイルの編成は下記が推奨されています。 batch_rootフォルダ内に、データの入ったファイル(今回は画像のdemo.jsonファイル)を配置し、deleteフォルダ内にはインデックスから削除したいレコードのIDのリストを記載したファイルを配置して利用します。 詳しくはこちらのページを確認してください。 Cloud Storageでのデータの準備は完了です。 ステップ4:インデックスをエンドポイントにデプロイ 次にVertex AI Vector Searchのインデックスの作成と、作成したインデックスをエンドポイントにデプロイしていきます。 この操作はGUIから簡単に行えます。 インデックスの種類は①バッチアップデート用と②ストリーミングアップデート用の2種類あります。 バッチアップデートとは: データを一定の単位(バッチ)でまとめて処理・更新する方法です。例えば、1日に1回や1時間ごとにまとめて更新するような処理です。 ストリーミングアップデートとは: データをリアルタイムで即時に処理・更新する方法です。 今回はバッチアップデート用のインデックスを作成したいと思います。 ・Google Cloud > Vertex AI >Agent Builder> ベクトル検索を選択 ・画面中央あるいは右上にある「新しいインデックスを作成」を選択します。 ・バッチ アップデート用のインデックスを作成するを参考に、フォルダの指定やアルゴリズム、ディメンションの指定を行っていきます。 この時に更新方法で「バッチ」を選択するとバッチアップデート用のインデックスが作成され、「ストリーム」を選択するとストリーミングアップデート用のインデックスが作成されます。 またCloud Storageのフォルダを選択することで、先ほど作成したデータを利用してインデックスを作成することができます。 今回は下記のように設定しました。 アルゴリズムの種類:「Tree-AHアルゴリズム」か「ブルートフォースアルゴリズム」から選択できます。※実装手順の説明がメインのため、アルゴリズムの説明は省略します。 ディメンション:ベクトルを作成する際に利用したembeddingモデルにより指定するべきディメンションは異なりますのでご注意ください。 近似近傍数:最終的な並べ替えを行う前に絞り込むデータの件数の指定です。 ・作成ボタンを押すと、インデックスが作成されます。 インデックスの作成が完了したら、次はエンドポイントを作成し、インデックスをエンドポイントにデプロイします。 こちらは下記のページに手順が丁寧に記載ありますので、手順通りに行ってください。 IndexEndpoint を作成 インデックスをエンドポイントにデプロイする これで、Vertex AI Vector Searchでハイブリット検索を行う準備は完了です!お疲れ様でした! 前半ではハイブリット検索を行うための基本的な実装方法を紹介しました!後半では、ベクトル検索を利用してクエリを実行する方法を紹介できればと思います! まとめ 本記事では、Vertex AI Vector Searchでハイブリット検索を行うための準備手順について紹介いたしました。 ①データの作成 ②Cloud Storageでバケットを作成し、①で作成したデータファイルのアップロード ③アップロードしたファイルを利用してインデックスを作成 ④インデックスをインデックスエンドポイントにデプロイ 本記事が、Vertex AI Vector Searchを利用するきっかけとなれば幸いです。 データさえ準備できれば、GUIから簡単に操作ができます。ぜひご自身のデータで試しながら、ハイブリット検索を試されてください! 関連コンテンツ Vertex AI Vector Search~ハイブリット検索とは~ by えいきちon 2025年5月12日 頂きましたご意見につきましては、今後のより良い商品開発・サービス改善に活かしていきたいと考えております。 よく分かった 興味がある 面白かった よく分からない もっと知りたい Author えいきち 2023年中途入社。元医療職のデータアナリストです。 最近の趣味はバドミントンとランニングです。愛読書はジャンプです。 Google Cloud Vertex AI 2025年8月7日 【Google Cloud】Vertex AI Vector Searchでハイブリット検索を実装しよう!<前半> Category Google Cloud 前の記事を読む はじめての動画生成AIモデル Veo ~アパレルEC担当者が知っておきたい「画像から動画を作る」プロンプトの基本~ 次の記事を読む Google Cloud Next Tokyo ’25 参加レポートDAY1 Recommendation オススメ記事 2023年9月5日 Google Cloud 【Google Cloud】Looker Studio × Looker Studio Pro × Looker を徹底比較!機能・選び方を解説 2023年8月24日 Google Cloud 【Google Cloud】Migrate for Anthos and GKEでVMを移行してみた(1:概要編) 2022年10月10日 Google Cloud 【Google Cloud】AlloyDB と Cloud SQL を徹底比較してみた!!(第1回:AlloyDB の概要、性能検証編) BigQuery ML ワークショップ開催のお知らせ 生成AI導入支援パッケージ Discovery AI導入支援パッケージ Google Cloud ホワイトペーパー 新着記事 2025年8月28日 Google Cloud 【BigQuery】AI.GENERATE_TABLE 関数を使用して、画像から構造化データを生成してみた 2025年8月27日 Google Cloud 【アパレルEC担当者向け】商品のモデル着用画像を生成するAI Virtual Try-On 2025年8月22日 Google Cloud Agent EngineをREST APIとして使えるようにしてみた! HOME Google Cloud 【Google Cloud】Vertex AI Vector Searchでハイブリット検索を実装しよう!<前半>