ソートステージは、詳細ソートステージの後に実行されます。このステージでは、アイテムのソート、多様化の適用、およびウィンドウ ルールの追加ができます。
設定方法
ソート設定は、設定概要の `SortConfs` に対応します。`SortConfs` は、複数のソートポリシーを設定できる `[]object` 構造です。PAI-Rec は、BoostScoreSort、BoostScoreByWeight、ItemRankScore、DiversityRuleSort、DPPSort、MultiRecallMixSort という組み込みポリシーを提供します。
共通のソート設定
各ソート設定は、共通設定のサブセットを使用します。このセクションでは、繰り返しを避けるためにこれらの設定について説明します。
設定例:
{
"SortConfs": [
{
"Name": "",
"SortType": ""
}
]
}フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。この名前は `SortNames` で参照できます。 |
SortType | string | はい | ソートタイプ。列挙値:
|
ブーストスコアソート (BoostScoreSort)
詳細ソートモデルが呼び出されると、各アイテムはスコアを受け取ります。ビジネス要件に基づいて、このスコアをブーストまたは降格して変更する必要がある場合があります。
ブーストまたは降格の操作は、2 つの部分で構成されます:
条件付きルールを設定します。カテゴリや性別などのアイテムまたはユーザーのプロパティを使用して、条件が満たされているかどうかを判断できます。
ブーストまたは降格の式を設定します。現在、`score × 1.2` や `score × 0.5` など、スコアの式のみを設定できます。
設定例:
{
"SortConfs": [
{
"Name": "BoostScoreSort",
"SortType": "BoostScoreSort",
"Debug": false,
"BoostScoreConditions": [
{
"Conditions": [
{
"Name": "sex",
"Domain": "item",
"Type": "string",
"Value": "gender",
"Operator": "equal"
}
],
"Expression": "score * 2"
}
]
}
]
}この設定では、`sex` フィーチャーが `male` のアイテムのスコアを 2 倍にします。
フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。 |
SortType | string | はい | ソートタイプ。静的フィールド: `BoostScoreSort`。 |
Debug | bool | いいえ | デバッグフラグ。`true` に設定すると、ブーストまたは降格前の元のスコアがアイテムの `properties` に `org_score` として記録されます。その後、リクエストでデバッグフラグを有効にして、アイテムのプロパティ値を確認できます。これはデバッグ専用であり、本番環境では有効にしないでください。 |
BoostScoreConditions | JSON 配列 | はい | スコアをブーストまたは降格するための条件付き設定。複数の条件を設定してスコアをブーストまたは降格できます。 |
| []FilterParamConfig | はい | スコアをブーストまたは降格するための条件付きルール。 |
| string | はい | スコアをブーストまたは降格する式。`score` は現在のアイテムスコアを表します。式はアイテムのプロパティを参照できます。たとえば、`item_weight` がアイテムのプロパティである場合、式を `score × item_weight` に設定できます。 |
`FilterParamConfig` の設定は次のとおりです:
フィールド | タイプ | 必須 | 説明 |
Name | string | はい | アイテムまたはユーザーのフィーチャー名。 |
Domain | string | はい | 列挙値: `item` または `user`。`Name` オプションがアイテムのフィーチャーかユーザーのフィーチャーかを指定します。名前はアイテムまたはユーザーの `properties` にある必要があります。 |
Operator | string | はい | 列挙値: `equal`、`not_equal`、`in`、`not_in`、`greater`、`greaterThan`、`less`、`lessThan`、`contains`、または `not_contains`。 |
Type | string | はい | 特徴のタイプ。 |
Value | object | はい | 特徴の値。 |
詳細については、「カウント調整フィルター (AdjustCountFilter)」をご参照ください。
重みによるスコアのブースト (BoostScoreByWeight)
アイテムのスコアをブーストまたは降格する場合、アイテムごとに異なる重みを持つことができます。重みはアイテムテーブルのフィールドであり、スコアの調整に使用されます。
スコアの数式: `weight × item.score`
設定例:
{
"SortConfs": [
{
"Name": "BoostScoreByWeight",
"SortType": "BoostScoreByWeight",
"TimeInterval": 172800,
"BoostScoreByWeightDao": {
"AdapterType": "hologres",
"HologresName": "pai_rec",
"HologresTableName": "test",
"ItemFieldName": "item_id",
"WeightFieldName": "weight"
}
}
]
}BoostScoreByWeightDao
フィールド | タイプ | 必須 | 説明 |
AdapterType | string | はい | データソースのタイプ。現在、`hologres` のみがサポートされています。 |
HologresName | string | はい | データソース設定 (`HologresConfs`) で設定された Hologres インスタンスのカスタム名。データソース設定の `holo_info` など。 |
HologresTableName | string | はい | Hologres のアイテム重みテーブルの名前。 |
ItemFieldName | string | はい | アイテム重みテーブルのプライマリキー。 |
WeightFieldName | string | はい | アイテム重みテーブルの重みフィールド。 |
アイテムランクスコア (ItemRankScore)
`ItemRankScore` は、スコアに基づいてアイテムを降順にソートします。この機能は DPI エンジンに組み込まれており、`SortNames` で直接使用できます。
多様性ルールソート (DiversityRuleSort)
レコメンデーション結果を出力する際には、ユーザーの興味だけでなく、アイテムの多様性も考慮します。これにより、異なるカテゴリやプロパティを持つアイテムをミックスして出力できます。
ルールは次のように設定できます:
レコメンデーションの多様性ルール
用語集:
多様化ディメンション: 多様化に使用されるアイテムのプロパティ (カテゴリ、作成者、タグなど)。
多様化ポリシー:
最小間隔 k: 特定の多様化ディメンションのアイテムは、最大 k 回連続して出現できます。
最大頻度 m: サイズ n のウィンドウ内で、同じ多様化ディメンションのアイテムは m 回を超えて出現できません。
多様化ロジック:
多様化ルールは、単一リクエストの結果にのみ適用されます。リクエスト間の多様性は考慮されません。
複数の多様化ディメンションを設定できます。
各多様化ディメンションに対して、それぞれ異なるパラメーター (k、m、n) を持つ複数の多様化ポリシーを設定できます。
設定例:
{
"SortConfs": [
{
"Name": "DiversityRuleSort",
"SortType": "DiversityRuleSort",
"DiversitySize": 100,
"DiversityRules": [
{
"Dimensions": ["spfl"],
"WindowSize": 10,
"FrequencySize": 1
}
],
"ExcludeRecalls": [
"ColdStartVideoVectorRecall",
"LinUcbRecall_default2"
],
"Conditions": [
{
"Name": "spflPick",
"Domain": "user",
"Type": "string",
"Value": "",
"Operator": "equal"
}
]
}
]
}このソートは `ExcludeRecalls` パラメーターと一緒に使用する必要があります。
DiversityRules
フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。 |
SortType | string | はい | ソートタイプ。静的フィールド: `DiversityRuleSort`。 |
DiversitySize | int | いいえ | 多様化するアイテムの数。デフォルト値はリクエストの `size` です。 |
Conditions | []FilterParamConfig | いいえ | 多様化ルールの条件。多様化ルールは、ユーザーのプロパティが特定の条件を満たす場合にのみ適用されます。詳細については、「条件付きマッチングの演算子の例」をご参照ください。ここでの条件はユーザーのプロパティに基づいて設定されるため、`Domain` を `user` に設定する必要があります。 |
ExcludeRecalls | []string | いいえ | 多様性ソートから除外するリコール ID のリスト。 |
DiversityRules | JSON 配列 | はい | 多様化ルール。複数のルールを設定できます。 |
| []string | はい | 多様化に使用するアイテムのプロパティ。 |
| int | はい | 同じディメンションのアイテムが連続して出現する回数を制御します。これは前述の k 値です。 |
| int | いいえ | ウィンドウサイズ。これは前述の n 値です。 |
| int | いいえ | ウィンドウ内での繰り返し回数。これは前述の m 値です。 |
| int | いいえ | 多様性ルールの重み。 |
ExclusionRules | json array | いいえ | 除外ルール。条件を満たす特定のアイテムを特定の位置から除外します。 |
| []int | はい | アイテムの出力位置。1 から始まります。リクエストの `size` が 10 の場合、位置は 1, 2, 3, ..., 10 となります。 |
| []FilterParamConfig | はい | ルール条件。詳細については、「条件付きマッチングの演算子の例」をご参照ください。これらは主にアイテムのプロパティに対して設定されます。 |
ExploreItemSize | int | いいえ | デフォルトでは、候補セットの最初のアイテムが多様化ルールを満たさない場合、検索は完了するまで続行されます。このパラメーターは、検索する候補セットのサイズを制御します。この値を超えると、検索は停止します。 |
除外ルールと検索深度については、次の例を参照してください。
`tag=t1` の条件を満たすアイテムは、出力位置 1, 2, 3, 4 には表示されません。位置 1, 2, 3, 4 に表示されるアイテムは、多様化ルールに準拠する必要がありますが、`tag=t1` を持つことはできません。
{
"Name": "DiversityRuleSort",
"SortType": "DiversityRuleSort",
"DiversityRules": [
{
"Dimensions": [
"tag"
],
"WindowSize": 5,
"FrequencySize": 1
}
],
"ExclusionRules": [
{
"Positions": [
1,2,3,4
],
"Conditions": [
{
"Name": "tag",
"Domain": "item",
"Type": "string",
"Value": "t1",
"Operator": "equal"
}
]
}
],
"ExploreItemSize" : 200
}多様性ルールを満たすアイテムを検索する場合、デフォルトではすべてのルールを満たすアイテムのみが出力されます。いずれかの多様性ルールが満たされない場合、システムはすべてのルールを満たすアイテムが見つかるまで次のアイテムを検索します。候補セット内にすべてのルールを満たすアイテムがない場合、最初に検索されたアイテムが出力対象として選択されます。
別のポリシーも利用できます。多様性ルールに重みを追加できます。候補セット内にすべてのルールを満たすアイテムがない場合、最も高い合計重みを持つルールを満たすアイテムが出力対象として選択されます。複数のアイテムが同じ最も高い合計重みを持つ場合、リスト内で最も早く出現するアイテムが選択されます。
重み付きの設定については、次の例を参照してください:
{
"Name": "DiversityRuleSort",
"SortType": "DiversityRuleSort",
"DiversityRules": [
{
"Dimensions": [
"tag"
],
"WindowSize": 5,
"FrequencySize": 1,
"Weight": 1
},
{
"Dimensions": [
"category"
],
"WindowSize": 3,
"FrequencySize": 1,
"Weight": 3
}
],
"ExclusionRules": [
{
"Positions": [
1
],
"Conditions": [
{
"Name": "tag",
"Domain": "item",
"Type": "string",
"Value": "t1",
"Operator": "equal"
}
]
}
]
}DPPSort
詳細については、「推薦多様性を向上させるための行列式点過程に基づくアルゴリズムの直感的理解」をご参照ください。
前提条件: DPP アルゴリズムを使用するには、アイテムの埋め込みベクターが必要です。これらのベクターはアイテムのコンテンツを表す必要があります。埋め込みの類似性は、行動などの他のレベルではなく、アイテムのコンテンツレベルでの類似性を表す必要があります。例:
推奨: アイテムの画像埋め込み、テキスト記述の埋め込み、またはカテゴリやプロパティなどの静的なアイテムコンテンツの組み合わせから生成された埋め込み。
非推奨: ユーザーの行動データに基づくモデルからトレーニングされた埋め込み。
本質的に、多様化したいディメンションは埋め込みに反映されている必要があります。たとえば、レコメンデーションリストに商品価格ディメンションの多様性を持たせたい場合、埋め込みベクターを取得するためにモデルをトレーニングする際に価格フィーチャーを含める必要があります。そうしないと、期待する効果は得られません。
設定例:
{
"SortConfs": [
{
"Name": "DPPSort",
"SortType": "DPPSort",
"DPPConf": {
"Name": "DPPSort",
"DaoConf": {
"AdapterType": "hologres",
"HologresName": "geeko_rec"
},
"TableName": "item_embedding_metric_learning",
"TableSuffixParam": "embedding_date",
"TablePKey": "product_id",
"EmbeddingColumn": "embedding",
"Alpha": 4.5,
"NormalizeEmb": "false",
"WindowSize": 10
}
}
]
}DPPConf
フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。 |
DaoConf | DaoConfig | はい | Hologres 情報を設定します。 |
TableName | string | いいえ | Hologres のアイテム埋め込みベクターテーブルの名前。`EmbeddingHookNames` が設定されていない場合は必須です。 |
TableSuffixParam | string | いいえ | 空でない場合、システムは PAI-Rec の |
TablePKey | string | いいえ | 埋め込みベクトルテーブルのプライマリキー。 |
EmbeddingColumn | string | いいえ | 埋め込みベクトルテーブルのベクトルフィールドの名前。 |
EmbeddingSeparator | string | いいえ | 埋め込みベクターの区切り文字。デフォルトはカンマです。 |
Alpha | float | はい | DPP アルゴリズムのパラメーターで、関連性と多様性のバランスを取るために使用されます。値が大きいほど関連性が高くなります。 |
CacheTimeInMinutes | int | いいえ | 埋め込みベクターをメモリにキャッシュする時間 (分)。デフォルト: 360。 |
EmbeddingHookNames | []string | いいえ | アイテムの埋め込みを生成する関数の名前。これらの関数は事前に登録されている必要があります。 |
NormalizeEmb | string | いいえ | 埋め込みベクターに対して L2 正規化を実行するかどうかを指定します。埋め込みが生成されたときに L2 正規化が既に行われている場合は、再度行う必要はありません。それ以外の場合は、これを `true` に設定します。 |
WindowSize | int | いいえ | 多様性アルゴリズムのスライディングウィンドウのサイズ。多様性はウィンドウ内でのみ保証されます。デフォルト: 10。 |
EmbMissedThreshold | float | いいえ | 埋め込みが欠落しているアイテムの割合がこの値より高い場合、エラーが報告されます。デフォルト: 0.5。 |
FilterRetrieveIds | []string | いいえ | コールドスタートアイテムなど、DPP モジュールを呼び出す必要がないアイテムのリストを指定します。 |
EnsurePositiveSim | string | いいえ | 埋め込みに基づいて計算されたアイテムの類似性が正の値であることを保証するかどうかを指定します。デフォルト: `true`。 |
CandidateCount | int | いいえ | 多様化のための候補セットのサイズ。デフォルトでは、ソートステージに入るすべてのアイテムが含まれます。候補セットを元のトップ N アイテムに制限するために、より小さい数に設定できます。 |
AbortRunCount | int | いいえ | ソートステージに入るアイテムの数がこの値より少ない場合、現在のリクエストに対して多様化は実行されません。デフォルト: 0。 |
MinScorePercent | float | いいえ | アイテムが多様化モジュールによって出力される資格を得るには、その最大正規化されたソートスコアがこの値より大きい必要があります。デフォルト: 0。 |
SSDSort
詳細については、「推薦結果の多様性を向上させる: MMR/DPP/SSD の原理分析」をご参照ください。
前提条件: SSD アルゴリズムを使用するには、アイテムの埋め込みベクターが必要です。これらのベクターはアイテムのコンテンツを表す必要があります。埋め込みの類似性は、行動などの他のレベルではなく、アイテムのコンテンツレベルでの類似性を表す必要があります。例:
推奨: アイテムの画像埋め込み、テキスト記述の埋め込み、またはカテゴリやプロパティなどの静的なアイテムコンテンツの組み合わせから生成された埋め込み。
非推奨: ユーザーの行動データに基づくモデルからトレーニングされた埋め込み。
本質的に、多様化したいディメンションは埋め込みに反映されている必要があります。たとえば、レコメンデーションリストに商品価格ディメンションの多様性を持たせたい場合、埋め込みベクターを取得するためにモデルをトレーニングする際に価格フィーチャーを含める必要があります。そうしないと、期待する効果は得られません。
設定例:
{
"SortConfs": [
{
"Name": "SSDSort",
"SortType": "SSDSort",
"SSDConf": {
"Name": "SSDSort",
"DaoConf": {
"AdapterType": "hologres",
"HologresName": "geeko_rec"
},
"TableName": "item_embedding_metric_learning",
"TablePKey": "item_id",
"EmbeddingColumn": "embedding",
"Gamma": 0.25,
"UseSSDStar": true,
"NormalizeEmb": "false",
"MinScorePercent": 0.1,
"CandidateCount": 200,
"WindowSize": 5
}
}
]
}SSDConf
フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。 |
DaoConf | DaoConfig | はい | Hologres 情報を設定します。 |
TableName | string | いいえ | Hologres のアイテム埋め込みベクターテーブルの名前。`EmbeddingHookNames` が設定されていない場合は必須です。 |
TableSuffixParam | string | いいえ | 空でない場合、システムは PAI-Rec の |
TablePKey | string | いいえ | 埋め込みベクターテーブルのプライマリキー。 |
EmbeddingColumn | string | いいえ | 埋め込みベクターテーブルのベクターフィールドの名前。 |
EmbeddingSeparator | string | いいえ | 埋め込みベクターの区切り文字。デフォルトはカンマです。 |
Gamma | float | はい | SSD アルゴリズムのパラメーターで、関連性と多様性のバランスを取るために使用されます。値が大きいほど多様性が高くなります。 |
UseSSDStar | bool | いいえ | SSD の論文で言及されている最適化アルゴリズムを有効にするかどうかを指定します。デフォルト: `false`。有効にすることをお勧めします。 |
CacheTimeInMinutes | int | いいえ | 埋め込みベクターをメモリにキャッシュする時間 (分)。デフォルト: 360。 |
EmbeddingHookNames | []string | いいえ | アイテムの埋め込みを生成する関数の名前。これらの関数は事前に登録されている必要があります。 |
NormalizeEmb | string | いいえ | 埋め込みベクターに対して L2 正規化を実行するかどうかを指定します。埋め込みが生成されたときに L2 正規化が既に行われている場合は、再度行う必要はありません。それ以外の場合は、これを `true` に設定します。 |
WindowSize | int | いいえ | 多様性アルゴリズムのスライディングウィンドウのサイズ。多様性はウィンドウ内のアイテムリストでのみ保証されます。デフォルト: 5。 |
EmbMissedThreshold | float | いいえ | 埋め込みが欠落しているアイテムの割合がこの値より高い場合、エラーが報告されます。デフォルト: 0.5。 |
FilterRetrieveIds | []string | いいえ | コールドスタートアイテムなど、SSD モジュールを呼び出す必要がないアイテムのリストを指定します。 |
EnsurePositiveSim | string | いいえ | 埋め込みに基づいて計算されたアイテムの類似性が正の値であることを保証するかどうかを指定します。デフォルト: `true`。 |
CandidateCount | int | いいえ | 多様化のための候補セットのサイズ。デフォルトでは、ソートステージに入るすべてのアイテムが含まれます。候補セットを元のトップ N アイテムに制限するために、より小さい数に設定できます。 |
AbortRunCount | int | いいえ | ソートステージに入るアイテムの数がこの値より少ない場合、現在のリクエストに対して多様化は実行されません。デフォルト: 0。 |
MinScorePercent | float | いいえ | アイテムが多様化モジュールによって出力される資格を得るには、その最大正規化されたソートスコアがこの値より大きい必要があります。デフォルト: 0。 |
マルチチャネルリコールソート (MultiRecallMixSort)
通常、多くのリコールチャネルがあります。ビジネス要件によっては、リコールタイプに基づいて出力をミックスする必要があります。例:
コールドスタートリコールには露出量の要件があります。
特定のリコールチャネルには位置の要件があります。
これには、複数のミキシングルールが含まれる場合もあります。
設定は次のとおりです:
{
"SortConfs": [
{
"Name": "MixSort",
"SortType": "MultiRecallMixSort",
"RemainItem": false,
"MixSortRules": [
{
"MixStrategy": "random_position",
"NumberRate": 0.1,
"RecallNames": [
"OTSGlobalHot"
]
},
{
"MixStrategy": "fix_position",
"Positions": [1,3,5],
"RecallNames": [
"RecallName1"
]
}
]
}
]
}リコール名を使用してアイテムをマッチングおよびフィルタリングするだけでなく、条件付きフィルタリングを使用して露出するアイテムを選択することもできます。
{
"SortConfs": [
{
"Name": "MixSortByItemFeature",
"SortType": "MultiRecallMixSort",
"RemainItem": false,
"MixSortRules": [
{
"MixStrategy": "random_position",
"NumberRate": 0.1,
"Conditions": [
{
"Name": "gender",
"Domain": "item",
"Type": "string",
"Value": "man",
"Operator": "equal"
}
]
}
]
}
]
}フィールド | タイプ | 必須 | 説明 |
Name | string | はい | カスタムのソート名。 |
SortType | string | はい | ソートタイプ。静的フィールド: `MultiRecallMixSort`。 |
RemainItem | bool | いいえ | すべてのアイテムを保持するかどうかを指定します。たとえば、処理するアイテムが 500 個あるが、リクエストサイズが 30 の場合、これを `false` に設定すると、ミックスされた結果のみが保持されます。`true` に設定すると、残りのアイテムも保持されますが、30 個のミックスされたアイテムの後に配置されます。これにより、後続のソートステージでさらなる制御と処理が可能になります。 |
MixSortRules | JSON 配列 | はい | ミキシングルール。複数のルールを設定できます。 |
| string | はい | ミキシングポリシー。列挙値: `random_position` または `fix_position`。
|
| []int | いいえ | `MixStrategy` が `fix_position` の場合、`Positions` を指定する必要があります。位置は 1 から始まります。 |
| string | いいえ | `MixStrategy` が `fix_position` の場合、アイテムのプロパティフィールドから位置を取得できます。`Positions` と `PositionField` は相互に排他的です。どちらか一方しか設定できません。 |
| int | いいえ | 数量の絶対値。 |
| float | いいえ | ミックスされたアイテムの割合。これは `MixStrategy` が `random_position` の場合にのみ設定されます。有効な値は 0 から 1 です。具体的な数は `request_size × NumberRate` で計算されます。 |
| []string | いいえ | リコールチャネルの名前。複数の名前を設定できます。複数の名前が設定されている場合、それらは設定を共有します。ただし、使用される特定のリコールチャネルは固定されていません。順序は、このソートステージに入るときの位置によって決まります。 |
| []FilterParamConfig | いいえ | マッチング条件を満たすアイテムがミックスされます。詳細については、「条件付きマッチングの演算子の例」をご参照ください。 |
使用方法
ソート設定はリコール設定に似ています。設定後、さまざまなシナリオで使用するために `SortNames` パラメーターを提供します。`SortNames` は `Map[string]object` 構造で、キーはシナリオであり、各シナリオは一連のソートポリシーに対応します。
{
"SortNames": {
"${scene_name}": [
"ItemRankScore"
]
}
}`${scene_name}` はシナリオ名です。複数のシナリオで同じ設定を使用したい場合は、`default` を使用できます。
`ItemRankScore`: このパラメーターは、`SortConfs` で定義されたソートのカスタム名です。