| name | scene-router |
| description | 15 场景入口路由 + 个性化推荐。用户选择或被识别场景后,路由到对应 skill 组合并加载场景 reference。新用户看预设场景,随着对话积累,预设逐渐被用户自己的高频人物/事件替代。SOS 场景直接路由 crisis,恋爱/家人场景可触发 see-pattern。 |
场景路由 + 推荐
用户进入对话时,帮 ta 找到最合适的场景入口,然后路由到对应 skill 组合。
核心原则
- 场景是入口,skill 是引擎:场景决定加载哪些 reference 材料,skill 决定怎么对话。
- 路由透明:用户选了什么场景就走什么路由,不偷偷换。
- 推荐不强制:推荐是建议,用户可以选别的或直接开聊。
- SOS 最高优先级:任何时候检测到 SOS 信号,立即路由 crisis,覆盖一切场景。
- 演化优先用户数据:有历史线索时,用用户自己的人和事替代预设场景。
触发条件
以下任一满足即触发:
- 对话开始时(新 session 的场景选择/推荐阶段)
- 用户主动说"我想聊聊恋爱的事""考研好焦虑""睡不着"等场景关键词
- 用户从 Heartbeat 推荐卡片点入
- 用户说"换个话题""我想聊别的"
不触发:
- 对话已经在某个 skill 流程中且用户没有要求切换
- crisis 正在执行中(不打断 crisis)
15 场景路由表
| 场景 | 关键词 | 路由到的 skill 组合 | 场景 reference 目录 |
|---|
| 恋爱 | 男朋友/女朋友/对象/暧昧/分手/复合/他不回消息/冷暴力/吵架(亲密关系) | listen + untangle + see-pattern | scenes/romance/ |
| 家人 | 爸妈/父母/妈妈/爸爸/家里人/原生家庭/催婚/催考研/代沟 | listen + untangle + see-pattern | scenes/family/ |
| 室友 | 室友/舍友/宿舍/合租/隔壁床 | listen + untangle | scenes/roommate/ |
| 朋友 | 朋友/闺蜜/兄弟/友谊/社交/被孤立/不合群 | listen + untangle | scenes/friend/ |
| 考研 | 考研/备考/二战/调剂/初试/复试/导师/学硕/专硕 | listen + face-decision + calm-body | scenes/postgrad-exam/ |
| 考公 | 考公/公务员/省考/国考/体制/上岸/行测/申论 | listen + face-decision + calm-body | scenes/civil-exam/ |
| 实习 | 实习/实习生/mentor/带教/职场新人/被骂/犯错 | listen + untangle + face-decision | scenes/internship/ |
| 求职 | 求职/找工作/投简历/面试/被拒/offer/秋招/春招 | listen + face-decision | scenes/job-hunting/ |
| 毕业 | 毕业/毕业论文/答辩/离校/毕业季/以后怎么办 | listen + face-decision + know-myself | scenes/graduation/ |
| 学业 | 学业/作业/DDL/挂科/绩点/论文/拖延/期末 | listen + face-decision + calm-body | scenes/academic/ |
| 失眠 | 失眠/睡不着/翻来覆去/脑子停不下来/凌晨还醒着 | calm-body | scenes/insomnia/ |
| 认识自己 | 认识自己/我是谁/我到底想要什么/我为什么总是/自我探索 | know-myself + see-pattern | scenes/self-discovery/ |
| 容貌焦虑 | 容貌焦虑/好丑/不好看/整容/减肥/身材/外貌 | listen + know-myself | scenes/body-image/ |
| 随便聊聊 | 随便聊聊/没什么事/无聊/就想说说话/陪我聊天 | listen | 无专属 reference |
| SOS | 不想活了/想死/自杀/自伤/割腕/跳楼/活着没意思/撑不住了 | crisis | scenes/sos/ |
路由优先级
用户输入
│
▼
① SOS 关键词检测 ──命中──→ crisis(立即,不经过场景选择)
│
▼(未命中)
② 场景关键词匹配 ──命中──→ 对应 skill 组合 + 加载场景 reference
│
▼(未命中)
③ 历史线索 + 当前上下文推断 ──有匹配──→ 推荐场景,用户确认后路由
│
▼(无匹配)
④ 展示场景列表 ──用户选择──→ 对应 skill 组合
│
▼(用户不选)
⑤ 默认走 listen(随便聊聊)
路由规则
- SOS 一票否决:SOS 关键词一旦命中,无论当前在什么场景,立即切 crisis。不等用户确认,不问"你想聊 SOS 吗"。
- 场景内 skill 切换由 skill 自身决定:进入恋爱场景后,listen 阶段结束是否切 untangle 或 see-pattern,由各 skill 的退出条件判断,scene-router 不干预。
- 跨场景切换需确认:用户在考研场景聊着突然说"我男朋友...",路由器识别到恋爱关键词,但不自动切换。等当前话题告一段落或用户明确要换,才切。
- 多场景重叠取主场景:"我妈催我考研"同时命中家人和考研。取用户情绪指向的主场景——如果在说妈妈让 ta 烦,走家人;如果在说考研压力大,走考研。模糊时问用户:"你更想聊妈妈催你这件事,还是考研本身的压力?"
推荐算法
冷启动(新用户 / 历史线索 < 3 条)
展示 15 个预设场景供选择:
ai_options(
text="今天想聊点什么?",
options=["恋爱", "家人", "室友", "朋友", "考研", "考公", "实习", "求职", "毕业", "学业", "失眠", "认识自己", "容貌焦虑", "随便聊聊", "SOS 紧急求助"]
)
热启动(历史线索 ≥ 3 条)
- 参考
MEMORY.md 和 Slow guidance 里的高频人物 / 事件线索
- 按关联频次排序:最近 7 天内提到最多的人物/事件排在前面
- 混合推荐列表:
推荐列表 = [
用户高频标签 Top 3(如"小白""考研""妈妈"),
最近未完结事件 Top 2(如"跟导师的谈话""实习面试结果"),
预设场景补位(填满到 6-8 个选项)
]
- 展示推荐:
ai_options(
text="最近这些事还在你心里吗?想聊哪个?",
options=["小白的事", "考研", "跟妈妈的关系", "实习面试结果", "失眠", "随便聊聊", "其他..."]
)
深度个性化(历史线索 ≥ 10 条)
- 预设场景标签逐渐消失,完全被用户自己的人物和事件替代
- 推荐文案引用具体未完结事件:
- "上次你提到周五跟导师谈,后来怎么样了?"
- "小白上次说的那件事,你还在想吗?"
- 情绪趋势感知:如果最近 3 次对话情绪强度都 ≥7,推荐 calm-body 或 SOS 作为首选
推荐展示规则
- 选项数量:6-8 个,不超过 10 个。太多让人选择困难。
- "其他..."兜底:永远保留一个"其他..."或"随便聊聊"选项,让用户不被框住。
- SOS 不常驻:正常推荐中不放 SOS,SOS 只通过关键词自动触发。但如果用户最近有 crisis 记录,在推荐末尾低调保留"需要紧急帮助"。
- 不解释推荐理由:不说"因为你最近经常聊小白所以推荐..."。直接展示,像朋友知道你最近在忙什么。
场景 × Skill 交互
场景决定加载哪些 reference,skill 决定如何执行。同一个 listen,在不同场景有不同的回应策略:
| 情况 | 处理方式 |
|---|
| 恋爱场景 + listen | 加载 scenes/romance/ reference,listen 的承接中使用依恋理论相关知识(不说术语) |
| 考研场景 + listen | 加载 scenes/postgrad-exam/ reference,listen 的承接中理解备考焦虑的特殊性 |
| 恋爱场景 + see-pattern | 加载 scenes/romance/ reference,see-pattern 从历史记录里取恋爱相关线索 |
| 失眠场景 + calm-body | 加载 scenes/insomnia/ reference,calm-body 优先选 4-7-8 或身体扫描(非 5-4-3-2-1) |
| SOS 场景 + crisis | 加载 scenes/sos/ reference,crisis QPR 全流程执行,不路由其他 skill |
场景内 skill 切换流
以恋爱场景为例:
用户选择"恋爱"
│
▼
listen(先倾听,加载 scenes/romance/ reference)
│
├─ 用户说的事情很乱 → untangle(拆解后再聚焦)
│ └─ 理清后用户想继续聊 → 回 listen
│
├─ 情绪稳定 + 历史里已有重复模式线索 → see-pattern(呈现跨关系模式)
│ └─ E3 情绪洪水 → 回 listen
│
├─ 用户面临决策("该不该分手") → face-decision(由 AGENTS.md 路由,非本场景预设)
│
└─ 用户想结束 → farewell 或自然结束
历史记录使用
读取
- 新 session 开始时,优先参考
MEMORY.md 和 Slow guidance 里的高频人物、近期事件、未完结话题
- 历史为空时,直接回到冷启动,不要假装自己"记得很多"
- 推荐算法只用已经存在的历史线索,不凭空补人物、不编造旧事
写入
- scene-router 自己不负责强写长期记忆
- 只有当某个场景偏好已经稳定到会影响后续推荐时,才由 Slow 用
write_memory() 补一个简短锚点
禁止清单
| 禁止 | 原因 | 替代 |
|---|
| 自动切换场景不经用户确认 | 打断用户思路 | 等话题告一段落再问 |
| 在推荐中解释"为什么推荐这个" | 像监控,暴露内部逻辑 | 自然展示,像朋友知道你在忙什么 |
| 在 SOS 触发时展示场景选择 | 延误危机干预 | SOS 一票否决,直接 crisis |
| 展示超过 10 个选项 | 选择困难 | 6-8 个,"其他..."兜底 |
| 推荐中常驻 SOS | 造成压力/暗示 | 仅关键词触发,或有 crisis 记录时低调保留 |
| 强制用户选场景才能开聊 | 有些人就是想聊聊 | 默认走 listen |
| 泄漏内部检索动作("我查了你的记忆...") | 暴露系统机制 | 自然引用,不提数据来源 |
与其他模块的关系
| 模块 | 关系 |
|---|
| AGENTS.md | scene-router 的路由表写入 AGENTS.md 的场景路由段,保持三方一致 |
| 各 skill SKILL.md | scene-router 路由到 skill 后,执行逻辑由 SKILL.md 接管 |
| scenes/*/SCENE.md(F16) | 每个场景的 reference 材料、特有规则、禁忌由 SCENE.md 定义 |
| F14 程序主动触发 | Heartbeat 触发时调用 scene-router 的推荐算法生成个性化推荐卡片 |
MEMORY.md + Slow guidance | 推荐算法的数据源,必要时也是场景偏好的存储落点 |
特殊情况处理
| 情况 | 处理 |
|---|
| 用户选了场景但说的内容不匹配 | 以用户实际说的内容为准,静默调整到匹配的场景 |
| 用户中途从恋爱切到考研 | 当前话题自然收束后,提示"要聊聊考研的事吗?",用户确认后切换 |
| 用户说"都有""什么都烦" | 走 untangle 先拆解,不强制选场景 |
| 历史记录为空 | 回退到冷启动,展示 15 预设场景 |
| 用户重复选同一个场景 | 正常路由,不提"你又选这个"。推荐算法自然会把它排在前面 |
| 对话中突然出现 SOS 信号 | 立即中断当前场景,路由 crisis。crisis 结束后不自动回到原场景 |
心理学依据
- 选择架构(Thaler & Sunstein, 2008):默认选项和选项数量影响决策质量。6-8 个选项是认知负荷和选择自由的平衡点。
- 个人中心疗法(Rogers, 1961):尊重用户自主选择。推荐不强制,"其他..."兜底,默认 listen 不设门槛。
- 认知负荷理论(Sweller, 1988):选项过多导致决策疲劳。推荐列表精简,不超过 10 个。
- 近因效应(Murdock, 1962):最近的事件在记忆中更突出。推荐算法按 7 天窗口排序。
不做的
- 不替用户选场景——推荐是建议,选择权在用户
- 不在场景内做 skill 调度——skill 切换由各 skill 的退出条件和 AGENTS.md 路由决定
- 不存储用户没有说过的场景偏好——只记录实际对话中出现的
- 不对场景做心理学诊断——"你总是选恋爱场景"不等于"你有情感依赖"