2025年8月7日

【Google Cloud】Vertex AI Vector Searchでハイブリット検索を実装しよう!<前半>


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から簡単に操作ができます。ぜひご自身のデータで試しながら、ハイブリット検索を試されてください!

2025年8月7日 【Google Cloud】Vertex AI Vector Searchでハイブリット検索を実装しよう!<前半>

Category Google Cloud

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら