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

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: 減衰スコアを計算する​

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

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

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

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

ステージ 3: 最終スコアを計算する​

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

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 は減衰係数を適用する前に 0.91 を基準の類似度スコアとして使用します。

実際の Decay ランキング​

時間ベースの減衰を使用して 「AI 研究論文」 を検索する実用的なシナリオで、Decay ランキングを見てみましょう:

Notes

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

論文ベクトル類似度正規化類似度スコア公開日減衰スコア最終スコア最終順位
論文 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 再ランキングを行わない場合、論文 B は純粋なベクトル類似度(0.92)に基づいて最高位にランク付けされます。しかし、Decay 再ランキングを適用すると、次のようになります。

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

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

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

適切な Decay Ranker を選択する​

Zilliz Cloud は gauss、exp、linear という異なる Decay Ranker を提供しており、それぞれ特定のユースケース向けに設計されています。

Decay Ranker

特性

理想的なユースケース

シナリオ例

Gaussian(gauss)

自然な感覚で、適度に広がる緩やかな減少

  • バランスの取れた結果を必要とする一般的な検索

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

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

レストラン検索では、3 km 離れた良質な店舗も、近くの選択肢より下位ながら引き続き見つけることができます。

Exponential(exp)

初期は急速に減少しつつ、ロングテールを維持する性質

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

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

  • 近接性を強く優先しつつ、例外的に遠いアイテムも表示し続けるべき場合

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

Linear(linear)

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

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

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

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

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

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

実装例​

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

Notes

Decay 関数を使用する前に、まず減衰計算に使用する適切な数値フィールド(タイムスタンプ、距離など)を含むコレクションを作成する必要があります。コレクションの設定、スキーマの定義、データの挿入を含む完全な動作例については、チュートリアル: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
}
)

パラメーター

必須

説明

Value/Example

name

はい

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

"time_decay"

input_field_names

はい

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

関連する数値を含むコレクション内のフィールドである必要があります。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", or "linear"

params.origin

はい

減衰スコアの計算基準となる参照ポイントです。この値を持つアイテムは最大の関連度スコアを受け取ります。

時間ベースの減衰では、時間単位がコレクションデータと一致している必要があります。

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

  • 位置情報の場合:ユーザーの現在の座標

params.scale

はい

関連度が decay 値まで低下する距離または時間です。関連度の低下速度を制御します。

時間ベースの減衰では、時間単位がコレクションデータと一致している必要があります。

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

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

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

params.offset

いいえ

origin の周囲に「減衰なしゾーン」を作成し、その範囲内のアイテムが最大スコア(減衰スコア = 1.0)を維持するようにします。

時間ベースの減衰では、時間単位がコレクションデータと一致している必要があります。

origin を中心とするこの範囲内のアイテムは、最大の関連度を維持します。

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

  • 距離の場合:メートル(例:500 m の 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"
)