Explorar el Código

recallWithScore add rovMin

wangyunpeng hace 1 día
padre
commit
7331582c0e

+ 3 - 0
core/src/main/java/com/tzld/videoVector/model/param/RecallVideoScoreParam.java

@@ -41,6 +41,9 @@ public class RecallVideoScoreParam {
     /** 相似度下界(粗筛阈值),默认 0.7 */
     private Double simMin;
 
+    /** ROV 最小值限制,低于此值的视频将被过滤;为空则不限制 */
+    private Double rovMin;
+
     /** 指标数据日期维度(天),不传则使用 video.detail.metrics.days 配置 */
     private Integer days;
 }

+ 2 - 0
core/src/main/java/com/tzld/videoVector/model/vo/RecallVideoScoreVO.java

@@ -65,6 +65,8 @@ public class RecallVideoScoreVO {
         private Double rovP5;
         /** 相似度下界 */
         private Double simMin;
+        /** ROV 最小值限制 */
+        private Double rovMin;
         /** 相似度上界 */
         private Double simMax;
     }

+ 14 - 5
core/src/main/java/com/tzld/videoVector/service/impl/VideoSearchServiceImpl.java

@@ -1389,7 +1389,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         if (param == null) {
             log.error("recallWithScore 参数为空");
             return emptyScoreResult(VectorUtils.DEFAULT_ALPHA, VectorUtils.DEFAULT_ROV_P95,
-                    VectorUtils.DEFAULT_ROV_P5, VectorUtils.DEFAULT_SIM_MIN);
+                    VectorUtils.DEFAULT_ROV_P5, VectorUtils.DEFAULT_SIM_MIN, null);
         }
 
         // 解析评分参数,使用默认值
@@ -1397,6 +1397,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         double rovP95 = param.getRovP95() != null ? param.getRovP95() : VectorUtils.DEFAULT_ROV_P95;
         double rovP5 = param.getRovP5() != null ? param.getRovP5() : VectorUtils.DEFAULT_ROV_P5;
         double simMin = param.getSimMin() != null ? param.getSimMin() : VectorUtils.DEFAULT_SIM_MIN;
+        Double rovMin = param.getRovMin();
 
         // 1. 复用现有 matchTopNVideo 进行向量召回
         MatchTopNVideoParam matchParam = new MatchTopNVideoParam();
@@ -1410,7 +1411,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         List<VideoMatchResult> rawMatches = matchTopNVideo(matchParam, true);
         if (rawMatches == null || rawMatches.isEmpty()) {
             log.info("recallWithScore: 召回结果为空");
-            return emptyScoreResult(alpha, rovP95, rovP5, simMin);
+            return emptyScoreResult(alpha, rovP95, rovP5, simMin, rovMin);
         }
 
         // 2. 对每条结果计算综合评分
@@ -1428,10 +1429,16 @@ public class VideoSearchServiceImpl implements VideoSearchService {
             if (sim < simMin) {
                 continue;
             }
-            item.setSim(sim);
 
-            // 从 videoDetail 中提取 rov
+            // rov 从 videoDetail 中提取
             double rov = extractRov(match.getVideoDetail());
+
+            // rovMin 限制,低于rovMin的结果直接过滤(为空则不限制)
+            if (rovMin != null && (rov == 0 && rov < rovMin)) {
+                continue;
+            }
+
+            item.setSim(sim);
             item.setRov(rov);
 
             // sim 归一化
@@ -1465,6 +1472,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         scoreParams.setRovP95(rovP95);
         scoreParams.setRovP5(rovP5);
         scoreParams.setSimMin(simMin);
+        scoreParams.setRovMin(rovMin);
         scoreParams.setSimMax(VectorUtils.DEFAULT_SIM_MAX);
         vo.setScoreParams(scoreParams);
 
@@ -1504,7 +1512,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
     /**
      * 构建空的评分结果
      */
-    private RecallVideoScoreVO emptyScoreResult(double alpha, double rovP95, double rovP5, double simMin) {
+    private RecallVideoScoreVO emptyScoreResult(double alpha, double rovP95, double rovP5, double simMin, Double rovMin) {
         RecallVideoScoreVO vo = new RecallVideoScoreVO();
         vo.setItems(Collections.emptyList());
         vo.setTotal(0);
@@ -1513,6 +1521,7 @@ public class VideoSearchServiceImpl implements VideoSearchService {
         scoreParams.setRovP95(rovP95);
         scoreParams.setRovP5(rovP5);
         scoreParams.setSimMin(simMin);
+        scoreParams.setRovMin(rovMin);
         scoreParams.setSimMax(VectorUtils.DEFAULT_SIM_MAX);
         vo.setScoreParams(scoreParams);
         return vo;