瀏覽代碼

Merge remote-tracking branch 'origin/test' into test

gufengshou1 1 年之前
父節點
當前提交
f2353ec19c

+ 1 - 1
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/redis/AlgorithmRedisHelper.java

@@ -16,7 +16,7 @@ import java.util.concurrent.TimeUnit;
 
 @Component
 public class AlgorithmRedisHelper {
-    private final static Logger log = LoggerFactory.getLogger(AdOwnRedisHelper.class);
+    private final static Logger log = LoggerFactory.getLogger(AlgorithmRedisHelper.class);
 
     private final static Long AD_FILTER_DEFAULT_EXPIRE_TIME = 30L * 24 * 60 * 60; // 排除人群(广告、计划)默认设置30天,单位秒
     private final static Long AD_FILTER_DELAY_QUEUE_EXPIRETIME = 5L * 60 * 1000; // 排除人群优化默认设置5分钟,单位毫秒

+ 17 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/impl/PredictModelServiceImpl.java

@@ -3,6 +3,7 @@ package com.tzld.piaoquan.ad.engine.service.predict.impl;
 import com.alibaba.fastjson.JSONArray;
 import com.tzld.piaoquan.ad.engine.commons.enums.AppTypeEnum;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
+import com.tzld.piaoquan.ad.engine.commons.util.DateUtils;
 import com.tzld.piaoquan.ad.engine.service.predict.config.RoiModelConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.PredictModelService;
@@ -39,7 +40,15 @@ public class PredictModelServiceImpl implements PredictModelService {
     RoiModelConfig roiModelConfig;
 
     public  Map<String,Object> adPredict(ThresholdPredictModelRequestParam requestParam){
+        //0-8不出广告
         Map<String,Object> result=new HashMap<>();
+        int hourOfDay= DateUtils.getCurrentHour();
+        if(hourOfDay<8&&hourOfDay>=0){
+            result.put("ad_predict", 1);
+            result.put("no_ad_strategy","no_ad_time");
+            return result;
+        }
+
         String[] abParamArr=abConfig.getAbParams(requestParam.getAbTestCode(),requestParam.getAbExpInfo());
         if(abParamArr==null){
             return result;
@@ -97,6 +106,14 @@ public class PredictModelServiceImpl implements PredictModelService {
     }
 
     public Map<String,Object> adRecommendPredictByRoiModel(RoiPredictModelRequestParam requestParam){
+        //0-8不出广告
+        Map<String,Object> result=new HashMap<>();
+        int hourOfDay= DateUtils.getCurrentHour();
+        if(hourOfDay<8&&hourOfDay>=0){
+            result.put("ad_predict", 1);
+            result.put("no_ad_strategy","no_ad_time");
+            return result;
+        }
         RoiThresholdPredictModelParam modelParam=new RoiThresholdPredictModelParam();
         BeanUtils.copyProperties(requestParam,modelParam);
         modelParam.setEcpm(requestParam.getAds().get(0).getEcpm());

+ 0 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/AddThresholdPredictModel.java

@@ -1,10 +1,8 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
 
-import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;

+ 0 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/BasicThresholdPredictModel.java

@@ -1,11 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
-import com.google.gson.Gson;
-import com.google.gson.reflect.TypeToken;
-import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;

+ 0 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/MultiplyThresholdPredictModel.java

@@ -1,9 +1,7 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
-import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.calculator.ThresholdPredictCalculator;
-import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdCalculateParam;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;

+ 77 - 13
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/predict/model/threshold/ScoreThresholdPredictModel.java

@@ -1,17 +1,21 @@
 package com.tzld.piaoquan.ad.engine.service.predict.model.threshold;
 
-import com.tzld.piaoquan.ad.engine.commons.redis.AdOwnRedisHelper;
+import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.redis.AlgorithmRedisHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.config.AdOutV1OnlineWeightConfig;
 import com.tzld.piaoquan.ad.engine.service.predict.constant.RuleRedisKeyConst;
 import com.tzld.piaoquan.ad.engine.service.predict.containner.ThresholdModelContainer;
 import com.tzld.piaoquan.ad.engine.service.predict.param.RuleParamHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
+import javax.annotation.PostConstruct;
 import java.text.SimpleDateFormat;
 import java.util.*;
 
+@Component
 public class ScoreThresholdPredictModel extends ThresholdPredictModel{
 
     @Autowired
@@ -35,36 +39,92 @@ public class ScoreThresholdPredictModel extends ThresholdPredictModel{
         String userScore = redisHelper.get(userKeyName);
         String itemScore = redisHelper.get(itemKeyName);
 
-        if (userScore == null || itemScore == null) {
+        //加载配置数据
+        String configKeyNamePrefix = RuleRedisKeyConst.KEY_NAME_PREFIX_AD_OUT_MODEL_CONFIG
+                + modelKey + ":" + modelParam.getAbtestId() + ":"
+//                + modelParam.getAbTestConfigTag();
+                + modelParam.getAbtestParam().get("abtest_config_tag");
+        String configKey = configKeyNamePrefix + ":config";
+        String configStr = redisHelper.get(configKey);
+        Map<String, Object> configMap = new HashMap<>();
+        String hitStrategy="model";
+        if (configStr != null) {
+            try {
+                configMap= JSONObject.parseObject(configStr);
+            } catch (Exception e) {
+                // 处理 JSON 解析异常
+                e.printStackTrace();
+                result = ThresholdModelContainer.
+                        getBasicPredictModel()
+                        .predict(modelParam);
+                hitStrategy="error";
+                result.put("hit_strategy",hitStrategy);
+                return result;
+            }
+        }
+
+
+        boolean useBackup = Boolean.valueOf((String)configMap.getOrDefault("use_backup_key","false"));
+
+
+        //有数据为空且开启兜底策略
+        if (
+                (StringUtils.isBlank(userScore) || StringUtils.isBlank(itemScore))
+                &&useBackup)
+        {
             // If offline scores are empty, fall back to baseline logic
             result = ThresholdModelContainer.
                     getBasicPredictModel()
                     .predict(modelParam);
+            hitStrategy="backup";
+            result.put("hit_strategy",hitStrategy);
             return result;
         }
-        String configKeyPrefix = RuleRedisKeyConst.KEY_NAME_PREFIX_AD_OUT_MODEL_CONFIG
-                + modelKey + ":" + modelParam.getAbtestParam().get("abtest_id") + ":"
-                + modelParam.getAbtestParam().get("abtest_config_tag");
-        String thresholdKey = configKeyPrefix + ":threshold";
-        double offlineScore = Double.parseDouble(userScore) + Double.parseDouble(itemScore);
 
+        double offlineScore ;
+        //处理空值逻辑
+        double threshold=(double)configMap.getOrDefault("threshold",0);
+        if(StringUtils.isBlank(userScore)&&StringUtils.isBlank(itemScore)){
+            itemScore="0";
+            userScore="0";
+            threshold=(double)configMap.getOrDefault("miss_threshold", 0);
+
+        }else if(StringUtils.isBlank(userScore)||StringUtils.isBlank(itemScore)){
+            boolean isUserScoreBlank=StringUtils.isBlank(userScore);
+            userScore=isUserScoreBlank?"0":userScore;
+            itemScore=isUserScoreBlank?itemScore:"0";
+            threshold=isUserScoreBlank?
+                    (double)configMap.getOrDefault("item_threshold", 0):
+                    (double)configMap.getOrDefault("user_threshold", 0);
+            hitStrategy=isUserScoreBlank?"item":"user";
+        }
+        //获取计算参数
         SimpleDateFormat hourFormat = new SimpleDateFormat("HH");
         SimpleDateFormat weekDayFormat = new SimpleDateFormat("u");
-
-
         Map<String, String> onlineFeatures = new HashMap<>();
         onlineFeatures.put("ctx_apptype", modelParam.getAppType().toString());
         onlineFeatures.put("ctx_week", weekDayFormat.format(modelParam.getDate()));
         onlineFeatures.put("ctx_hour", hourFormat.format(modelParam.getDate()));
 
+        //新模型更新权重计算
+        double rankScore = 0.0;
+        if ((Boolean) configMap.getOrDefault("use_rank_score", false)) {
+            String rankScoreKey = "rank:score1:" + modelParam.getVideoId();
+            String rankScoreStr = redisHelper.get(rankScoreKey);
+            if (rankScoreStr != null) {
+                rankScore = Double.parseDouble(rankScoreStr);
+            }
+        }
+        offlineScore=Double.parseDouble(userScore) + Double.parseDouble(itemScore);
         double onlineScore=getOlineScore(onlineFeatures);
+        double rankScoreBias = (double)configMap.getOrDefault("rank_score_bias", 0.0);
         double finalScore =getFinalScore(onlineScore,offlineScore);
-
-        String thresholdValue = redisHelper.get(thresholdKey);
-        double threshold = (thresholdValue != null) ? Double.parseDouble(thresholdValue) : 0.0;
+        double rankScoreW = (double)configMap.getOrDefault("rank_score_w", 1.0);
+        double finalScoreW = (double)configMap.getOrDefault("final_score_w", 1.0);
+        double mergeScore = finalScoreW * finalScore + rankScoreW * (rankScore + rankScoreBias);
 
         int adPredict;
-        if (finalScore < threshold) {
+        if (mergeScore < threshold) {
             // If final score is below threshold, show the ad
             adPredict = 2;
         } else {
@@ -75,10 +135,14 @@ public class ScoreThresholdPredictModel extends ThresholdPredictModel{
         result.put("user_score", userScore);
         result.put("item_score", itemScore);
         result.put("final_score", finalScore);
+        result.put("merge_score", mergeScore);
+        result.put("rank_score", rankScore);
+        result.put("rank_score_bias", rankScoreBias);
         result.put("online_score", onlineScore);
         result.put("threshold", threshold);
         result.put("ad_predict", adPredict);
         result.put("online_features", onlineFeatures);
+        result.put("hit_strategy",hitStrategy);
         return result;
     }