Browse Source

feat:添加定向打分融合

zhaohaipeng 1 year ago
parent
commit
2a0cdd63cd

+ 1 - 0
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScoreParam.java

@@ -18,6 +18,7 @@ public class ScoreParam {
     private String city;
     private String province;
     private Integer newExpGroup;
+    private String adAbGroup;
     private String pqtId;
     private Map<String, Object> extraParam = new HashMap<>();
 

+ 3 - 3
ad-engine-commons/src/main/java/com/tzld/piaoquan/ad/engine/commons/score/ScorerUtils.java

@@ -34,11 +34,11 @@ public final class ScorerUtils {
 
     public static void warmUp() {
         log.info("scorer warm up ");
-        // ScorerUtils.init(BASE_CONF);
-        // ScorerUtils.init(THOMPSON_CONF);
+        ScorerUtils.init(BASE_CONF);
+        ScorerUtils.init(THOMPSON_CONF);
         // ScorerUtils.init(BREAK_CONFIG);
         // ScorerUtils.init(SHARE0_CONFIG);
-        // ScorerUtils.init(CVR_ADJUSTING);
+        ScorerUtils.init(CVR_ADJUSTING);
         // ScorerUtils.init(VIDEO_CREATIVE_THOMPSON);
 
         ScorerUtils.init(LR_ROV_SCORE_20240626);

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

@@ -16,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController;
 
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Objects;
 
 @RestController
 @RequestMapping("/recommend")
@@ -29,26 +30,32 @@ public class AdRecommendController {
     @RequestMapping("/top1/basic")
     public Map<String, Object> adRecommendTop1Basic(@RequestBody RankRecommendRequestParam request) {
         AdRankItem rankResult = rankService.adItemRank(request);
-        Map<String, Object> map =new HashMap<>();
-        map.put("code","0");
-        map.put("msg","success");
-        Map<String, Object> contentMap=new HashMap<>();
-        contentMap.put("adId", rankResult.getAdId());
-        contentMap.put("adScore", rankResult.getScore());
-        map.put("content", contentMap);
+        Map<String, Object> map = new HashMap<>();
+
+        if (Objects.isNull(rankResult)) {
+            map.put("code", "500");
+            map.put("msg", "score error");
+        } else {
+            map.put("code", "0");
+            map.put("msg", "success");
+            Map<String, Object> contentMap = new HashMap<>();
+            contentMap.put("adId", rankResult.getAdId());
+            contentMap.put("adScore", rankResult.getScore());
+            map.put("content", contentMap);
+        }
         return map;
     }
 
     @RequestMapping("/top1/video/ad/thompson")
-    public Map<String,Object> adRecommendTop1VideoAdThompson(@RequestBody RankRecommendRequestParam request){
+    public Map<String, Object> adRecommendTop1VideoAdThompson(@RequestBody RankRecommendRequestParam request) {
         AdRankItem rankResult = rankService.adItemRankWithVideoAdThompson(request);
-        HashMap map =new HashMap();
-        map.put("code","0");
-        map.put("msg","success");
-        HashMap contentMap=new HashMap<>();
+        HashMap map = new HashMap();
+        map.put("code", "0");
+        map.put("msg", "success");
+        HashMap contentMap = new HashMap<>();
         contentMap.put("adId", rankResult.getAdId());
         contentMap.put("adScore", rankResult.getScore());
-        map.put("content",contentMap);
+        map.put("content", contentMap);
         return map;
     }
 

+ 1 - 1
ad-engine-server/src/main/resources/ad_score_config_20240626.conf

@@ -2,7 +2,7 @@ scorer-config = {
   lr-rov-score-config = {
     scorer-name = "com.tzld.piaoquan.ad.engine.service.score.VlogRovLRScorer"
     scorer-priority = 99
-    model-path = "ad_ctr_model/model_ad_ctr.txt"
+    model-path = "zhangbo/model_bkb0.txt"
   }
 
 }

+ 23 - 17
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/log/impl/LogHubServiceImpl.java

@@ -8,6 +8,7 @@ import com.tzld.piaoquan.ad.engine.service.log.LogHubService;
 import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.service.score.param.RecommendRequestParam;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +40,9 @@ public class LogHubServiceImpl implements LogHubService {
         logUploadThreadPool.execute(new Runnable() {
             @Override
             public void run() {
+
+                AdRequestContext context = param.getRequestContext();
+
                 JSONObject logMap = new JSONObject();
                 logMap.put("pqtid", param.getPqtId());
                 logMap.put("mid", param.getMid());
@@ -55,31 +59,34 @@ public class LogHubServiceImpl implements LogHubService {
                 }
                 logMap.put("expids", abExpCode);
 
-                List<JSONObject> scoreResult = new ArrayList<>();
-                for (AdRankItem rankItem : rankItems) {
-                    JSONObject json = new JSONObject();
-                    json.put("cid", rankItem.getAdId());
-                    json.put("score", rankItem.getScore());
-                    rankItem.getExt().put("weight", rankItem.getWeight());
-                    json.put("feature", rankItem.getExt());
-                    scoreResult.add(json);
-                }
-                logMap.put("scoreResult", JSON.toJSONString(scoreResult));
+                // List<JSONObject> scoreResult = new ArrayList<>();
+                // for (AdRankItem rankItem : rankItems) {
+                //     JSONObject json = new JSONObject();
+                //     json.put("cid", rankItem.getAdId());
+                //     json.put("score", rankItem.getScore());
+                //     rankItem.getExt().put("weight", rankItem.getWeight());
+                //     json.put("feature", rankItem.getExt());
+                //     scoreResult.add(json);
+                // }
+                // logMap.put("scoreResult", JSON.toJSONString(scoreResult));
 
                 AdRankItem top1 = rankItems.get(0);
                 logMap.put("cid", top1.getAdId());
                 logMap.put("score", top1.getScore());
-                JSONObject feature = new JSONObject(top1.getExt());
-                feature.put("weight", top1.getWeight());
-                logMap.put("feature", feature.toJSONString());
 
-                logMap.put("abcode", requestParam.getAdAbGroup());
+                Map<String, String> featureMap = top1.getFeatureMap();
+                featureMap.put("weight", String.valueOf(top1.getWeight()));
+                logMap.put("allFeatureMap", JSON.toJSONString(featureMap));
+
+                logMap.put("metaFeatureMap", JSON.toJSONString(top1.getMetaFeatureMap()));
+
+                logMap.put("abcode", param.getAdAbGroup());
                 logMap.put("scorestrategy", scoreStrategy);
-                logMap.put("apptype", requestParam.getAppType());
+                logMap.put("apptype", context.getApptype());
+                logMap.put("extinfo", new JSONObject());
 
                 // logMap.put("creativeList", JSON.toJSONString(adIdList));
                 // if (Objects.nonNull(requestParam.getStatisticsLog())) {
-                //     JSONObject extInfo = new JSONObject();
                 //     extInfo.put("earlyAdIds", requestParam.getStatisticsLog().getEarlyAdIds());
                 //     extInfo.put("earlyCidList", requestParam.getStatisticsLog().getEarlyCreativeIds());
                 //     extInfo.put("finalCidList", requestParam.getStatisticsLog().getFinalCreativeIds());
@@ -87,7 +94,6 @@ public class LogHubServiceImpl implements LogHubService {
                 //     extInfo.put("commonFilterAfterCidList", requestParam.getStatisticsLog().getCommonFilterAfterCreativeIds());
                 //     extInfo.put("tacticsFilterAfterAdIds", requestParam.getStatisticsLog().getTacticsFilterAfterAdIds());
                 //     extInfo.put("tacticsFilterAfterCidList", requestParam.getStatisticsLog().getTacticsFilterAfterCreativeIds());
-                //     logMap.put("extinfo", extInfo);
                 // }
 
                 aliyunLogManager.sendLog(project, logStore, "", logMap);

+ 30 - 4
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/RankService680.java

@@ -1,5 +1,6 @@
 package com.tzld.piaoquan.ad.engine.service.score;
 
+import com.alibaba.fastjson.JSON;
 import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
 import com.tzld.piaoquan.ad.engine.commons.score.ScorerPipeline;
 import com.tzld.piaoquan.ad.engine.commons.score.ScorerUtils;
@@ -37,12 +38,11 @@ public class RankService680 {
 
     private Map<String, Double> bucketsLen = new HashMap<>();
 
-    public List<AdRankItem> adItemRank(RankRecommendRequestParam request) {
+    public List<AdRankItem> adItemRank(RankRecommendRequestParam request, ScoreParam scoreParam) {
 
         long ts = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) / 1000;
 
         // 特征处理
-        ScoreParam scoreParam = RequestConvert.requestConvert(request);
         Feature feature = this.getFeature(scoreParam, request);
         Map<String, Map<String, String>> userFeature = feature.getUserFeature();
         Map<String, Map<String, String>> videoFeature = feature.getVideoFeature();
@@ -110,9 +110,35 @@ public class RankService680 {
         List<AdRankItem> items = ScorerUtils.getScorerPipeline(ScorerUtils.LR_ROV_SCORE_20240626)
                 .scoring(new HashMap<>(), userFeatureMap, adRankItems);
 
-        Collections.sort(items);
+        List<AdRankItem> results =new ArrayList<>(items.size());
+        for (AdRankItem item : items) {
+            AdRankItem result = new AdRankItem();
+            result.setAdId(item.getAdId());
+            result.setCreativeCode(item.getCreativeCode());
+            result.setAdVerId(item.getAdVerId());
+            result.setVideoId(item.getVideoId());
+            result.setLrScore(item.getLrScore());
+            result.setScore(item.getLrScore());
+            result.getFeatureMap().put("lrModelFeature", JSON.toJSONString(item.getFeatureMap()));
+            result.getFeatureMap().put("userFeature", JSON.toJSONString(userFeatureMap));
+
+            if (MapUtils.isNotEmpty(videoFeature)){
+                result.getMetaFeatureMap().putAll(videoFeature);
+            }
+            if (MapUtils.isNotEmpty(userFeature)){
+                result.getMetaFeatureMap().putAll(userFeature);
+            }
+            if (allAdVerFeature.containsKey(item.getAdVerId())){
+                result.getMetaFeatureMap().putAll(allAdVerFeature.get(item.getAdVerId()));
+            }
+            if (allCidFeature.containsKey(String.valueOf(item.getAdId()))){
+                result.getMetaFeatureMap().putAll(allCidFeature.get(String.valueOf(item.getAdId())));
+            }
+        }
+
+        Collections.sort(results);
 
-        return items;
+        return results;
     }
 
     private Feature getFeature(ScoreParam param, RankRecommendRequestParam request) {

+ 1 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/VlogRovLRScorer.java

@@ -148,6 +148,7 @@ public class VlogRovLRScorer extends BaseLRV2ModelScorer {
                 LOGGER.error("score error for doc={} exception={}", item.getVideoId(), ExceptionUtils.getFullStackTrace(e));
             }
         }
+        item.setLrScore(pro);
         return pro;
     }
 }

+ 22 - 6
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/convert/RequestConvert.java

@@ -1,31 +1,35 @@
 package com.tzld.piaoquan.ad.engine.service.score.convert;
 
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
 import com.tzld.piaoquan.ad.engine.service.score.param.RecommendRequestParam;
+import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRankItem;
 import com.tzld.piaoquan.recommend.feature.domain.ad.base.AdRequestContext;
-import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
-import com.tzld.piaoquan.ad.engine.service.score.param.RankRecommendRequestParam;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.List;
 
 public class RequestConvert {
 
-    public static ScoreParam requestConvert(RecommendRequestParam request){
-        AdRequestContext context=new AdRequestContext();
+    public static ScoreParam requestConvert(RecommendRequestParam request) {
+        AdRequestContext context = new AdRequestContext();
         context.setApptype(request.getAppType().toString());
         context.setMachineinfoBrand(request.getMachineInfo().getBrand());
         context.setMachineinfoModel(request.getMachineInfo().getModel());
         context.setMachineinfoSdkversion(request.getMachineInfo().getSdkVersion());
         context.setMachineinfoWchatversion(request.getMachineInfo().getWeChatVersion());
 
-        LocalDateTime date=LocalDateTime.now();
+        LocalDateTime date = LocalDateTime.now();
         context.setHour(String.valueOf(date.getHour()));
         context.setDay(date.format(DateTimeFormatter.ofPattern("yyyyMMdd")));
         context.setWeek(String.valueOf(date.getDayOfWeek().getValue()));
         context.setRegion(request.getRegion().replace("省", ""));
         context.setCity(request.getCity().replace("市", ""));
 
-        ScoreParam scoreParam=new ScoreParam();
+        ScoreParam scoreParam = new ScoreParam();
+        scoreParam.setAdAbGroup(request.getAdAbGroup());
         scoreParam.setRequestContext(context);
         scoreParam.setVideoId(request.getVideoId());
         scoreParam.setNewExpGroup(request.getNewExpGroup());
@@ -34,4 +38,16 @@ public class RequestConvert {
         return scoreParam;
     }
 
+    public static List<AdRankItem> adIdConvertRankItem(List<AdPlatformCreativeDTO> creativeDTOList, RecommendRequestParam request) {
+        List<AdRankItem> adRankItems = new ArrayList<>(creativeDTOList.size());
+        for (AdPlatformCreativeDTO dto : creativeDTOList) {
+            AdRankItem adRankItem = new AdRankItem();
+            adRankItem.setAdId(dto.getCreativeId());
+            adRankItem.setCreativeCode(dto.getCreativeCode());
+            adRankItem.setAdVerId(dto.getAdVerId());
+            adRankItem.setVideoId(request.getVideoId());
+            adRankItem.setWeight(dto.getWeight());
+        }
+        return adRankItems;
+    }
 }

+ 2 - 2
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/dto/AdDirectionScore.java

@@ -3,7 +3,7 @@ package com.tzld.piaoquan.ad.engine.service.score.dto;
 import lombok.Builder;
 import lombok.Data;
 
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
 
 @Data
 @Builder
@@ -12,6 +12,6 @@ public class AdDirectionScore {
     private Double exponent;
 
 
-    private ConcurrentHashMap<String, Double> scoreDetail;
+    private Map<String, String> scoreDetail;
 
 }

+ 0 - 18
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/dto/AdPlatformCreativeDTO.java

@@ -1,6 +1,5 @@
 package com.tzld.piaoquan.ad.engine.service.score.dto;
 
-import com.alibaba.fastjson.JSON;
 import lombok.Builder;
 import lombok.Data;
 import lombok.ToString;
@@ -16,8 +15,6 @@ public class AdPlatformCreativeDTO {
 
     private String adVerId;
 
-    private Integer bidType;
-
     private Double pctr;
 
     private Double pcvr;
@@ -39,19 +36,4 @@ public class AdPlatformCreativeDTO {
      */
     private AdDirectionScore adDirectionScore;
 
-    public static void main(String[] args) {
-        System.out.println(JSON.toJSONString(AdPlatformCreativeDTO.builder()
-                .creativeId(3366L)
-                .creativeCode("CREATIVE_17036704789851370")
-                .bidType(2)
-                .pctr(3.2)
-                .pcvr(1.2)
-                .cpa(40.1)
-                .bid1(1.3)
-                .bid2(2.1)
-                .ecpm1(0.1)
-                .ecpm2(0.2)
-                .build()));
-    }
-
 }

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

@@ -59,7 +59,7 @@ public class RankServiceImpl implements RankService {
     @Autowired
     private RankService680 fmRankService;
     @Autowired
-    private TacticsAndFmModelScoreRankService tacticsAndFmModelScoreRankService;
+    private TacticsAndLRModelScoreRankService tacticsAndFmModelScoreRankService;
 
     @Value("${ad.model.cpm.max:200}")
     Double cpmMax = 200d;
@@ -77,16 +77,34 @@ public class RankServiceImpl implements RankService {
     private String tacticsAndFmModelScoreExpCode;
 
     public AdRankItem adItemRank(RankRecommendRequestParam requestParam) {
-
         Set<String> expCodeSet = AbUtil.unfoldAllExpCode(requestParam.getAdAbExpArr());
         Long appType = requestParam.getAppType();
         Integer newExpGroup = requestParam.getNewExpGroup();
         if (AbUtil.isInAbExp(expCodeSet, appType, newExpGroup, fmModelScoreExpCode)) {
-            return fmRankService.adItemRank(requestParam).get(0);
-        }else if (AbUtil.isInAbExp(expCodeSet, appType, newExpGroup, tacticsAndFmModelScoreExpCode)){
-            // return tacticsAndFmModelScoreRankService.adItemRank(requestParam).get;
+            return rankBy680(requestParam);
+        } else if (AbUtil.isInAbExp(expCodeSet, appType, newExpGroup, tacticsAndFmModelScoreExpCode)) {
+            return rankBy679(requestParam);
+        } else {
+            return adItemRankOld(requestParam);
+        }
+    }
+
+    private AdRankItem rankBy680(RankRecommendRequestParam request) {
+        ScoreParam scoreParam = RequestConvert.requestConvert(request);
+        List<AdRankItem> adRankItems = fmRankService.adItemRank(request, scoreParam);
+        logHubService.scoreLogUpload(scoreParam, request.getAdIdList(), adRankItems, request, "LRModelScore", "680");
+        return adRankItems.get(0);
+    }
+
+    private AdRankItem rankBy679(RankRecommendRequestParam requestParam) {
+        ScoreParam scoreParam = RequestConvert.requestConvert(requestParam);
+        List<AdRankItem> adRankItems = tacticsAndFmModelScoreRankService.adItemRank(requestParam, scoreParam);
+        logHubService.scoreLogUpload(scoreParam, requestParam.getAdIdList(), adRankItems, requestParam, "directionAndLRModelScore", "679");
+        double score = adRankItems.get(0).getScore();
+        if (score > 0) {
+            return adRankItems.get(0);
         }
-        return adItemRankOld(requestParam);
+        return null;
     }
 
     public AdRankItem adItemRankOld(RankRecommendRequestParam request) {

+ 0 - 9
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndFmModelScoreRankService.java

@@ -1,9 +0,0 @@
-package com.tzld.piaoquan.ad.engine.service.score.impl;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-
-@Slf4j
-@Service
-public class TacticsAndFmModelScoreRankService {
-}

+ 85 - 0
ad-engine-service/src/main/java/com/tzld/piaoquan/ad/engine/service/score/impl/TacticsAndLRModelScoreRankService.java

@@ -0,0 +1,85 @@
+package com.tzld.piaoquan.ad.engine.service.score.impl;
+
+import com.tzld.piaoquan.ad.engine.commons.score.ScoreParam;
+import com.tzld.piaoquan.ad.engine.service.score.RankService680;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdDirectionScore;
+import com.tzld.piaoquan.ad.engine.service.score.dto.AdPlatformCreativeDTO;
+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.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Service
+public class TacticsAndLRModelScoreRankService {
+
+    @Autowired
+    private RankService680 rankService680;
+
+    public List<AdRankItem> adItemRank(RankRecommendRequestParam requestParam, ScoreParam scoreParam) {
+
+        // LR模型打分结果
+        List<AdRankItem> adRankItems = rankService680.adItemRank(requestParam, scoreParam);
+
+        Map<Long, AdDirectionScore> adDirectionScoreMap = requestParam.getAdIdList().stream()
+                .collect(Collectors.toMap(AdPlatformCreativeDTO::getCreativeId, AdPlatformCreativeDTO::getAdDirectionScore));
+        List<AdRankItem> result = new ArrayList<>();
+
+        for (AdRankItem adRankItem : adRankItems) {
+            AdRankItem item = new AdRankItem();
+            item.setAdId(adRankItem.getAdId());
+            item.setCreativeCode(adRankItem.getCreativeCode());
+            item.setAdVerId(adRankItem.getAdVerId());
+            item.setVideoId(item.getVideoId());
+            item.setLrScore(item.getLrScore());
+
+            double s1 = item.getAdDirectionScore();
+            double s2 = item.getLrScore();
+
+            item.setScore(s1 * s2);
+
+            item.getFeatureMap().putAll(adRankItem.getFeatureMap());
+            item.getMetaFeatureMap().putAll(adRankItem.getMetaFeatureMap());
+
+            result.add(item);
+        }
+
+        Collections.sort(result);
+        return result;
+    }
+
+    private double calcDirectionScore(AdRankItem adRankItem, AdDirectionScore adDirectionScore) {
+        if (Objects.isNull(adDirectionScore)) {
+            adRankItem.setAdDirectionScore(1);
+            return 1;
+        }
+        double exponent = Objects.nonNull(adDirectionScore.getExponent()) ? adDirectionScore.getExponent() : 1;
+        Map<String, String> scoreDetail = adDirectionScore.getScoreDetail();
+
+        double network = Double.parseDouble(scoreDetail.getOrDefault("network", "1"));
+        double phoneModel = Double.parseDouble(scoreDetail.getOrDefault("phoneModel", "1"));
+        double area = Double.parseDouble(scoreDetail.getOrDefault("area", "1"));
+        double peoplePackage = Double.parseDouble(scoreDetail.getOrDefault("peoplePackage", "1"));
+        double excludeConv = Double.parseDouble(scoreDetail.getOrDefault("excludeConv", "1"));
+        double excludeClick = Double.parseDouble(scoreDetail.getOrDefault("excludeClick", "1"));
+        double excludeView = Double.parseDouble(scoreDetail.getOrDefault("excludeView", "1"));
+
+        double excludeMin = Math.min(excludeConv, Math.min(excludeClick, excludeView));
+
+        double s1 = (network * phoneModel * area * peoplePackage * excludeMin);
+        double s2 = Math.pow(s1, exponent);
+
+        adRankItem.setAdDirectionScore(s2);
+
+        Map<String, String> scoreDetailMap = new HashMap<>(scoreDetail);
+        scoreDetailMap.put("exponent", String.valueOf(exponent));
+        adRankItem.getMetaFeatureMap().put("adDirectionScoreDetail", scoreDetailMap);
+
+        return 1;
+    }
+
+}