Screen Recommendation Loop
Overview
Run an ongoing recommendation system that balances consistency and low user burden. Recommend one title at a time, collect short feedback, and adapt future picks from preference signals.
Core Workflow
- 1. Pick one candidate title.
- Send one concise recommendation message.
- Schedule follow-up based on title type.
- Collect status in a small fixed schema.
- Update preference weights.
- Pick the next title with constrained randomness.
Keep each interaction short. Prioritize adherence over perfect metadata.
If the user proactively returns before scheduled follow-up (e.g., "I watched it, let's discuss"), skip waiting and immediately:
- 1. run the review step,
- record status,
- start the next recommendation cycle.
Recommendation Rules
- - Use a mixed candidate pool (example: Douban Top 250 + Bangumi Top 250).
- Select title type randomly (not strict alternation):
- allow movie → movie
- allow anime → anime
- - Apply hard filters before scoring:
- already completed recently
- explicitly rejected/dropped for same strong pattern
- duplicate title aliases
- - Use constrained random ranking:
- exploit known preferences (higher weight)
- retain exploration quota (e.g., 15–25%) to avoid tunnel vision
Follow-Up Timing Rules
Use automatic, content-type-based follow-up windows.
Default logic:
- - Movie recommendation: follow up at INLINECODE0
- Anime/series recommendation: follow up at INLINECODE1
No manual per-user interval configuration is required; infer from recommended content type.
When asking, send at a random time inside a normal activity window (for example 10:00–22:30 in the target timezone).
Accepted User Statuses
Treat all as valid outcomes:
- - watched (completed)
- partial (started but unfinished)
- notstarted
- droppedmidway
- rejectthistitle
Do not frame partial/dropped as failure. Use them as preference signals.
Feedback Prompt Template
Use a tiny response format:
- - status: watched / partial / notstarted / droppedmidway / rejectthistitle
- one-line feeling (optional)
- next mood (optional): brainy / healing / realistic / light
Preference Update Heuristics
- - watched: reinforce nearby tags and narrative patterns
- partial: slight penalty to pacing/length mismatch factors
- droppedmidway: strong negative weight to dominant disliked traits
- rejectthistitle: title-level or trope-level block depending on reason
- notstarted: no strong taste penalty; treat as scheduling signal
Decay old signals slowly to avoid overfitting to one week.
Minimal Record Schema
Keep per-title state:
- - id
- title
- type (movie|anime)
- source
- recommendedAt
- followupAt
- status
- tags (optional)
- note (optional, one-line user feedback)
This can live in JSON or SQLite.
Safety and Privacy
- - Never store private identifiers in the skill package.
- Keep the skill generic: no personal names, account IDs, chat IDs, tokens, local paths, or private schedules.
- If publishing, scrub sample data and examples before packaging.
屏幕推荐循环
概述
运行一个持续推荐系统,平衡一致性与低用户负担。每次推荐一个标题,收集简短反馈,并根据偏好信号调整后续推荐。
核心工作流程
- 1. 选择一个候选标题。
- 发送一条简洁的推荐消息。
- 根据标题类型安排跟进时间。
- 按照固定的小型模式收集状态。
- 更新偏好权重。
- 在有限随机性下选择下一个标题。
保持每次交互简短。优先考虑依从性而非完美元数据。
如果用户在预定跟进时间之前主动返回(例如我看完了,我们来讨论一下),则跳过等待并立即:
- 1. 执行回顾步骤,
- 记录状态,
- 开始下一个推荐周期。
推荐规则
- - 使用混合候选池(例如:豆瓣Top 250 + Bangumi Top 250)。
- 随机选择标题类型(非严格交替):
- 允许电影→电影
- 允许动漫→动漫
- 近期已完成
- 因相同强烈模式被明确拒绝/放弃
- 重复标题别名
- 利用已知偏好(更高权重)
- 保留探索配额(例如15–25%)以避免视野狭窄
跟进时间规则
使用基于内容类型的自动跟进窗口。
默认逻辑:
- - 电影推荐:在recommendedAt + 7天跟进
- 动漫/系列推荐:在recommendedAt + 30天跟进
无需手动配置每个用户的间隔;根据推荐内容类型推断。
询问时,在正常活动窗口内随机时间发送(例如目标时区10:00–22:30)。
接受的用户状态
将所有结果视为有效:
- - 已观看(已完成)
- 部分观看(开始但未完成)
- 未开始
- 中途放弃
- 拒绝此标题
不要将部分观看/中途放弃视为失败。将其用作偏好信号。
反馈提示模板
使用小型响应格式:
- - 状态:已观看 / 部分观看 / 未开始 / 中途放弃 / 拒绝此标题
- 一句话感受(可选)
- 下一个心情(可选):烧脑 / 治愈 / 现实 / 轻松
偏好更新启发式规则
- - 已观看:强化附近标签和叙事模式
- 部分观看:对节奏/长度不匹配因素轻微惩罚
- 中途放弃:对主导性不喜欢的特征给予强烈负面权重
- 拒绝此标题:根据原因进行标题级或套路级屏蔽
- 未开始:无强烈品味惩罚;视为时间安排信号
缓慢衰减旧信号,避免过度拟合某一周。
最小记录模式
保持每个标题的状态:
- - id
- 标题
- 类型(电影|动漫)
- 来源
- 推荐时间
- 跟进时间
- 状态
- 标签(可选)
- 备注(可选,一行用户反馈)
可存储在JSON或SQLite中。
安全与隐私
- - 切勿在技能包中存储私人标识符。
- 保持技能通用性:无个人姓名、账户ID、聊天ID、令牌、本地路径或私人日程。
- 如果发布,在打包前清除样本数据和示例。