メインコンテンツまでスキップ

Decay Ranker の概要

従来のベクトル検索では、結果はベクトルの類似性だけでランク付けされます。つまり、数学空間でベクトルがどれだけ近いかによって決まります。しかし、実際のアプリケーションでは、コンテンツが真に関連性の高いものになるかどうかは、意味的な類似性だけでは決まらないことがよくあります。

次のような日常的なシナリオを考えてみましょう。

  • 昨日の記事が、3 年前の類似記事よりも上位にランク付けされるべきニュース検索

  • 5 分で行ける店舗を、車で 30 分かかる店舗よりも優先するレストラン検索

  • 検索クエリとの類似性がわずかに低くても、トレンドの商品を上位に表示する e コマースプラットフォーム

これらのシナリオには共通のニーズがあります。それは、ベクトルの類似性と、時間・距離・人気といった他の数値的要因のバランスを取ることです。

Zilliz Cloud の Decay Ranker は、数値フィールドの値に基づいて検索ランキングを調整することで、このニーズに対応します。これにより、ベクトルの類似性と、データの「新しさ」「近さ」、その他の数値的特性のバランスを取ることができ、より直感的で文脈に合った検索エクスペリエンスを実現できます。

使用上の注意​

  • Decay ランキングはグループ化検索と併用できません。

  • Decay ランキングに使用するフィールドは数値型(INT8、INT16、INT32、INT64、FLOAT、DOUBLE)である必要があります。

  • 各 Decay Ranker で使用できる数値フィールドは 1 つだけです。

  • 時間単位の一貫性: 時間ベースの Decay ランキングを使用する場合、origin、scale、offset パラメーターの単位は、コレクションデータで使用されている単位と一致している必要があります。

    • コレクションがタイムスタンプを 秒 で保存している場合は、すべてのパラメーターに秒を使用します

    • コレクションがタイムスタンプを ミリ秒 で保存している場合は、すべてのパラメーターにミリ秒を使用します

    • コレクションがタイムスタンプを マイクロ秒 で保存している場合は、すべてのパラメーターにマイクロ秒を使用します

仕組み​

Decay ランキングは、時間や地理的距離などの数値的要因をランキングプロセスに組み込むことで、従来のベクトル検索を強化します。プロセス全体は次の段階で構成されます。

ステップ 1: 正規化された類似度スコアを計算する​

まず、Zilliz Cloud は一貫した比較を可能にするために、ベクトル類似度スコアを計算して正規化します。

  • L2 および JACCARD 距離メトリクスの場合(値が小さいほど類似度が高い):

    plaintext
    normalized_score = 1.0 - (2 × arctan(score))/π

    これにより、距離が 0-1 の類似度スコアに変換されます。値が大きいほど良い結果となります。

  • IP、COSINE、BM25 メトリクスの場合(スコアが高いほど既に良い一致を示す): スコアは正規化せずにそのまま使用されます。

ステップ 2: Decay スコアを計算する​

次に、Zilliz Cloud は、選択した Decay Ranker を使用して、数値フィールドの値(タイムスタンプや距離など)に基づいて Decay スコアを計算します。

  • 各 Decay Ranker は、生の数値を 0-1 の正規化された関連性スコアに変換します

  • Decay スコアは、理想的なポイントからの「距離」に基づいて項目がどれだけ関連しているかを表します

具体的な計算式は Decay Ranker のタイプによって異なります。Decay スコアの計算方法の詳細については、Gaussian Decay、Exponential Decay、Linear Decay の専用ページを参照してください。

ステップ 3: 最終スコアを計算する​

最後に、Zilliz Cloud は正規化された類似度スコアと Decay スコアを組み合わせて、最終的なランキングスコアを生成します。

plaintext
final_score = normalized_similarity_score × decay_score

ハイブリッド検索(複数のベクトルフィールドを組み合わせる検索)の場合、Zilliz Cloud は検索リクエスト間で最大の正規化類似度スコアを採用します。

plaintext
final_score = max([normalized_score₁, normalized_score₂, ..., normalized_scoreₙ]) × decay_score

たとえば、ハイブリッド検索で、ある研究論文がベクトル類似度から 0.82、BM25 ベースのテキスト検索から 0.91 のスコアを得た場合、Zilliz Cloud は Decay 係数を適用する前の基準類似度スコアとして 0.91 を使用します。

Decay ランキングの実例​

実際のシナリオで Decay ランキングを見てみましょう。ここでは、時間ベースの Decay を使用して "AI research papers" を検索します。

Notes

この例では、Decay スコアは時間の経過とともに関連性がどれだけ低下するかを表します。新しい論文ほど 1.0 に近いスコアを受け取り、古い論文ほど低いスコアを受け取ります。これらの値は特定の Decay Ranker を使用して計算されます。詳細については、適切な Decay Ranker を選択する を参照してください。

論文ベクトル類似度正規化類似度スコア公開日Decay スコア最終スコア最終ランク
論文 A高0.85 (COSINE)2 週間前0.800.68#2
論文 B非常に高い0.92 (COSINE)6 か月前0.450.41#3
論文 C中0.75 (COSINE)1 日前0.980.74#1
論文 D中~高0.76 (COSINE)3 週間前0.700.53#4

Decay リランキングを行わない場合、純粋なベクトル類似度(0.92)に基づくと論文 B が最も上位にランク付けされます。しかし、Decay リランキングを適用すると次のようになります。

  • 論文 C は、類似度が中程度であるにもかかわらず、非常に新しい(昨日公開)ため、1 位に浮上します

  • 論文 B は、類似度が非常に高いにもかかわらず、比較的古いため、3 位に下落します

  • 論文 D は L2 距離(値が小さいほど良い)を使用するため、Decay を適用する前にスコアが 1.2 から 0.76 に正規化されます

適切な Decay Ranker を選択する​

Zilliz Cloud では、それぞれ特定のユースケース向けに設計された個別の Decay Ranker(gauss、exp、linear)を提供しています。

Decay Ranker

特性

理想的なユースケース

シナリオ例

Gaussian(gauss)

自然に感じられる緩やかな低下が、ほどよく広範囲に及ぶ

  • バランスの取れた結果が求められる一般的な検索

  • ユーザーが距離を直感的に把握できるアプリケーション

  • 中程度の距離が結果に大きなペナルティを与えるべきでない場合

レストラン検索では、3 km 先の優良店舗も、近くの候補より下位にはなるものの、引き続き発見できます

Exponential(exp)

最初は急速に低下しますが、長い裾を維持する

  • 新しさが重要なニュースフィード

  • 新鮮なコンテンツが優先されるべきソーシャルメディア

  • 近さが強く好まれる一方で、例外的に遠い項目も引き続き表示されるべき場合

ニュースアプリでは、昨日の記事が 1 週間前のコンテンツよりはるかに上位にランク付けされますが、非常に関連性の高い古い記事も引き続き表示される可能性があります

Linear(linear)

明確なカットオフを伴う、一貫性があり予測可能な低下

  • 自然な境界があるアプリケーション

  • 距離制限のあるサービス

  • 有効期限や明確なしきい値があるコンテンツ

イベント検索では、2 週間より先のイベントはまったく表示されません

各 Decay Ranker がスコアを計算する方法と、具体的な低下パターンの詳細については、専用のドキュメントを参照してください。

実装例​

Decay Ranker は、Zilliz Cloud の標準ベクトル検索とハイブリッド検索の両方に適用できます。以下に、この機能を実装するための主要なコードスニペットを示します。

Notes

Decay 関数を使用する前に、まず Decay 計算に使用する適切な数値フィールド(タイムスタンプ、距離など)を含むコレクションを作成する必要があります。コレクションのセットアップ、スキーマ定義、データ挿入を含む完全な動作例については、Tutorial: Implement Time-based Ranking in Milvus を参照してください。

Decay Ranker を作成する​

Decay ランキングを実装するには、まず適切な構成で Function オブジェクトを定義します。

python
from pymilvus import Function, FunctionType
import datetime

# Create a decay function for timestamp-based decay
# Note: All time parameters must use the same unit as your collection data
rerank = Function(
name="time_decay", # Function identifier
input_field_names=["timestamp"], # Numeric field to use for decay
function_type=FunctionType.RERANK, # Must be set to RERANK for decay rankers
params={
"reranker": "decay", # Specify decay reranker. Must be "decay"
"function": "gauss", # Choose decay function type: "gauss", "exp", or "linear"
"origin": int(datetime.datetime(2025, 1, 15).timestamp()), # Reference point (seconds)
"scale": 7 * 24 * 60 * 60, # 7 days in seconds (must match collection data unit)
"offset": 24 * 60 * 60, # 1 day no-decay zone (must match collection data unit)
"decay": 0.5 # Half score at scale distance
}
)

パラメーター

必須

説明

値/Example

name

はい

検索の実行時に使用する関数の識別子です。ユースケースに合ったわかりやすい名前を選択してください。

"time_decay"

input_field_names

はい

Decay スコアの計算に使用する数値フィールドです。Decay の計算に使用するデータ属性を決定します(例: 時間ベースの Decay ではタイムスタンプ、位置ベースの Decay では座標)。

関連する数値を含む、コレクション内のフィールドである必要があります。INT8/16/32/64, FLOAT, DOUBLE をサポートします。

["timestamp"]

function_type

はい

作成する関数のタイプを指定します。

すべての Decay Ranker で RERANK に設定する必要があります。

FunctionType.RERANK

params.reranker

はい

使用するリランキング方法を指定します。

Decay ランキング機能を有効にするには、"decay" に設定する必要があります。

"decay"

params.function

はい

適用する数学的な Decay Ranker を指定します。関連性の低下の曲線形状を決定します。

適切な関数の選択については、適切な Decay Ranker を選択するセクションを参照してください。

"gauss"、"exp"、または "linear"

params.origin

はい

Decay スコアの計算の基準となる参照点です。この値にある項目は最大の関連性スコアを受け取ります。

時間ベースの Decay では、時間単位をコレクションデータと一致させる必要があります。

  • タイムスタンプの場合: 現在時刻(例: int(time.time()))

  • 地理位置の場合: ユーザーの現在の座標

params.scale

はい

関連性が decay の値まで低下する距離または時間です。関連性がどれだけ速く低下するかを制御します。

時間ベースの Decay では、時間単位をコレクションデータと一致させる必要があります。

値が大きいほど関連性の低下が緩やかになり、値が小さいほど低下が急になります。

  • 時間の場合: 秒単位の期間(例: 7 日間を表す 7 * 24 * 60 * 60)

  • 距離の場合: メートル(例: 5km を表す 5000)

params.offset

いいえ

origin の周囲に「no-decay ゾーン」を作成し、その範囲内の項目は満点のスコア(decay スコア = 1.0)を維持します。

時間ベースの Decay では、時間単位をコレクションデータと一致させる必要があります。

origin からこの範囲内にある項目は、最大の関連性を維持します。

  • 時間の場合: 秒単位の期間(例: 1 日間を表す 24 * 60 * 60)

  • 距離の場合: メートル(例: 500m を表す 500)

params.decay

いいえ

scale の距離におけるスコア値で、曲線の急峻さを制御します。値が小さいほど低下曲線が急になり、値が大きいほど低下曲線が緩やかになります。

0 から 1 の間である必要があります。

0.5(デフォルト)

Decay Ranker を定義したら、検索操作時に ranker パラメーターに渡すことで適用できます。

python
# Use the decay function in standard vector search
results = milvus_client.search(
collection_name,
data=[your_query_vector], # Replace with your query vector
anns_field="vector_field",
limit=10,
output_fields=["document", "timestamp"], # Include the decay field in outputs to see values
ranker=rerank, # Apply the decay ranker here
consistency_level="Strong"
)