Browse Source

feat:添加ab实验助手类

zhaohaipeng 10 months ago
parent
commit
04e3133230

+ 106 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/helper/NewExpHelper.java

@@ -0,0 +1,106 @@
+package com.tzld.piaoquan.ad.engine.commons.helper;
+
+import com.google.common.reflect.TypeToken;
+import com.tzld.piaoquan.ad.engine.commons.util.JSONUtils;
+import lombok.Data;
+import org.apache.commons.collections4.CollectionUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.util.*;
+
+@Component
+public class NewExpHelper {
+    private final static Logger log = LoggerFactory.getLogger(NewExpHelper.class);
+    public static Map<String, Set<String>> appExpIdCache = new HashMap<>();
+    public static Map<String, Exp> expIdAndRangeCache = new HashMap<>();
+
+    public static String flagId;
+
+    @Value("${ad.new.exp.flag.id:0}")
+    private void setFlagId(String flagId) {
+        NewExpHelper.flagId = flagId;
+    }
+
+    @Value("${new.exp,config.v2:[]}")
+    private void setNewExpInfo(String str) {
+        List<ExpConfig> expConfigs = JSONUtils.fromJson(str, new TypeToken<List<ExpConfig>>() {
+        }, Collections.emptyList());
+        for (ExpConfig expConfig : expConfigs) {
+            String appId = expConfig.getAppType();
+            for (Layer layer : expConfig.layers) {
+                if (layer.layerId.equals("ad-server")) {
+                    Set<String> expIdSet = new HashSet<>();
+                    for (Exp exp : layer.getExps()) {
+                        expIdSet.add(exp.getExpId());
+                        expIdAndRangeCache.put(exp.getExpId(), exp);
+                    }
+                    appExpIdCache.put(appId, expIdSet);
+                }
+            }
+        }
+    }
+
+    public static boolean checkInNewExpGroup(String appId, int groupNumber, String expId) {
+        try {
+            if (appExpIdCache.get(appId) == null || !appExpIdCache.get(appId).contains(expId)) {
+                return false;
+            }
+            if (expIdAndRangeCache.get(expId).isAllEnter() && groupNumber < 0) {
+                return true;
+            }
+            return expIdAndRangeCache.get(expId).getRange()[0] <= groupNumber && expIdAndRangeCache.get(expId).getRange()[1] >= groupNumber;
+        } catch (Exception e) {
+            return false;
+        }
+    }
+
+    public static boolean checkInNewExpGroup(String appId, int groupNumber, Collection<String> expIds) {
+        if (CollectionUtils.isEmpty(expIds)) {
+            return false;
+        }
+        for (String expId : expIds) {
+            try {
+                if (appExpIdCache.get(appId) == null || !appExpIdCache.get(appId).contains(expId)) {
+                    continue;
+                }
+                if (expIdAndRangeCache.get(expId).isAllEnter() && groupNumber < 0) {
+                    return true;
+                }
+                if (expIdAndRangeCache.get(expId).getRange()[0] <= groupNumber && expIdAndRangeCache.get(expId).getRange()[1] >= groupNumber) {
+                    return true;
+                }
+            } catch (Exception e) {
+                log.warn("svc=checkInNewExpGroup appId={} groupNumber={} expId={}", appId, groupNumber, expId);
+            }
+        }
+        return false;
+    }
+
+    @Data
+    public static class ExpConfig {
+        private String appType;
+        private List<Layer> layers;
+
+    }
+
+    @Data
+    public static class Layer {
+        private String layerId;
+        private int bucketNum;
+        private List<Exp> exps;
+        private Map<String, String> groupRule;
+
+    }
+
+    @Data
+    public static class Exp {
+        private String expId;
+        private int[] range;
+        private boolean allEnter = false;
+        private Map<String, Object> param;
+    }
+
+}

+ 39 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/util/AbUtil.java

@@ -0,0 +1,39 @@
+package com.tzld.piaoquan.ad.engine.commons.util;
+
+import com.tzld.piaoquan.ad.engine.commons.helper.NewExpHelper;
+import org.apache.commons.collections4.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class AbUtil {
+
+    public static Set<String> unfoldAllExpCode(List<Map<String, String>> adAbMap) {
+        if (CollectionUtils.isEmpty(adAbMap)) {
+            return new HashSet<>();
+        }
+        return adAbMap.stream()
+                .map(m -> m.get("abExpCode"))
+                .filter(Objects::nonNull)
+                .map(Object::toString)
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     * 判断用户是否在某个实验中,包含在新实验系统和旧实验系统
+     */
+    public static boolean isInAbExp(Collection<String> expCodeSet, Object appType, int newExpGroup, String expCode) {
+        if (CollectionUtils.isEmpty(expCodeSet)) {
+            return false;
+        }
+        if (expCodeSet.contains(expCode)) {
+            return true;
+        }
+
+        if (expCodeSet.contains(NewExpHelper.flagId)) {
+            return NewExpHelper.checkInNewExpGroup(appType.toString(), newExpGroup, expCode);
+        }
+        return false;
+   }
+
+}

+ 2 - 2
ad-engine-server/src/main/java/com/tzld/piaoquan/ad/engine/server/controller/AdRecommendController.java

@@ -28,10 +28,10 @@ public class AdRecommendController {
     @RequestMapping("/top1/basic")
     public Map<String,Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request){
         AdRankItem rankResult = rankService.adItemRank(request);
-        HashMap map =new HashMap();
+        Map<String, Object> map =new HashMap<>();
         map.put("code","0");
         map.put("msg","success");
-        HashMap contentMap=new HashMap<>();
+        Map<String, Object> contentMap=new HashMap<>();
         contentMap.put("adId", rankResult.getAdId());
         contentMap.put("adScore", rankResult.getScore());
         map.put("content",contentMap);

+ 16 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/FMRankService.java

@@ -0,0 +1,16 @@
+package com.tzld.piaoquan.ad.engine.service.score;
+
+import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class FMRankService implements RankService {
+    @Override
+    public AdRankItem adItemRank(RankRecommendRequestParam request) {
+        return null;
+    }
+
+}

+ 12 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService.java

@@ -13,11 +13,19 @@ public interface RankService {
 
     AdRankItem adItemRank(RankRecommendRequestParam request);
 
-    AdRankItem adItemRankWithVideoAdThompson(RankRecommendRequestParam request);
+    default AdRankItem adItemRankWithVideoAdThompson(RankRecommendRequestParam request) {
+        return null;
+    }
 
-    AdPlatformCreativeDTO adBidRank(BidRankRecommendRequestParam request);
+    default AdPlatformCreativeDTO adBidRank(BidRankRecommendRequestParam request) {
+        return null;
+    }
 
-    AdPlatformCreativeDTO adBidRankNewPid(BidRankRecommendRequestParam request);
+    default AdPlatformCreativeDTO adBidRankNewPid(BidRankRecommendRequestParam request) {
+        return null;
+    }
 
-    List<AdRankItem> rank(ScoreParam param, UserAdFeature userAdFeature, List<AdRankItem> rankItems, String configFile);
+    default List<AdRankItem> rank(ScoreParam param, UserAdFeature userAdFeature, List<AdRankItem> rankItems, String configFile) {
+        return null;
+    }
 }

+ 24 - 7
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/RankServiceImpl.java

@@ -4,6 +4,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
 import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
+import com.tzld.piaoquan.ad.engine.commons.util.AbUtil;
 import com.tzld.piaoquan.ad.engine.service.log.LogHubService;
 import com.tzld.piaoquan.ad.engine.service.predict.helper.NewExpInfoHelper;
 import com.tzld.piaoquan.ad.engine.service.predict.param.ThresholdPredictModelParam;
@@ -21,6 +22,7 @@ import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdItemFeature;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.UserAdFeature;
+import net.sf.jsqlparser.statement.select.Pivot;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,19 +40,22 @@ import java.util.stream.Collectors;
 public class RankServiceImpl implements RankService {
 
     private final static Logger log = LoggerFactory.getLogger(RankServiceImpl.class);
-    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
-    DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
+    private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
+    private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");
+
+
     @Autowired
-    FeatureRemoteService featureRemoteService;
+    private FeatureRemoteService featureRemoteService;
     @Autowired
-    RankServiceThompsonImpl rankServiceThompson;
+    private RankServiceThompsonImpl rankServiceThompson;
     @Autowired
-    VideoAdThompsonScorerV2 videoAdThompsonScorerV2;
+    private VideoAdThompsonScorerV2 videoAdThompsonScorerV2;
     @Autowired
     private LogHubService logHubService;
-
     @Autowired
-    AdCreativeFeatureContainer adCreativeFeatureContainer;
+    private AdCreativeFeatureContainer adCreativeFeatureContainer;
+
+
     @Value("${ad.model.cpm.max:200}")
     Double cpmMax = 200d;
     @Value("${ad.model.cpm.min:30}")
@@ -60,7 +65,19 @@ public class RankServiceImpl implements RankService {
     @Value("${ad.cvr.adjusting.exp:652}")
     private String cvrAdjustingExpCode;
 
+    @Value("${fm.model.score.exp.code:680}")
+    private String fmModelScoreExpCode;
+
+    @Value("${tactics.fm.mode.score.exp.code:679}")
+    private String tacticsAndFmModelScoreExpCode;
+
     public AdRankItem adItemRank(RankRecommendRequestParam requestParam) {
+
+        Set<String> expCodeSet = AbUtil.unfoldAllExpCode(requestParam.getAdAbExpArr());
+        if (expCodeSet.contains(fmModelScoreExpCode)){
+
+        }
+
         return adItemRankOld(requestParam);
     }
 

+ 2 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/param/RankRecommendRequestParam.java

@@ -2,10 +2,12 @@ package com.tzld.piaoquan.ad.engine.service.score.param;
 
 import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import lombok.Data;
+import lombok.EqualsAndHashCode;
 
 import java.util.List;
 
 @Data
+@EqualsAndHashCode(callSuper = true)
 public class RankRecommendRequestParam extends RecommendRequestParam{
      List<AdPlatformCreativeDTO> adIdList;
 }