Column

コラム

  • Vertex AI Search でデータの鮮度を考慮してみ...

Vertex AI Search でデータの鮮度を考慮してみた

Vertex AI Search でデータの鮮度を考慮してみた

※このデモは データの鮮度を考慮することで、日付の新しいドキュメントが優先的に表示されていることを示します。

DataCurrent の金子です。Vertex AI Search のブースト機能を試してみました。

ブースト機能を利用することで、以下のようなメリットが期待できます。

  • 更新日をブーストすることで、日付の新しいドキュメントを優先的に表示することができる
  • 表示回数をブーストすることで、人気のドキュメントを優先的に表示することができる

※ こちらの内容は、Google Cloud の公式ドキュメント Boost search results を参考にしています。

ブースト機能とは

ブースト機能は、検索結果の順位を変更するための機能です。ドキュメントが指定された条件を満たすと、ブースト値が適用され、検索結果の順位が変更されます。

数値や日時などの型を持つフィールドに対しては、区分線系方式でブーストを設定できます。例えば鮮度に応じたブースト機能を利用する場合、更新日時が 7 日前までを 0.4 にブーストし、30 日前までを 0.37 にブーストすると、線形補間が適用され、以下のようなブースト値が設定されます。

鮮度ブースト値
7 日前0.4
7 日前から 30 日前まで0.4 から 0.37 に線形補間
30 日前0.37

ブースト機能を試す

事前準備

Vertex AI Search のブースト機能は、構造化データ、非構造化データ、Web サイトデータで利用することができます。

今回は、鮮度に応じたブースト機能を試すために、メタデータを含む非構造化データを使って試してみましょう。

その場合は、データストアでインポートする際に Cloud Storage を直に指定するのではなく、BigQuery 上にあらかじめメタデータを定義し、そのテーブルを指定して非構造化データをインデックス化するとよいでしょう。

BigQuery を使った取り込み例

インデックス化したい PDF のメタデータが以下のように BigQuery テーブル上にあるとします。

document_idtitlemodified_by_namemodified_at
1顧客分析_特別価格用_縦柄チラシ_ver2.pptx佐藤花子2023-09-08
220200730_データ保護・ プライバシー対応 支援サービス ご紹介.pptx伊藤あや子2023-07-03
320230816_AI活用トライアルパッケージ_v1.pptx山田太郎2023-08-15
4202405_DataCurrentケイパ資料.pptx佐藤花子2024-06-18

このテーブルを Vertex AI Search に取り込む際は、テーブルを以下の形に変換します。

idjsonDatacontent.mimeType *1content.uri *1,2
1{“title”: “顧客分析_特別価格用_縦柄チラシ_ver2.pptx”, “modified_by_name”: “佐藤花子”, “modified_at”: “2023-09-08”}application/pdfgs://my_google_bucket/pdf/document_1.pdf
2{“title”: “20200730_データ保護・ プライバシー対応 支援サービス ご紹介.pptx”, “modified_by_name”: “伊藤あや子”, “modified_at”: “2023-07-03”}application/pdfgs://my_google_bucket/pdf/document_2.pdf
3{“title”: “20230816_AI活用トライアルパッケージ_v1.pptx”, “modified_by_name”: “山田太郎”, “modified_at”: “2023-08-15”}application/pdfgs://my_google_bucket/pdf/document_3.pdf
4{“title”: “202405_DataCurrentケイパ資料.pptx”, “modified_by_name”: “佐藤花子”, “modified_at”: “2024-06-18”}application/pdfgs://my_google_bucket/pdf/document_4.pdf

*1 content は Struct (Record) 型を表します。

*2 content.uri は PDF の Cloud Storage URI を指定します。

このテーブルを Vertex AI Search で指定することで、メタデータを含む非構造化データをインデックス化することができます。

※ 詳しくは 公式ドキュメントの BigQuery の章 を参照してください。

鮮度に応じたブースト機能を使った検索

Python を使って Vertex AI Search のブースト機能を使った検索を行う方法を以下に示します。

今回は、分かり易い例として、更新日時をブーストすることで、鮮度の高いドキュメントを優先的に表示してみましょう。

※ 2024/9/2 時点では、google.cloud.discoveryengine_v1 の Python モジュール仕様は公式ドキュメントの内容と若干異なっていたので、google.cloud.discoveryengine_v1beta を利用しました。

from typing import List

from google.api_core.client_options import ClientOptions
from google.cloud import discoveryengine_v1beta as discoveryengine
from google.cloud.discoveryengine_v1beta import SearchRequest

# TODO(developer): サンプルコードを実行する前に、以下の変数を適切な値に置き換えてください。
# project_id = "YOUR_PROJECT_ID"
# location = "YOUR_LOCATION"          # Values: "global", "us", "eu"
# engine_id = "YOUR_DATA_STORE_UD"
# search_query = "YOUR_SEARCH_QUERY"
# boost = True  # ブースト機能を使用するかどうか

def search_sample(
    project_id: str,
    location: str,
    engine_id: str,
    search_query: str,
    # ブーストするかどうか
    boost: bool = False,
) -> List[discoveryengine.SearchResponse]:

    client_options = (
        ClientOptions(api_endpoint=f"{location}-discoveryengine.googleapis.com")
        if location != "global"
        else None
    )

    client = discoveryengine.SearchServiceClient(client_options=client_options)

    serving_config = client.serving_config_path(
        project=project_id,
        location=location,
        data_store=engine_id,
        serving_config="default_search",
    )

    boost_spec = None
    if boost:
        boost_spec = SearchRequest.BoostSpec(condition_boost_specs=[
                SearchRequest.BoostSpec.ConditionBoostSpec(
                    condition="modified_at > \"1990-01-01\"", # ドキュメント通り、true とするとエラーになったので、すべてのドキュメントが対象となるであろう条件を指定した。
                    boost=1.0,
                    boost_control_spec=SearchRequest.BoostSpec.ConditionBoostSpec.
                    BoostControlSpec(
                        field_name="modified_at", # ブーストするフィールド。鮮度に応じたブーストの場合は、datetime 型のフィールドを指定する必要があった。
                        attribute_type=SearchRequest.BoostSpec.ConditionBoostSpec.
                        BoostControlSpec.AttributeType.FRESHNESS,
                        interpolation_type=SearchRequest.BoostSpec.
                        ConditionBoostSpec.BoostControlSpec.InterpolationType.
                        LINEAR,
                        control_points=[
                            SearchRequest.BoostSpec.ConditionBoostSpec.
                            BoostControlSpec.ControlPoint(
                                attribute_value="60D", # 60 日前まで
                                boost_amount=0.8,
                            ),
                            SearchRequest.BoostSpec.ConditionBoostSpec.
                            BoostControlSpec.ControlPoint(
                                attribute_value="180D", # 180 日前まで
                                boost_amount=0.50,
                            ),
                            SearchRequest.BoostSpec.ConditionBoostSpec.
                            BoostControlSpec.ControlPoint(
                                attribute_value="365D", # 365 日前まで
                                boost_amount=0.20,
                            ),
                            SearchRequest.BoostSpec.ConditionBoostSpec.
                            BoostControlSpec.ControlPoint(
                                attribute_value="730D", # 730 日前まで
                                boost_amount=0.0,
                            ),
                            # 730 日より古いものは 0.0
                        ],
                    ),
                )
            ])
    request = discoveryengine.SearchRequest(
        serving_config=serving_config,
        query=search_query,
        boost_spec=boost_spec)

    response = client.search(request)

    return response

いくつかサンプルコードの出力例を見てみましょう。

まずは、ブースト機能を使用せずに検索する場合です。

response = search_sample(
    project_id="YOUR_PROJECT_ID",
    location="YOUR_LOCATION",
    engine_id="YOUR_DATA_STORE_UD",
    search_query="最新ITP対応Cookie",
    boost=False, # ブースト機能を使用しない
)
modified_at = []
for result in response.results:
    struct_data = result.document.struct_data
    modified_at.append(struct_data["modified_at"])

print(modified_at)
# ['2023-09-19T02:18:50-07:00', '2023-09-19T02:18:51-07:00', '2024-06-10T19:42:27-07:00', '2024-04-02T18:42:11-07:00',  ...] ← modified_at の値が古い値も上位に返された。

古い更新日時のドキュメントも上位に表示されていることがわかります。

次に、ブースト機能を使用して検索する場合です。

response = search_sample(
    project_id="YOUR_PROJECT_ID",
    location="YOUR_LOCATION",
    engine_id="YOUR_DATA_STORE_UD",
    search_query="最新ITP対応Cookie",
    boost=True, # ブースト機能を使用する
)

modified_at = []
for result in response.results:
    struct_data = result.document.struct_data
    modified_at.append(struct_data["modified_at"])

print(modified_at)
# ['2024-06-10T19:42:27-07:00', '2024-06-03T17:52:22-07:00', '2023-09-19T02:18:50-07:00', '2024-04-02T18:42:11-07:00', ...] ← modified_at の値が新しい値が上位に返された。

更新日時が新しいアイテムが優先的に表示されました。3 番目のドキュメントよりも 4 番目のドキュメントの方が新しいので、単純な更新日時の降順になっているわけではないようです。 あくまでブースト値が適用されたことにより、新しいドキュメントが優先的に表示され、検索順位が変更されたことがわかります。

まとめ

Vertex AI Search のブースト機能を使って、鮮度の高いアイテムを優先的に表示することができました。 更新日時が新しいものを優先的に表示することで、ユーザーが求める情報をより効率的に見つけることができそうですね。 また、表示回数などの人気度をブースト条件に入れることで、人気のアイテムを優先的に表示することも可能でしょう。

注意点としては、このようなブースト機能を使う際は、適切なブースト値を設定することが重要でしょう。ブースト値が高すぎると、新しいアイテムが過剰に表示される可能性があるため、現場においては適切な値を探るフェーズが必要になると考えられます。

最後に

自社に専門人材がいない、リソースが足りない等の課題をお持ちの方に、エンジニア領域の支援サービス(Data Engineer Hub)をご提供しています。 お困りごとございましたら是非お気軽にご相談ください。

【本件に関するお問い合わせ先】
DataCurrent 広報
E-mail:info@datacurrent.co.jp

人気のコラムランキング

PICK UP

企業のDX推進におけるダッシュボード内製化について

DXmarketingPICK UP コラムダッシュボード内製化

企業のDX推進に向けた人材教育支援について

GA4marketingPICK UP コラム内製化

【データプライバシーコラム】電気通信事業法改正の解説(2022年7月時点)

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

CMP導入時の注意点

CMPPICK UP コラムデータプライバシーデータプライバシーコラム個人情報保護

TOPへ
戻る