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 立即失效;历史中仍能看到两次选择。

排序

先过滤,再排序:

  1. 有效状态为“值得关注”或“想深挖”的条目不再进入待校准候选池;它们可从历史或搜索中重新打开并再次反馈。
  2. 有效状态为“不感兴趣”或“重复或已知”的条目不进入候选池,直到新 Feedback 替代该状态。
  3. 有效状态为“稍后看”且 referenceTime < feedbackCreatedAt + 7 × 24h 的条目不进入候选池;到达该时刻即回池。
  4. 其余候选按既有 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 DESCbaseScoreMilli DESCbookmark.id ASC,保证不同实现给出相同顺序。

候选详情至少显示:feedbackAdjustment、组成它的近期 Feedback、每条贡献的衰减后数值,以及 referenceTime

回顾

每条回顾记录应包含:时间、书签、类别、人工选择、当前展示状态、稍后看的到期时间(如有)、排序增量变化,以及变更后的有效状态。

回顾回答的是“这次选择怎样改变了以后”,不是只罗列点击日志。

验收例

  1. 标记“稍后看”后,在满 7 × 24h 前不出现;到达该时刻立即重新具备候选资格。
  2. “想深挖”当天令同类别新候选获得 +3;第 90 天及之后不再贡献分数。
  3. “重复或已知”排除当前条目,但不降低同类新候选。
  4. “不感兴趣”改为“值得关注”后,旧 -2 不再计入,只保留新的 +1 及其衰减。
  5. 任一排序变化都可从回顾和候选详情追溯到具体 Feedback。

不在本规则内

  • 作者、关键词、内容形式或来源的反馈权重。
  • 云端模型、黑箱画像或自动调参。
  • 自动创建任务、项目、提醒,或任何浏览器 / 第三方写操作。

相关范围见 Phase 1 MVP本地书签工作台运行手册