Data Cloud の Vector Search で Pre-Filtering を活用する

こんにちは。エンジニアの大橋です。

今回は、Data Cloud の Vector Search で、Pre-Filtering を活用する方法について書こうと思います。

概要

Data Cloud の Vector Search は、非構造化データ(会話データ、PDF、画像など)から意味的に関連性の高い情報を探し出すことに強みがあります。

しかし、Vector Search は意味の類似性に基づいて検索を行うため、SQL の WHERE 句のような絞り込み条件による検索(条件一致検索)は苦手としています。例を挙げると、「特定カテゴリーの商品」や「特定の日付以降に作成されたドキュメント」といった条件です。

このような Vector Search の弱点を補える機能が Pre-Filtering です。Pre-Filtering を利用することで、Vector Search を実行する前に特定の条件でデータを絞り込むことができます。これにより、意味検索と条件一致検索を組み合わせた検索が可能になります。

また、Pre-Filtering はパフォーマンスの面でも良い影響を与えます。Vector Search の実行前に検索範囲を絞り込むため、Query の実行速度が上がり、Data Cloud のクレジット消費を抑える効果が期待できます。特に大規模なデータセットを扱う場合、これは大きな違いを生みそうです。

それでは、具体的な実装方法を見ていきましょう。

Search Index 作成時の Pre-Filtering 設定

Pre-Filtering を使用するには、Search Index を作成する段階で、Pre-Filtering したい項目を設定しておく必要があります。

なお、一度 Search Index を作成すると、後から Pre-Filtering 項目を編集することはできませんので、ご注意ください。Pre-Filtering 項目を変更したい場合は、新しく Search Index を作り直す必要があります。

Pre-Filtering 項目を設定する手順は簡単で、Search Index 作成手順の「Fields for Filtering」で、Pre-Filtering したい項目を選択するだけです。

今回は提案書の要約を含む DMO (Proposal Summary DMO) に対して、提案金額項目(estimated-amount)を Pre-Filtering 項目に追加しています。

Vector Search Query の作成

それでは、Vector Search で先ほど指定した Pre-Filtering 項目を使ってみたいと思います。

Vector Search Query は以下のようになります。

SELECT dmo.id__c, dmo.title__c, dmo.industry__c, dmo.platform__c, dmo.estimated_amount__c, dmo.customer__c, dmo.overview__c, dmo.url__c
FROM vector_search(
    TABLE(ProposalSummary_index__dlm), 
    '<escapedQuery>', 
    '<filterClause>', 
    '5') index 
JOIN ProposalSummary_chunk__dlm chunk ON index.RecordId__c = chunk.RecordId__c 
JOIN ProposalSummary__dlm dmo ON chunk.SourceRecordId__c = dmo.id__c 
ORDER BY index.score__c DESC 

escapedQuery には、ベクトル検索を行う検索文字列を記述します。 filterClause には、今回設定した Pre-Filtering 項目を使用し、Pre-Filtering 条件式を記述します。

例えば、「提案金額が100万円以上200万円以下」の提案書を絞り込む場合、Pre-Filtering 条件式は以下のようになります。(参考:Vector Search Query Expressions and Pre-Filtering

`estimated_amount__c >= 1000000 and estimated_amount__c <= 2000000`

Vector Search 実行結果の確認

では、実際に Vector Search を実行した時の結果を確認したいと思います。

Data Cloud の Query Editor を使用します。

検索結果を見ると、「提案金額が100万円以上200万円以下」という条件を満たすレコードを絞り込めていることが確認できます。

まとめ

Data Cloud の Vector Search で Pre-Filtering を活用し、特定条件で検索結果を絞り込むことができました。

最後に改めて実装の注意点をまとめると、以下になります。

  • Search Index の作成段階で Pre-Filtering 項目を指定しておく必要がある
  • Search Index の作成後は Pre-Filtering 項目を変更できないため、変更したい場合は再作成が必要
  • Vector Search Query の vector_search 構文の第三引数に Pre-Filtering 条件を記述する

概要でもお伝えした通り、Vector Search は意味的な類似性に基づく検索を得意としている反面、特定の条件と一致するような検索を苦手としています。 意味検索に加えて、一部の条件を厳密に指定したい場合には、今回紹介した Pre-Filtering を活用することで、より条件にマッチした検索結果を得ることができますので、ぜひ活用してみてください。

今回はこれで以上となります。最後までお読みいただき、ありがとうございました。