CLAUDE.md 3.2 KB

recommend-server 项目须知

提交规则(最重要)

以下文件/目录是本地调试/同步用不要 git add 进任何业务 PR

  • recommend-server-service/src/main/resources/application-dev.yml
    • 用户本地会把 eureka / redis hostName / apollo meta 改成自己的调试地址
    • 看到这个文件有 diff 时,默认跳过它(用户会自己处理)
  • apollo/ 目录(如 apollo/rank.score.merge.weightv564.json 等)
    • Git untracked,是 Apollo 后台配置的本地参考副本
    • 改这个文件不会自动同步到 Apollo 后台,运维要单独操作
    • 修改 Apollo JSON 永远不要 commit
  • docs/ 目录、实验配置/ 目录 — 本地资料,同上

git add 时手动列文件名,不要用 git add -Agit add .,避免把这些误带进去。

召回 / 排序架构

  • 召回是公共池RecallService.getStrategies() 给所有用户挂载一组召回策略,并发跑 Redis 拿候选视频写入候选池
  • Rank 实验各挑各的:每个 RankStrategy4RegionMergeModelVxxxmergeAndRankRovRecall() 里通过 RecallUtils.extractRecall(weight, param, PUSH_FROM/FORM, ...)PUSH_FROM 字符串挑想要的召回路
  • 推论:往 RecallService 加新召回不会自动进任何 rank 实验,必须同时改对应 rank 类的 extractRecall 调用才能生效
  • 实验门控的两种模式
    • 加法门(主流):if (isHitXxxExp) strategies.add(...) — 命中实验才挂载(842/568 用此模式)
    • 减法门(V564 新增):if (isHit564Exp) { strategies.add(...); strategies.removeIf(...) } — 命中实验时挂新召回 + 剔除该实验不要的召回,省 Redis 调用
  • judgeHitExprootSessionId 分桶:同一用户同一会话里要么始终命中要么始终不命中,召回/排序天然对齐

命名陷阱

  • PUSH_FORM(拼错的,6+ 处)vs PUSH_FROM(正确,3 处)在 recall strategy 里并存
    • 加新策略时PUSH_FROM,别复制旧的拼错版本
    • 写过滤逻辑时别用 pushFrom() 字符串过滤,改用 getClass().getSimpleName(),绕开这个不一致
  • 新建 RecallStrategy 时只要 @Component implements RecallStrategy,Spring 会自动按 getClass().getSimpleName() 注册到 RecallServicestrategyMap,然后再去 getStrategies()add 一行就生效

Apollo 配置

  • 文件名约定:apollo/rank.score.merge.weightv{NNN}.json 对应 rank 类的 @ApolloJsonValue("${rank.score.merge.weightv{NNN}:}")
  • Key 命名约定:xxxRov / xxxRos / xxxStr 等,与 mergeWeight.getOrDefault("xxx", 默认值) 一致
  • 改了 rank 类的 extractRecall 列表后,Apollo JSON 要同步清理废弃 key(不会报错,但是死配置)
  • 代码里 getOrDefault(key, 默认值) 提供兜底,所以 Apollo 没配也能跑

V564 实验当前状态(2026-05-20 改动后)

  • 基于 V569,相比 V569:
    • 召回侧:剔除 9 路(v1/region 系列 5 路 / priori_province 系列 3 路),新增 province_rovn
    • 排序侧provinceRov:5 权重默认值(可在 Apollo JSON 覆盖)
  • 召回侧的剔除通过 RecallService.javaif (isHit564Exp) 块的 removeIf 实现,要回滚整块删除即可