Ver código fonte

增加向量召回视频api调用

wangyunpeng 1 semana atrás
pai
commit
224713e88e

+ 30 - 0
long-article-server/src/main/java/com/tzld/piaoquan/longarticle/model/dto/RecallVideoScoreParam.java

@@ -0,0 +1,30 @@
+package com.tzld.piaoquan.longarticle.model.dto;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RecallVideoScoreParam {
+
+    /** 配置编码,用于指定搜索哪个向量配置 */
+    private String configCode;
+
+    /** 查询文本,将被向量化后进行检索 */
+    private String queryText;
+
+    /** 返回 Top-N 结果数量,默认 10 */
+    private Integer topN = 10;
+
+    /** 相关性权重 alpha,取值 0~1,默认 0.6 */
+    private Double alpha;
+
+    /** ROV 全局历史 P95,默认 0.07 */
+    private Double rovP95;
+
+    /** ROV 全局历史 P5,默认 0.005 */
+    private Double rovP5;
+
+    /** 相似度下界(粗筛阈值),默认 0.7 */
+    private Double simMin;
+}

+ 59 - 0
long-article-server/src/main/java/com/tzld/piaoquan/longarticle/model/dto/RecallVideoScoreVO.java

@@ -0,0 +1,59 @@
+package com.tzld.piaoquan.longarticle.model.dto;
+
+import lombok.Data;
+
+import java.util.List;
+import java.util.Map;
+
+@Data
+public class RecallVideoScoreVO {
+
+    /** 评分后的结果列表(按综合分 score 降序) */
+    private List<ScoredVideoItem> items;
+
+    /** 总条数 */
+    private int total;
+
+    /** 使用的评分参数 */
+    private ScoreParams scoreParams;
+
+    @Data
+    public static class ScoredVideoItem {
+
+        /** 匹配到的视频ID */
+        private Long videoId;
+
+        /** 命中的配置编码 */
+        private String configCode;
+
+        /** 原始相似度分数 (sim) */
+        private Double sim;
+
+        /** 归一化后的相似度 (sim_norm) */
+        private Double simNorm;
+
+        /** 效率分 (rov) */
+        private Double rov;
+
+        /** 归一化后的效率分 (rov_norm) */
+        private Double rovNorm;
+
+        /** 综合得分 = alpha * sim_norm + (1-alpha) * rov_norm */
+        private Double score;
+
+        /** 向量化原文 */
+        private String text;
+
+        /** 视频基础信息(从大数据表同步至Redis),含 deconstruct 子对象 */
+        private Map<String, Object> videoDetail;
+    }
+
+    @Data
+    public static class ScoreParams {
+        private Double alpha;
+        private Double rovP95;
+        private Double rovP5;
+        private Double simMin;
+        private Double simMax;
+    }
+}

+ 16 - 0
long-article-server/src/main/java/com/tzld/piaoquan/longarticle/service/remote/VideoVectorService.java

@@ -0,0 +1,16 @@
+package com.tzld.piaoquan.longarticle.service.remote;
+
+import com.tzld.piaoquan.longarticle.model.dto.RecallVideoScoreParam;
+import com.tzld.piaoquan.longarticle.model.dto.RecallVideoScoreVO;
+
+public interface VideoVectorService {
+
+    /**
+     * 召回视频并按综合评分排序
+     * 综合分 = alpha * sim_norm + (1-alpha) * rov_norm
+     *
+     * @param param 召回评分参数
+     * @return 按综合分降序排列的结果,失败返回 null
+     */
+    RecallVideoScoreVO recallWithScore(RecallVideoScoreParam param);
+}

+ 43 - 0
long-article-server/src/main/java/com/tzld/piaoquan/longarticle/service/remote/impl/VideoVectorServiceImpl.java

@@ -0,0 +1,43 @@
+package com.tzld.piaoquan.longarticle.service.remote.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.tzld.piaoquan.longarticle.model.dto.RecallVideoScoreParam;
+import com.tzld.piaoquan.longarticle.model.dto.RecallVideoScoreVO;
+import com.tzld.piaoquan.longarticle.service.remote.VideoVectorService;
+import com.tzld.piaoquan.longarticle.utils.HttpClientUtil;
+import com.tzld.piaoquan.longarticle.utils.HttpPoolClientUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class VideoVectorServiceImpl implements VideoVectorService {
+
+    private static final HttpPoolClientUtil HTTP_CLIENT = HttpClientUtil.create(3000, 6000, 20, 100, 3, 3000);
+
+    @Value("${video.vector.api.host:http://api-internal.piaoquantv.com/videoVector}")
+    private String videoVectorApiHost;
+
+    @Override
+    public RecallVideoScoreVO recallWithScore(RecallVideoScoreParam param) {
+        String apiUrl = videoVectorApiHost + "/recallWithScore";
+        try {
+            log.info("recallWithScore request={}", JSON.toJSONString(param));
+            String res = HTTP_CLIENT.post(apiUrl, JSON.toJSONString(param));
+            JSONObject jsonObject = JSON.parseObject(res);
+            log.info("recallWithScore res code={}, msg={}", jsonObject.getInteger("code"), jsonObject.getString("msg"));
+
+            if (jsonObject.getInteger("code") != null && jsonObject.getInteger("code") == 0) {
+                JSONObject dataJson = jsonObject.getJSONObject("data");
+                if (dataJson != null) {
+                    return dataJson.toJavaObject(RecallVideoScoreVO.class);
+                }
+            }
+        } catch (Exception e) {
+            log.error("recallWithScore error, param={}", JSON.toJSONString(param), e);
+        }
+        return null;
+    }
+}