Phase 1
Feedback 排序规则契约
Feedback 排序规则契约
状态:已确认,尚未实现。
范围:定义 Feedback 如何影响未来候选的本地排序;不改变当前 Feedback API、不会执行外部动作。
决策
Feedback 是不可变事件流;同一书签以最大 id 的事件作为当前有效状态,其中 id 是 SQLite 自增整数,历史事件只用于回顾,不重复累计排序影响。created_at 与本文的 referenceTime 都是带毫秒精度的 UTC instant(ISO 8601);feedbackCreatedAt 一律指该事件的 created_at,不是书签发布时间。
created_at 只能由本地持久层在事件插入时生成,格式固定为 YYYY-MM-DDTHH:mm:ss.SSSZ,客户端不能回填或修改。
| Feedback | 当前条目 | 对同类别新候选的影响 |
|---|---|---|
| 值得关注 | 已评估,不再作为待校准条目重复出现 | +1 |
| 想深挖 | 已评估,不自动创建任务或项目 | +3 |
| 稍后看 | 从候选池隐藏至 feedbackCreatedAt + 7 × 24h;到时立即回池 |
0 |
| 不感兴趣 | 从候选池排除,直到新 Feedback 替代该状态 | -2 |
| 重复或已知 | 从候选池排除,直到新 Feedback 替代该状态 | 0 |
新事件可以替代当前状态。例如把“不感兴趣”改为“值得关注”后,原来的 -2 立即失效;历史中仍能看到两次选择。
排序
先过滤,再排序:
- 有效状态为“值得关注”或“想深挖”的条目不再进入待校准候选池;它们可从历史或搜索中重新打开并再次反馈。
- 有效状态为“不感兴趣”或“重复或已知”的条目不进入候选池,直到新 Feedback 替代该状态。
- 有效状态为“稍后看”且
referenceTime < feedbackCreatedAt + 7 × 24h的条目不进入候选池;到达该时刻即回池。 - 其余候选按既有
baseScore + feedbackAdjustment(category)排序;Feedback 只提供增量,不取代基础排序、去重或多样性规则。
对每一条仍有效的“值得关注 / 想深挖 / 不感兴趣”事件,计算:
ageDays = max(0, referenceTime - feedbackCreatedAt) / 24h
decay = max(0, 1 - ageDays / 90)
contribution = weight × decay
feedbackAdjustment(category)
= Σ contribution
(只统计该类别、且每条书签的最新有效 Feedback)Phase 1 首版一条书签只使用导入时的单一 bookmark.category,按精确值匹配;不做多类别分摊、同义词归并或作者/关键词推断。90 天后排序增量为 0,但原始事件永久保留。每次候选生成创建并持久化 candidateRunId、批次开始时的 referenceTime 和当时 max(feedback_events.id);计算当前有效状态时只读取 id ≤ maxFeedbackEventId 的事件。该批次的分页、重试、详情和回顾都必须复用这三个值,不能读取后来新增的 Feedback。只有用户显式刷新或开始新的计划批次才创建新的 candidateRunId。没有类别、或类别无法匹配的书签可保存 Feedback,但不产生类别排序增量;界面必须说明这一点。
可复现计算
排序实现统一使用千分整数,不使用浮点数:+1 / +3 / -2 分别表示 +1000 / +3000 / -2000 milli-points。ageMs 以毫秒计算,decayMilli = max(0, 1000 - floor(ageMs × 1000 / (90 × 24 × 60 × 60 × 1000))),contributionMilli = trunc(weightMilli × decayMilli / 1000)(向 0 截断)。
按 bookmark_id ASC, feedback.id ASC 的固定顺序累加每个类别的 contributionMilli;候选总分为 baseScoreMilli + feedbackAdjustmentMilli。最终排序按 totalScoreMilli DESC、baseScoreMilli DESC、bookmark.id ASC,保证不同实现给出相同顺序。
候选详情至少显示:feedbackAdjustment、组成它的近期 Feedback、每条贡献的衰减后数值,以及 referenceTime。
回顾
每条回顾记录应包含:时间、书签、类别、人工选择、当前展示状态、稍后看的到期时间(如有)、排序增量变化,以及变更后的有效状态。
回顾回答的是“这次选择怎样改变了以后”,不是只罗列点击日志。
验收例
- 标记“稍后看”后,在满
7 × 24h前不出现;到达该时刻立即重新具备候选资格。 - “想深挖”当天令同类别新候选获得
+3;第 90 天及之后不再贡献分数。 - “重复或已知”排除当前条目,但不降低同类新候选。
- “不感兴趣”改为“值得关注”后,旧
-2不再计入,只保留新的+1及其衰减。 - 任一排序变化都可从回顾和候选详情追溯到具体 Feedback。
不在本规则内
- 作者、关键词、内容形式或来源的反馈权重。
- 云端模型、黑箱画像或自动调参。
- 自动创建任务、项目、提醒,或任何浏览器 / 第三方写操作。
相关范围见 Phase 1 MVP 和本地书签工作台运行手册。