Skip to content

fix(scoring): 百分位精选改为名次截断,消除 off-by-one 与并列整块放行 - #107

Merged
fxbin merged 1 commit into
mainfrom
issue-106-percentile-off-by-one
Oct 11, 2026
Merged

fxbin merged 1 commit into
mainfrom
issue-106-percentile-off-by-one

Conversation

@fxbin

@fxbin fxbin commented Oct 11, 2026

Copy link
Copy Markdown
Owner

动机

精选率结构性偏高的层 2 机制修复(层 1 local_fallback 假分污染已随 #90 入 main)。生产备份重放实测精选率 55.3%(目标 30% 的 1.9 倍),根因三层:

  1. 假分钉门槛([P1][LLM] LLM 降级内容不会再被重新分析:local_fallback 落 ANALYZED 终态后无恢复路径 #90 已修):87.5% 假分 curation 收敛 71 分,P70 门槛 24/27 时点被钉在并列块上、>= 整块放行——修复后备份数据模拟 16.1%;
  2. 本 PR 修的机制:nearest-rank + >= 的 off-by-one(放行 n−rank+1 条,100 条选 31 条;注释目标 25-30% 数学上不可达)+ 门槛值并列块整块放行;
  3. 全管线无绝对质量线(base gate 提档/fixed 模式校准为后续独立事项)。

改动

  • scoring_engine.py Phase 5:percentile 分支改为按 final_score 降序名次截断 top-(100-percentile)%(keep = max(1, n−rank))——精确配额、并列块按序截断(不放大也不全灭)、小批次保底 1 条(防内容少的日子今日选题整页空白);threshold_used 取第 keep 名分数,展示语义不变;fixed 模式保持 >=(绝对质量线达到即入选的语义本就正确)
  • 测试:新增精确配额(10 条恰选 3)与并列块(7 条并列 60 分不占名额)两个回归;[P1][LLM] LLM 降级内容不会再被重新分析:local_fallback 落 ANALYZED 终态后无恢复路径 #90 对照测试改写为名次截断语义(假分不得挤占真实头名);三个既有测试补低分陪跑适配新配额

Verification

  • 全量后端测试(make test-backend,一次性 PG)exit 0 ×2
  • 受影响子集(scoring/today_picks/curation/digest/ranking/enrichment/event_consumers)三轮迭代全绿
  • ruff check / ruff format --check / check_layering.py 全过

Verifier verdict

独立复核过程(实现与复核分离):初版「>= 改 >」一行方案被 8 个红测试推翻——小批次(n=1/2)与均匀并列批次会一条不选,today-picks 整页空白不可接受;据此升级为名次截断 + 保底方案。测试适配中确认一个既有交互:事件成员在打分前被剔除出候选池(build_today_picks 的事件归一化路径),事件多的日子实际候选池 n 缩水、配额随之缩水——已在测试注释中记录。

部署提醒

精选率结构性偏高的第二层机制修复(第一层 local_fallback 假分污染
已随 #90 修复)。旧「nearest-rank 门槛 + >= 比较」放行 n-rank+1 条
(100 条候选选 31 条,注释目标 25-30% 数学上不可达),且门槛值上的
并列块被整块放行(假分钉 71 分时精选率达 55% 的机制之二)。

改为按 final_score 降序名次截断 top-(100-percentile)%:精确配额、
并列块按序截断(不放大也不全灭)、小批次保底 1 条(防内容少的
日子今日选题整页空白)。fixed 模式保持 >= ——绝对质量线达到即
入选的语义本就正确。threshold_used 取第 keep 名分数,展示不变。

配套:新增精确配额与并列两个回归测试;#90 对照测试改写为名次
截断语义(假分不得挤占真实头名);三个既有测试补低分陪跑适配
新配额(其中确认事件成员在打分前剔除导致候选池缩水的既有交互)。
@fxbin
fxbin merged commit fadd3bc into main Oct 11, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant