Cortex Searchスコアリングのカスタマイズ¶
デフォルトでは、Cortex Search Serviceへのクエリは、ベクトル類似性、テキストマッチング、再ランク付けを活用して、各結果の関連性を決定します。検索結果のスコアリングは、いくつかの方法でカスタマイズできます。
数値メタデータ列に基づいて 数値ブースト を適用します。
タイムスタンプメタデータ列に基づいて 時間減算 を適用します。
再ランク付け を無効化して、クエリのレイテンシを短縮します。
コンポーネントの重み を変更して、全体的な検索ランキングにおける個々のスコアリングコンポーネント(ベクトル、テキスト、再ランク付け)の重みを調整します。
数値ブーストと時間減衰¶
数値やタイムスタンプのメタデータに基づいて、検索結果をブーストしたり、減算を適用したりできます。この機能は、クエリ時にドキュメントの関連性を判断するのに役立つ、各結果の人気度や新着度のシグナルのような構造化されたメタデータがある場合に便利です。クエリ作成時に、2種類のランキングシグナルを指定できます。
型 |
説明 |
アプリケーション列タイプ |
メタデータフィールドの例(説明用) |
|---|---|---|---|
数値ブースト |
より多くの注目やアクティビティを持つ結果を後押しする数値メタデータ。 |
|
|
時間減衰 |
より新しい結果を後押しする日付または時刻のメタデータ。再帰性信号減衰の影響は時間とともに減少します。 |
|
ブーストと減衰のメタデータは、 Cortex Search Serviceが作成されるソーステーブルの列から取得されます。クエリを作成するときに、ブーストまたは減衰に使用するメタデータ列を指定しますが、それらの列はCortex Searchサービスを作成するときに含める必要があります。
Cortex Search Serviceをクエリする際、ブーストまたは減衰に使用する列をオプションの numeric_boosts、 time_decays、 scoring_config.functions フィールドで指定します。また、ブーストや減衰ごとにウェイトを指定することもできます。
{
"scoring_config": {
"functions": {
"numeric_boosts": [
{
"column": "column_name",
"weight": 1
},
/* ... */
],
"time_decays": [
{
"column": "column_name",
"weight": 1,
"limit_hours": 120
},
/* ... */
]
}
}
}
プロパティ¶
numeric_boosts(配列、オプション):<numeric_boost_object >(オブジェクト、オプション):column_name(string): ブーストを適用する列を数値で指定します。weight(float): ランキング処理において、ブーストされた列に割り当てられる重みまたは重要度を指定します。複数の列が指定されている場合、ウェイトが高いほどフィールドの影響が大きくなります。
time_decays(配列、オプション):<time_decay_object>(オブジェクト、オプション):column_name(string): 減衰を適用する時間列または日付列を指定します。weight(float): 順位付けプロセスにおいて、減衰した列に割り当てられる重みまたは重要度を指定します。複数の列が指定されている場合、ウェイトが高いほどフィールドの影響が大きくなります。limit_hours(float): 時間がドキュメントの関連性や重要性に影響を与えなくなる境界をセットします。例えば、limit_hoursの値が240の場合、nowのタイムスタンプから240時間(10日)以上過去のタイムスタンプを持つドキュメントは大幅なブーストを受けず、直近240時間以内のタイムスタンプを持つドキュメントはより大幅なブーストを受ける必要があることを示します。now(文字列、オプション): ISO-8601 形式yyyy-MM-dd'T'HH:mm:ss.SSSXXXで減衰を計算するリファレンスタイムスタンプ。例えば、"2025-02-19T14:30:45.123-08:00"です。指定がない場合、デフォルトは現在のタイムスタンプです。
注釈
数値のブーストは、返されたフィールドの加重平均として適用され、減衰はログ平滑化関数を利用して、最近の値より低い値を降格させます。
ウェイトは、指定されたブーストまたは減衰フィールド全体における相対的なものです。boosts または decays 配列内に単一のフィールドしかプロバイダーがない場合、その重みの値は関係ありません。
複数のフィールドが提供された場合、重みは相対的に適用されます。例えば、重みが10のフィールドは、重みが5のフィールドの2倍、記録のランキングに影響します。
再ランキング¶
デフォルトでは、Cortex Search Serviceへのクエリは、 セマンティック・リランキング を活用し、検索結果の関連性を向上させます。再ランキングはクエリ結果の関連性を著しく向上させますが、クエリの待ち時間も著しく増加させます。ビジネスユースケースにおいて、クエリの高速化のために、リランキングが提供する品質の利点を犠牲にできることがわかった場合、どのCortex Searchクエリでもリランキングを無効にすることができます。
注釈
リランキングを無効にすると、クエリの待ち時間が平均で100~300ms短縮されますが、待ち時間の正確な短縮幅や品質低下の大きさはワークロードによって異なります。クエリでリランキングを無効にする前に、リランキングあり、なしの結果を並べて評価してください。
クエリ時に scoring_config.reranker フィールドで、以下の形式で個々のクエリのリランカーを無効にすることができます。
{
"scoring_config": {
"reranker": "none"
}
}
プロパティ¶
reranker(文字列、オプション): リランカーをオフにする場合は "none" をセットするパラメーター。除外されているかNULLの場合、デフォルトのリランカーが使用されます。
コンポーネントの重み¶
scoring_config オブジェクトの weights フィールドでは、各結果の総合スコアにおける個々のスコアリングコンポーネント( vectors 、 texts 、 reranker )の重みを指定できます。デフォルトでは、各コンポーネントの重みは1.0に設定され、総合スコアへの貢献度は等しくなります。
重みは次の形式で指定できます。
{
"scoring_config": {
"functions": {
"weights": {
"texts": 3,
"vectors": 2,
"reranker": 1
}
}
}
}
プロパティ¶
weights(オブジェクト、オプション):各ドキュメントのテキスト、ベクトル、リランカーのスコアを組み合わせるための重みを指定します。重みは、このフィールド内で互いに相対的に適用されます。
たとえば、以下はテキストスコアの重みをベクトルスコアの3倍、リランカースコアの重みをテキストスコアの2倍に設定することを指定しています。
{
"scoring_config": {
"functions": {
"weights": {
"texts": 3,
"vectors": 1,
"reranker": 2
}
}
}
}
名前付きスコアリングプロファイル¶
ブースト/減算とリランカーの設定を合わせて*スコアリング設定*となり、クエリ作成時に scoring_config パラメーターで指定できます。また、スコアリング設定に名前を付けて、Cortex Searchサービスに添付することもできます。
名前付きスコアリングプロファイルを使用すると、アプリケーションやクエリ間で同じスコアリング設定を簡単に使用でき、毎回すべてのスコアリング設定を指定する手間が省けます。スコアリング設定を変更する場合は、すべてのクエリで更新する必要はなく、1か所で更新するだけで済みます。
Cortex Search Serviceにスコアリングプロファイルを追加するには、以下の例に示すように、 ALTER CORTEX SEARCH SERVICE ... ADD SCORING PROFILE コマンドを使用します。
ALTER CORTEX SEARCH SERVICE my_search_service
ADD SCORING PROFILE IF NOT EXISTS heavy_comments_with_likes
'{
"functions": {
"numeric_boosts": [
{ "column": "comments", "weight": 6 },
{ "column": "likes", "weight": 1 }
]
}
}'
スコアリングプロファイル定義の構文は、クエリを作成する際に scoring_config パラメーターで使用されるスキーマと同じです。
スコアリングプロファイルは作成後に変更することはできません。プロファイルを変更するには、プロファイルを削除し、新しいスコアリング設定で再作成します。名前付きスコアリングプロファイルを削除するには、 ALTER CORTEX SEARCH SERVICE ... DROP SCORING PROFILE を使用します。
名前付きスコアリングプロファイルを使用してCortex Search Serviceをクエリするには、次の例に示すように、クエリ作成時に scoring_profile パラメーターにプロファイル名を指定します。
results = svc.search(
query="technology",
columns=["comments", "likes"],
scoring_profile="heavy_comments_with_likes",
limit=10
)
curl --location https://<account_url>/api/v2/databases/<db_name>/schemas/<schema_name>/cortex-search-services/<service_name>:query \
--header 'Content-Type: application/json' \
--header 'Accept: application/json' \
--header "Authorization: Bearer $PAT" \
--data '{
"query": "technology",
"columns": ["DOCUMENT_CONTENTS", "LIKES", "COMMENTS"],
"scoring_profile": "heavy_comments_with_likes",
"limit": 10
}'
SELECT SNOWFLAKE.CORTEX.SEARCH_PREVIEW(
'my_search_service',
'{
"query": "technology",
"columns": ["comments", "likes"],
"scoring_profile": "heavy_comments_with_likes",
"limit": 10
}'
);
サービスの保存されたスコアリングプロファイルを見るには、次の例に示すように、 INFORMATION_SCHEMA スキーマの CORTEX_SEARCH_SERVICE_SCORING_PROFILES ビューをクエリします。
SELECT *
FROM my_db.INFORMATION_SCHEMA.CORTEX_SEARCH_SERVICE_SCORING_PROFILES
WHERE service_name = 'my_search_service';
注釈
DESCRIBE CORTEX SEARCH SERVICE と SHOW CORTEX SEARCH SERVICE の結果には、 scoring_profile_count という列があり、各サービスのスコアリングプロファイルの数を示しています。
コンポーネントスコア¶
コンポーネントスコアは、検索結果の詳細なスコアリング情報を提供します。これにより、開発者は検索順位の決定方法を理解し、検索パフォーマンスをデバッグできます。各検索結果のスコアは、各検索「コンポーネント」(テキスト、ベクトル)の @scores フィールドに返されます。コンポーネントスコアは、次のような必要がある場面で役立ちます。
しきい値を確立する: コンポーネントスコアを使用して、結果をエージェントなどの下流のプロセスにいつ渡すかを決定します。
検索ランキングのデバッグ: 検索結果で特定のドキュメントが他のドキュメントより上位にランクされる理由を理解します。
コンポーネントスコアの理解¶
コンポーネントスコアは、Cortex Searchが各検索結果の最終的な関連性スコアを計算する方法の詳細な内訳を提供します。スコアリングシステムは複数のコンポーネントで構成されています。
- コサイン類似性
クエリとベクトルインデックス間の意味的類似性に基づくスコア。スコアが高いほど、ベクトル埋め込みを使った概念的または意味ベースの一致が強いことを示します。
- テキストマッチ
クエリとテキストインデックス間のキーワード/語彙の類似性に基づくスコア。スコアが高いほど、キーワードの完全一致またはあいまい一致が強いことを示します。
応答形式¶
コンポーネントスコアを有効にすると、すべてのCortex Searchクエリに対して次のスコアリング情報が返されます。Cortex Searchクエリ構文の詳細については、 Cortex Search Serviceにクエリする をご参照ください。
{
"results": [
{
"@scores": {
"cosine_similarity": <cosine_similarity_score>,
"text_match": <text_match_score>
}
}
]
}
スコアフィールド¶
@scores.cosine_similarity:クエリとベクトルインデックスの値とのコサイン類似性スコア([-1, 1]の範囲)。@scores.text_match:クエリとテキストインデックスの値のテキスト一致スコア。このスコアは無制限で、その範囲はクエリに依存します。
使用上の注意¶
cosine_similarityスコアは次のとおりです。VECTOR INDEX を含むクエリに対して返されます。
範囲[-1, 1]で囲まれ、異なるクエリ間で比較可能です。
多くの場合、検索品質を向上させるプレフィックスを各クエリの前に付加した後に計算されます。このプレフィックスはモデルによって異なりますが、一般的には
Represent this sentence for searching relevant passages: {query}のようになります。返されるコサイン類似性スコアは、プレフィックスを持つクエリとベクトルインデックスの値とのコサイン類似性です。
text_matchスコアは次のとおりです。TEXT INDEX を含むクエリに対して返されます。
text_matchスコアは無制限です。異なるクエリ間では比較できません。たとえば、あるクエリに対する結果のテキストマッチスコア0.95は、同じサービスに対する別のクエリの結果のテキストマッチスコア0.95とは比較になりません。
@scores値は、weightsパラメーターによる影響を受けません。重みは、結果の最終的な順序にのみ影響します。
