Browse Source

feat:V569实验加recallQuotaScale (Apollo热调, 默认1.2, Math.ceil)

V569 mergeAndRankRovRecall 入口加 recallQuotaScale (默认 1.2, 从 Apollo mergeWeight 读);
18 路 extractRecall/extractOldSpecialRecall 改用私有 helper scaledQuota = (int) Math.ceil(default * scale);
ceil 保证小值路 (default=1/3) 在 scale=1.2 时也能扩 (1->2, 3->4), scale=1.0 时整数路径跟 V568 等价。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
yangxiaohui 1 day ago
parent
commit
d9fc37eb9c

+ 29 - 19
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV569.java

@@ -39,6 +39,8 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
     @Override
     public List<Video> mergeAndRankRovRecall(RankParam param) {
         Map<String, Double> mergeWeight = this.mergeWeight != null ? this.mergeWeight : new HashMap<>(0);
+        // V569 新增: 整体召回配额倍数, 每一路 recallNum 都乘以这个 scale, Apollo 热调
+        double recallQuotaScale = mergeWeight.getOrDefault("recallQuotaScale", 1.2);
 
         //-------------------融-------------------
         //-------------------合-------------------
@@ -50,41 +52,41 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
         setVideo.add(param.getHeadVid());
         List<Video> rovRecallRank = new ArrayList<>();
         // -------------------5路特殊旧召回------------------
-        RecallUtils.extractOldSpecialRecall(mergeWeight.getOrDefault("oldSpecialN", (double) param.getSize()).intValue(), param, setVideo, rovRecallRank);
+        RecallUtils.extractOldSpecialRecall(scaledQuota(mergeWeight, "oldSpecialN", (double) param.getSize(), recallQuotaScale), param, setVideo, rovRecallRank);
         //-------------------return相似召回------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("v6", 5.0).intValue(), param, ReturnVideoRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "v6", 5.0, recallQuotaScale), param, ReturnVideoRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------新地域召回------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("v1", 5.0).intValue(), param, RegionRealtimeRecallStrategyV1.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "v1", 5.0, recallQuotaScale), param, RegionRealtimeRecallStrategyV1.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------scene cf rovn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("sceneCFRovn", 5.0).intValue(), param, SceneCFRovnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "sceneCFRovn", 5.0, recallQuotaScale), param, SceneCFRovnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------scene cf rosn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("sceneCFRosn", 5.0).intValue(), param, SceneCFRosnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "sceneCFRosn", 5.0, recallQuotaScale), param, SceneCFRosnRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         // -------------------user cate1------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("cate1RecallN", 5.0).intValue(), param, UserCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "cate1RecallN", 5.0, recallQuotaScale), param, UserCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         // -------------------user cate2------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("cate2RecallN", 5.0).intValue(), param, UserCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "cate2RecallN", 5.0, recallQuotaScale), param, UserCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         // -------------------head province cate1------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate1RecallN", 3.0).intValue(), param, HeadProvinceCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "headCate1RecallN", 3.0, recallQuotaScale), param, HeadProvinceCate1RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         // -------------------head province cate2------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate2RecallN", 3.0).intValue(), param, HeadProvinceCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "headCate2RecallN", 3.0, recallQuotaScale), param, HeadProvinceCate2RecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------head cate2 of rovn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("headCate2Rov", 5.0).intValue(), param, HeadCate2RovRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "headCate2Rov", 5.0, recallQuotaScale), param, HeadCate2RovRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
         //-------------------city rovn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("cityRov", 5.0).intValue(), param, CityRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "cityRov", 5.0, recallQuotaScale), param, CityRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
         //-------------------priori province rovn------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceRov", 3.0).intValue(), param, PrioriProvinceRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "prioriProvinceRov", 3.0, recallQuotaScale), param, PrioriProvinceRovnRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
         //-------------------priori province str------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceStr", 1.0).intValue(), param, PrioriProvinceStrRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "prioriProvinceStr", 1.0, recallQuotaScale), param, PrioriProvinceStrRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
         //-------------------priori province ros------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("prioriProvinceRos", 1.0).intValue(), param, PrioriProvinceRosRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "prioriProvinceRos", 1.0, recallQuotaScale), param, PrioriProvinceRosRecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
         //-------------------return1 cate2 ros------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Ros", 5.0).intValue(), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "return1Cate2Ros", 5.0, recallQuotaScale), param, Return1Cate2RosRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
         //-------------------return1 cate2 str------------------
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("return1Cate2Str", 5.0).intValue(), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "return1Cate2Str", 5.0, recallQuotaScale), param, Return1Cate2StrRecallStrategy.PUSH_FORM, setVideo, rovRecallRank);
 
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("yearShareCate1", 5.0).intValue(), param, YearShareCate1RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("yearShareCate2", 5.0).intValue(), param, YearShareCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
-        RecallUtils.extractRecall(mergeWeight.getOrDefault("yearReturnCate2", 5.0).intValue(), param, YearReturnCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "yearShareCate1", 5.0, recallQuotaScale), param, YearShareCate1RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "yearShareCate2", 5.0, recallQuotaScale), param, YearShareCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
+        RecallUtils.extractRecall(scaledQuota(mergeWeight, "yearReturnCate2", 5.0, recallQuotaScale), param, YearReturnCate2RecallStrategy.PUSH_FROM, setVideo, rovRecallRank);
 
         // 记录召回源中的视频
         this.rankBeforePostProcessor(rovRecallRank);
@@ -458,4 +460,12 @@ public class RankStrategy4RegionMergeModelV569 extends RankStrategy4RegionMergeM
         }
         return newScore;
     }
+
+    /**
+     * V569: 读 Apollo 单路 recallNum, 再乘整体配额倍数 scale, 向上取整。
+     * ceil 保证小值路 (default=1/3) 在 scale=1.2 时也能扩 (1->2, 3->4); scale=1.0 时整数路径下 ceil 跟 cast 等价。
+     */
+    private static int scaledQuota(Map<String, Double> mergeWeight, String key, double defaultVal, double scale) {
+        return (int) Math.ceil(mergeWeight.getOrDefault(key, defaultVal) * scale);
+    }
 }