#381 添加rootsessionid尾号实验

Обединени
jiachanghui обедини 3 ревизии от algorithm/feature_20260123_zhaohaipeng_root_session_id_exp във algorithm/master преди 4 дни

+ 16 - 0
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/model/RootSessionIdExpConfig.java

@@ -0,0 +1,16 @@
+package com.tzld.piaoquan.recommend.server.model;
+
+import lombok.Data;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@Data
+public class RootSessionIdExpConfig {
+
+    private Set<String> tail = new HashSet<>();
+
+    private Set<Integer> appType = new HashSet<>();
+
+    private String expCode;
+}

+ 37 - 1
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/RankRouter.java

@@ -1,9 +1,12 @@
 package com.tzld.piaoquan.recommend.server.service.rank;
 
+import com.ctrip.framework.apollo.spring.annotation.ApolloJsonValue;
+import com.tzld.piaoquan.recommend.server.model.RootSessionIdExpConfig;
 import com.tzld.piaoquan.recommend.server.service.ServiceBeanFactory;
 import com.tzld.piaoquan.recommend.server.service.rank.strategy.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -13,6 +16,10 @@ import java.util.*;
 @Service
 @Slf4j
 public class RankRouter {
+
+    @ApolloJsonValue("${rank.root.session.id.exp.config:[]}")
+    private List<RootSessionIdExpConfig> rootSessionIdExpConfigs;
+
     @Value("${rank.strategy.default:567}")
     private String rankStrategyDefault;
 
@@ -51,11 +58,17 @@ public class RankRouter {
             return strategyMap.get(relevantRank).rank(param);
         }
 
+        // 裂变层实验,使用RootSessionId尾号进行实验
+        String rootSessionIdExpCode = this.findRootSessionIdExpCode(param);
+        if (StringUtils.isNotBlank(rootSessionIdExpCode) && strategyMap.containsKey(rootSessionIdExpCode)) {
+            return strategyMap.get(rootSessionIdExpCode).rank(param);
+        }
+
         Set<String> abExpCodes = param.getAbExpCodes();
         if (CollectionUtils.isNotEmpty(abExpCodes)) {
             for (Map.Entry<String, RankService> entry : strategyMap.entrySet()) {
                 if (abExpCodes.contains(entry.getKey())) {
-                    //log.info("rank strategies {} {}", entry.getKey(), entry.getValue().getClass().getSimpleName());
+                    // log.info("rank strategies {} {}", entry.getKey(), entry.getValue().getClass().getSimpleName());
                     return entry.getValue().rank(param);
                 }
             }
@@ -74,5 +87,28 @@ public class RankRouter {
         }
     }
 
+    private String findRootSessionIdExpCode(RankParam param) {
+        String expCode = "";
+        if (CollectionUtils.isEmpty(rootSessionIdExpConfigs)) {
+            return expCode;
+        }
+
+        String rootSessionId = param.getRootSessionId();
+        if (StringUtils.isBlank(rootSessionId)) {
+            return expCode;
+        }
+
+        int appType = param.getAppType();
+        String tail = rootSessionId.substring(rootSessionId.length() - 1);
+        for (RootSessionIdExpConfig config : rootSessionIdExpConfigs) {
+            if (config.getAppType().contains(appType)
+                    && config.getTail().contains(tail)
+                    && strategyMap.containsKey(config.getExpCode())) {
+                return config.getExpCode();
+            }
+        }
+
+        return expCode;
+    }
 }
 

+ 13 - 9
recommend-server-service/src/main/java/com/tzld/piaoquan/recommend/server/service/rank/strategy/RankStrategy4RegionMergeModelV565.java

@@ -109,12 +109,13 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
 
         // 4. 排序模型计算
         Map<String, Float> sceneFeatureMap = new HashMap<>(0);
-        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20250729.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
+        List<RankItem> items = ScorerUtils.getScorerPipeline("feeds_score_config_fm_xgb_20260116.conf").scoring(sceneFeatureMap, userFeatureMap, userFeatureMap, rankItems);
 
         // 5. 排序公式特征
         double xgbRovNegRate = mergeWeight.getOrDefault("xgbRovNegRate", 0.059);
         double xgbNorPowerWeight = mergeWeight.getOrDefault("xgbNorPowerWeight", 1.22);
         double xgbNorPowerExp = mergeWeight.getOrDefault("xgbNorPowerExp", 1.15);
+        double rosMinusAlpha = mergeWeight.getOrDefault("rosMinusAlpha", 1.1);
         Map<String, Map<String, String>> vid2MapFeature = this.getVideoRedisFeature(vids, "redis:vid_hasreturn_vor:");
 
         // 获取权重
@@ -132,29 +133,25 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
 
         List<Video> result = new ArrayList<>();
         for (RankItem item : items) {
-            String vidMergeCate2 = this.findVideoMergeCate2(videoBaseInfoMap, String.valueOf(item.getVideoId()));
-            double strPlusCalibrationCoefficient = this.calcStrPlusCalibrationCoefficientByMergeCate2(vidMergeCate2);
-
             double score;
             double fmRovOrigin = item.getScoreRov();
             item.getScoresMap().put("fmRovOrigin", fmRovOrigin);
-            double fmRovCoefficientBefore = restoreScore(fmRovOrigin, xgbRovNegRate);
-            item.getScoresMap().put("fmRovCoefficientBefore", fmRovCoefficientBefore);
-            double fmRov = fmRovCoefficientBefore * strPlusCalibrationCoefficient;
+            double fmRov = restoreScore(fmRovOrigin, xgbRovNegRate);
             item.getScoresMap().put("fmRov", fmRov);
-            item.getScoresMap().put("strPlusCalibrationCoefficient", strPlusCalibrationCoefficient);
             double hasReturnRovScore = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("rov", "0"));
+            double newRosMinusScore = scalaRosMinusScore(hasReturnRovScore, rosMinusAlpha);
             item.getScoresMap().put("hasReturnRovScore", hasReturnRovScore);
             double norXGBScore = item.getScoresMap().getOrDefault("NorXGBScore", 0d);
             double newNorXGBScore = norPowerCalibration(xgbNorPowerWeight, xgbNorPowerExp, norXGBScore);
             double vor = Double.parseDouble(vid2MapFeature.getOrDefault(item.getVideoId() + "", new HashMap<>()).getOrDefault("vor", "0"));
             item.getScoresMap().put("vor", vor);
 
+            String vidMergeCate2 = this.findVideoMergeCate2(videoBaseInfoMap, String.valueOf(item.getVideoId()));
             Double scoreCoefficient = cate2Coefficient.getOrDefault(vidMergeCate2, 0d);
             item.getScoresMap().put("scoreCoefficient", scoreCoefficient);
             item.getScoresMap().put("cate2CoefficientDenominator", cate2CoefficientDenominator);
 
-            score = fmRov * (0.1 + newNorXGBScore) * (0.1 + vor) * (1 + scoreCoefficient / cate2CoefficientDenominator);
+            score = fmRov * (0.1 + newRosMinusScore) * (0.1 + vor) * (1 + scoreCoefficient / cate2CoefficientDenominator);
 
             Video video = item.getVideo();
             video.setScore(score);
@@ -342,6 +339,13 @@ public class RankStrategy4RegionMergeModelV565 extends RankStrategy4RegionMergeM
         return baseInfo;
     }
 
+    private double scalaRosMinusScore(double rosMinusScore, double alpha) {
+        if (rosMinusScore > 0) {
+            return Math.pow(rosMinusScore, alpha);
+        }
+        return rosMinusScore;
+    }
+
     private double norPowerCalibration(double weight, double exp, double score) {
         double newScore = weight * Math.pow(score, exp);
         if (newScore > 100) {