こんにちは。エンジニアの大橋です。
今回は、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 を活用することで、より条件にマッチした検索結果を得ることができますので、ぜひ活用してみてください。
今回はこれで以上となります。最後までお読みいただき、ありがとうございました。