実践 Vertex AI Search:自然言語フィルタを使ってみる
1. はじめに
株式会社 Hogetic Lab のエンジニア 古川です。
前回は、Vertex AI Search のフィルタを使って、データセット内の検索対象を絞り込む方法を紹介しました。
フィルタの設定は SQL でデータを絞り込むようなものです。
エンジニアとしては、アプリケーション上に期間指定などの入力フォームを設け、filter を設定するロジックを実装することになります。
そして、ユーザーにとっての体験は従来のアプリケーションと変わりません。
Google の検索技術をアプリケーションに組み込みやすくなった、という意味ではとても有用だとは思うのですが、「なーんだ。せっかく生成AI使っているのに体験は変わらないのかぁ」と感じる方も多いのではないでしょうか。(かく言う私もその一人です。)
せっかく自然言語で質問できるのであれば、その文脈から自動で絞り込んで欲しい。
そんな要望に応えるための機能が「自然言語理解によるフィルタリング」(以下、自然言語フィルタ)です。
今回は、自然言語フィルタの使い方を解説し、実際に使った時の結果を紹介します。
2. 自然言語フィルタの設定方法
自然言語フィルタは、記事作成時点でプレビューサービスになります。
サービス規約やサポートは通常のサービスと異なるため、自社アプリケーションへの導入には十分な検討が必要です。
また、主な制限は以下の通りです。(詳しくは Filter with natural-language understanding - Limitations をご確認ください)
制限事項
- 構造化データを使用する汎用検索アプリのみで動作します。
- ブレンド検索アプリ(複数のデータセットを使うアプリ)では使用できません。
非構造化データを使う検索アプリで使用できないのは残念ですが、今後、拡張されていくことを期待しています。
2-1. 自然言語フィルタを使用するための設定
現時点では、コンソールでの設定はできません。こちら に従い、自然言語フィルタを使いたいデータストアをパラメータに設定して curl でリクエストしてください。
curl -X PATCH \
-H "Authorization: Bearer $(gcloud auth print-access-token)" \
-H "Content-Type: application/json" \
-H "X-Goog-User-Project: ${YOUR_PROJECT_ID}" \
"https://discoveryengine.googleapis.com/v1beta/projects/${YOUR_PROJECT_ID}/locations/global/collections/default_collection/dataStores/${DATA_STORE_ID}?update_mask=natural_language_query_understanding_config.mode" \
-d '{
"naturalLanguageQueryUnderstandingConfig": {
"mode": "ENABLED"
}
}'
リクエストが正常に受け付けられると、以下のようなレスポンスが返ってきます。
{
"name": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store",
"displayName": "test_data_store",
"industryVertical": "GENERIC",
"createTime": "2024-07-10T18:50:01.673414Z",
"solutionTypes": [
"SOLUTION_TYPE_SEARCH"
],
"defaultSchemaId": "default_schema",
"documentProcessingConfig": {
"name": "projects/123456/locations/global/collections/default_collection/dataStores/my-data-store/documentProcessingConfig",
"defaultParsingConfig": {
"digitalParsingConfig": {}
}
},
"servingConfigDataStore": {},
"naturalLanguageQueryUnderstandingConfig": {
"mode": "ENABLED"
}
}
本機能が有効になるには最大で24時間待つ必要があります。
なお、有効になる前に、この後に紹介するように本機能を設定してリクエストしてもエラーにはなりません。
設定していない時と同じ結果が返ってきます。(非構造化データでリクエストしても同様の結果が返ってくるのですが、いつまで待っても有効にならないのでご注意ください。)
私が試したときは、夜にリクエストして翌朝には使用できるようになっており 24 時間はかかりませんでした。
2-2. 自然言語フィルタを使用した検索リクエスト
自然言語フィルタはまだプレビューサービスのため、Python のモジュールとしては discoveryengine_v1beta を使う必要があります。
今回も こちらのサンプルコードを参考にして、設定箇所を説明します。
...(略)...
from google.cloud import discoveryengine_v1beta as discoveryengine # discoveryengine_v1 をベータ版に変更
...(略)...
request = discoveryengine.SearchRequest(
serving_config=serving_config,
query=search_query,
page_size=10,
content_search_spec=content_search_spec,
query_expansion_spec=discoveryengine.SearchRequest.QueryExpansionSpec(
condition=discoveryengine.SearchRequest.QueryExpansionSpec.Condition.AUTO,
),
spell_correction_spec=discoveryengine.SearchRequest.SpellCorrectionSpec(
mode=discoveryengine.SearchRequest.SpellCorrectionSpec.Mode.AUTO
),
## 通常のフィルタはコメントアウト
# filter="{{ここに条件を指定する}}",
## 自然言語フィルタを有効化
natural_language_query_understanding_spec=discoveryengine.SearchRequest.NaturalLanguageQueryUnderstandingSpec(
filter_extraction_condition=discoveryengine.SearchRequest.NaturalLanguageQueryUnderstandingSpec.FilterExtractionCondition.ENABLED
),
)
2-3. 実行結果
前回と同じデータセットを使用し、同様の質問をしてみます。(使用したデータセットとスキーマについてはこちらをご覧ください)
質問
2023年12月に飲んだビールの中でまた飲みたいと感じたビールを異なるスタイルで3つ挙げて
検索結果数: 1216件
要約
2023年12月に飲んだビールに関するデータは提供されていません。そのため、2023年12月に飲んだビールの中でまた飲みたいと感じたビールを異なるスタイルで3つ挙げることはできません。
うまくフィルタがかからなかったようです。レスポンスの中身を確認してみましょう。
natural_language_query_understanding_info {
rewritten_query: "2023年12月に飲んだビールの中でまた飲みたいと感じたビールを異なるスタイルで3つ挙げて"
}
自然言語フィルタが設定されると、rewritten_query には、そのフィルタに関わる文言を除いた指示が入るため、やはり機能しなかったようです。
質問を少し工夫して期間を明確にしてみます。
質問
2023年12月1日から31日の間に飲んだビールの中でまた飲みたいと感じたビールを異なるスタイルで3つ挙げて
検索結果数: 35件
要約
2023年12月1日から31日の間に飲んだビールで、また飲みたいと感じたビールを異なるスタイルで3つ挙げます。
1つ目は、常陸野ネストビールのグリーンホップスラガーです。これはラガーで、クリアな口当たりと苦味と甘味のバランスが良いと評価しました。草っぽいハーブ感とカラメルの甘い香りも印象的でした。
2つ目は、キリンビールの一番搾りとれたてホップです。フレッシュホップビールで、まろやかな口当たりと程よい麦芽感のある甘味に寄り添うような苦味が特徴です。フレッシュな香りとふくよかな麦芽の甘い香りも魅力的でした。
3つ目は、Hardywood ParkのBourbon Vanilla Raspberry Stoutです。インペリアルスタウトで、ベリーの酸味が効いて飲み口が軽やかで、ベリーの効いたチョコレートのような風味でした。アルコール度数は11.5%と高めですが、甘すぎず飲みやすかったです。
これら3つのビールは、それぞれ異なるスタイル(ラガー、フレッシュホップビール、インペリアルスタウト)でありながら、いずれも「また飲みたい」と感じたビールです。
うまくフィルタがかかったようです。レスポンスの中身は以下の通りでした。
natural_language_query_understanding_info {
extracted_filters: "(record_date>=20231201 AND record_date<=20231231)"
rewritten_query: "また飲みたいと感じた, 3つ"
structured_extracted_filter {
expression {
and_expr {
expressions {
}
expressions {
}
}
}
}
}
- 質問から抽出されたフィルタは extracted_filters に設定されました。
- フィルタに設定された期間が除かれた質問が rewritten_query に設定されています。(要約では「スタイル」が考慮されていますが、ここには入っていません。要約の回答には元の質問が使われているようです)
- structured_extracted_filter は抽出されたフィルタの構造が出力されています。今回は二つの条件の AND 条件であることが表現されています。
このように、自然言語理解によるフィルタリングが適切に設定されると、検索の絞り込みの精度が上がり、より適切なデータが取得できます。
この機能が有効に動作すれば、ユーザー体験が従来のアプリケーションから大きく変わることが期待できます。
3. まとめ
今回は Vertex AI Search の自然言語フィルタを紹介しました。
現時点では、まだプレビュー版ということもあり、期待しているフィルタが設定されないことが多々ありますが、これから改善されていくことでしょう。
今後も、具体的な事例を取り上げて、Vertex AI Search の便利な機能や使い方を紹介していこうと思います。お楽しみに。
※ データ分析や AI 活用に関するご相談は、以下よりお気軽にお問い合わせください。
お問い合わせフォーム
参考情報
Google Cloud Vertex AI Agent Builder の公式ドキュメント
- Filter with natural-language understanding: 自然言語フィルタの使い方。Geolocation についても説明されています。
- Class NaturalLanguageQueryUnderstandingInfo: 自然言語フィルタの結果としてレスポンスに含まれる項目の説明です。
今回紹介するビール: グリーンホップスラガー(常陸野ネストビール)
常陸野ネストビールは茨城県の老舗の醸造所です。
かわいいフクロウのラベルはみたことがある方も多いのでは?
このビールは、とにかく香りがよく、ホップ好きにはたまらない。
4.5%とややアルコール度数が低いものの、軽いカラメル感としっかりした苦味でしっかりした飲みごたえがあります。
イオン限定販売なので、見つけたらぜひお試しください。
公式HP プレスリリース
Discussion