3.1 KiB
3.1 KiB
子模块:Rerank & Freqcap(重排 / 去重 / 频控)|Spec
1. 目标描述
对 Soft Scoring 后的候选集做最终的“可下发排序”,解决:
- 去重:避免同一句在短期内反复出现。
- 多样性:Feed 场景需要序列多样性(作者/模板/标签)。
- 频控与冷却:Push/Widget 必做,按句子/作者/模板维度做窗口期不重复。
当前确认:历史集合由客户端在请求时传入(已推荐 ID、已触达/浏览 ID)。
2. 输入 / 输出定义
2.1 输入
scene:feed | push | widgetscored_candidates:List[{ content_id, score, content_profile... }]already_recommended_ids:List[str|int]touched_or_viewed_ids:List[str|int]- (可选)
recent_author_ids/recent_template_ids(若客户端暂不传,可由后续服务端侧补齐) k: 目标条数config:- Feed:
mmr_lambda(默认 0.7) - 冷却窗口:
cooldown_sentence_days / cooldown_author_days / cooldown_template_days
- Feed:
2.2 输出
ranked_items: 排好序的候选(长度 ≤ k)meta:candidate_pool_size_after_dedupcandidate_pool_size_after_freqcapfreqcap_filtered_counts(可选,按维度统计)
3. 规则与算法(V1 最小集合)
3.1 去重(必做)
- 过滤
content_id∈already_recommended_ids ∪ touched_or_viewed_ids的候选。 - 去重键定义(对齐算法规则的工程约定):
sentence_key = content_idauthor_key = author_id(可空)template_key = template_id(可空)
3.2 Feed:MMR 序列重排(建议)
- Top1:最高分,确保第一眼命中。
- 后续:使用 MMR 选择序列,最大化与已选内容的差异(作者/模板/need/context/stage)。
MMR 定义:
[ MMR(c)=\lambda\cdot Rel(c) - (1-\lambda)\cdot \max_{s\in S} Sim(c,s) ]
其中:
Rel(c):可直接使用final_scoreSim(c,s):离散特征版(V1 推荐):- content_id 相同:1
- template_id 相同:+0.6
- author_id 相同:+0.3
- 标签重合(Jaccard):+0.1 * Jaccard(tags_c, tags_s)
- clamp 到 [0,1]
3.3 Push/Widget:频控与冷却(必做)
最小要求:
- 同一句在窗口 X 天内不重复(句子冷却)。
- 同作者/同模板在窗口期内尽量不重复(可作为硬频控或强降权,plan 阶段定)。
当前 V1 输入侧只确认有 content_id 历史;若 author/template 历史暂不具备,可先对 content_id 强硬去重,并将 author/template 频控作为“可选增强”(meta 仍需统计缺失原因)。
4. 验收标准(可验证)
- 去重正确:输出不包含
already_recommended_ids与touched_or_viewed_ids。 - Feed 序列多样:在候选足够时,序列中不会出现大量同作者/同模板连续重复(可用统计阈值验收)。
- Push/Widget 频控生效:在冷却窗口内同一句不会再次被推荐(基于传入历史集合验证)。
- 可观测:输出 meta 中包含
after_dedup/after_freqcap的候选规模,便于排查 served_k 不足原因。