Skip to content

每日脉冲设计原理

这一页解释 Daily Pulse 为什么能主动给出"今天值得看什么",以及它到底依赖了哪些真实信号

定位:不是新闻流,不是另一个聊天页,而是一个主动策展层

读这一页之前

建议先用过几次 每日脉冲 模块(手动生成几次,给过几条反馈),否则下面提到的"反馈画像""未完成任务""策展输入"等概念会比较抽象。

Daily Pulse 解决的真实问题

很多 AI 产品默认假设用户已经知道自己该问什么。但真实情况经常是:

  • 用户今天刚打开 App,还没有明确问题
  • 用户知道自己最近很忙,但不知道哪件事最值得继续
  • 用户的长期兴趣、工具能力和最近对话其实已经足够推导出几个高价值方向

Daily Pulse 就是把这一步前置掉。

它不是「云端推荐系统」

Daily Pulse 的信号源主要来自本地上下文和本地已经拿到的结果,不是服务端画像

它没有依赖统一账号画像做跨用户推荐,而是围绕这台设备上的真实使用轨迹整理内容。这意味着:

  • 它更像私人策展,不是公域信息流
  • 好坏强烈依赖你的实际使用与反馈纪律
  • 不会凭空知道外部事实——除非你真的给过相关上下文,或最近通过 MCP / 快捷指令拿到了外部结果

八类输入源

Daily Pulse 生成时会构建一个 DailyPulseGenerationInput,主要包含八类信息。

1. 用户主动填写的关注焦点

如果你在 Daily Pulse 页面写了"今天想重点看什么",它会成为最高优先级的个人信号之一。

2. "明日想看什么"策展输入

不是立即生效的临时备注,而是面向下一期的策展要求。

适合放:

  • 明天想继续推进的方向
  • 想减少的主题
  • 希望多给的卡片类型

3. 最近聊天摘录

Daily Pulse 不会把整库历史全部塞进去,只取最近会话的截断片段。

当前实现默认值:

  • 最多取 4 个会话
  • 每个会话最多取 6 条用户/助手消息

目标不是完整复盘,而是判断你最近到底在忙什么。

4. 长期记忆

读取未归档的长期记忆,但不是无限量。

当前默认最多取 8 条,并做长度压缩。

这让 Daily Pulse 能记住:

  • 你长期偏好的内容类型
  • 你一贯在做的项目
  • 你经常关心的技术或创作方向

5. 最近请求日志摘要

把最近 7 天的调用轨迹压成一小段摘要:

  • 请求总数
  • 常用提供商
  • 常用模型

不是给模型看技术报表,而是让它知道你最近的使用重心。

6. 未完成的 Pulse 任务

某张卡片被你转成任务后,不再只是"一次性建议",会在后续生成里继续参与。

设计意图:

  • Daily Pulse 不只负责发现,还要负责推进
  • 不会机械重复原卡片标题,而是倾向"帮你往前走一步"

7. 反馈偏好画像

把历史反馈整理成三类提示:

  • 更可能喜欢的话题
  • 尽量避开的主题
  • 最近几天已经出现过的卡片主题

反馈来源不仅包括手动点赞 / 点踩 / 隐藏,还包括"保存为会话"这类强正反馈。

8. 外部能力与外部结果

最容易被误解的一层。Daily Pulse 区分三种东西:

类型含义
可用能力哪些 MCP 服务器已选中用于聊天、哪些快捷指令可调用
最近真实外部结果快照最近一次快捷指令结果、最近一次 MCP 输出
公告与趋势信号应用内部公告或趋势类信号

一条硬约束

工具能力描述只代表"可以调用",不代表已经拿到了实时数据

只有"最近已获取到的外部结果快照"才代表用户最近真的拿到过的外部内容。

默认开关与保留策略

Daily Pulse 当前实现里有几组非常具体的默认值。

项目默认值
自动生成
MCP 上下文
快捷指令上下文
最近外部结果快照
趋势 / 公告信号
最终展示卡片数3
模型建议产出候选数6
保留运行记录14 天
反馈历史保留120 条
外部信号保留40 条
任务保留80 条

还要注意:

  • 持久化里保留最近若干天的数据
  • 但 UI **默认只展示"今天"**这一期

历史期数主要用于反馈与偏好沉淀,不是把 Daily Pulse 做成时间轴信息流。

模型选择优先级

Daily Pulse 会先尝试专用模型。优先级如下:

  1. 用户明确给 Daily Pulse 指定的专用模型
  2. 当前聊天选中的模型,但必须支持聊天
  3. 已激活模型里第一个支持聊天的模型

让它既能独立调优,也不会在没有专用模型时直接失效。

提示词策略

Daily Pulse 的 system prompt 不是让模型自由发挥,而是明确规定它的职责和边界。

核心规则包括:

  • 基于最近聊天、长期记忆、使用轨迹、反馈、外部能力和用户主动输入做策展
  • 有未完成任务时,优先帮助推进,但不要原封不动复述旧标题
  • 卡片要具体、可继续聊、可直接转成新会话
  • 不要捏造用户经历,也不要凭空编外部事实
  • 给了 MCP / 快捷指令能力时,可以优先推荐"能马上借力推进"的卡片
  • 工具能力描述不等于已经拿到实时数据
  • 输出要有多样性,避免三张卡围着同一件事转
  • 用户明确不喜欢的主题尽量别再推

输出结构

模型必须只返回 JSON,不允许 Markdown 代码块。

结构是固定的:

json
{
  "headline": "一句话总标题",
  "cards": [
    {
      "title": "卡片标题",
      "why": "为什么推荐给用户",
      "summary": "一句或两句摘要",
      "details_markdown": "可保存为聊天的详细 Markdown 内容",
      "suggested_prompt": "用户点继续聊时可直接发送的追问"
    }
  ]
}

五个字段分别解决五个问题:

字段解决
title列表中先看到什么
why为什么是给你的,不是随机选题
summary快速扫一眼值不值得点开
details_markdown保存为会话后能直接当首条内容
suggested_prompt继续聊时不需要自己重新想问题

模型给候选,客户端再筛

Daily Pulse 不是完全相信模型原样输出。实际流程:

  1. 让模型尽量给 6 张候选卡
  2. 客户端把文本做规范化、长度裁剪和兜底
  3. 客户端再根据偏好画像做打分和筛选,最后只保留 3 张

本地筛选规则(可解释的打分逻辑)

规则分数
与用户当前关注焦点相近+4
命中过去的正反馈主题+3
命中最近几天已经展示过的主题-2
命中过去负反馈主题-6
详情足够展开+1

打分之后还会做三件事:

  • 去掉和负反馈高度相似的卡片
  • 去掉彼此过于相似的卡片
  • 尽量避免三张都落在同一类别

这就是为什么 Daily Pulse 看起来像"模型生成",但实际上带着明显的产品策展味道

反馈闭环

一张卡可以触发四类典型反馈:

  • 喜欢
  • 不喜欢
  • 隐藏
  • 保存为会话

这些反馈不会被拿去训练远端推荐模型,而是直接沉淀为本地下次生成时的偏好提示。

换句话说,Daily Pulse 的"学习"更像下一轮策展提示,而不是不可解释的黑盒推荐权重

为什么支持「保存为会话」

这是 Daily Pulse 里一个关键设计

把卡片保存为会话时,系统会:

  • 用卡片标题创建一个新会话
  • 把卡片 details_markdown 作为首条助手消息归档进去
  • 把这次操作记为强正反馈

意味着 Daily Pulse 不是终点,而是聊天入口生成器

为什么支持「转任务」

有些卡片不是马上要聊,而是需要后续推进。

转任务时会保留:

  • 标题
  • 摘要
  • 推荐追问
  • 完成状态

后续生成时,未完成任务会继续影响策展方向。

送达机制为什么不是 100% 必达

Daily Pulse 的提醒与送达是本地能力,不是服务器推送。

当前默认策略:

  • 晨间提醒默认关闭
  • 默认提醒时间 08:30
  • iPhone 在合适时机尽量提前准备今天这一期
  • 如果到了提醒时间后才准备完成,会补发一条"已准备好"通知
  • Apple Watch 更偏向在前台恢复时尝试准备

这套设计的本质是 best-effort

  • 尊重 iOS 系统调度边界
  • 不假装自己有一个永远在线的云端任务中心

怎么准确理解 Daily Pulse

最准确的说法不是"每日推荐",而是:

一个由最近聊天、长期记忆、使用轨迹、外部能力、反馈历史和未完成任务共同驱动的主动策展器

它的价值不在于"替你思考",而在于把你已经积累过但暂时没组织起来的上下文,重新整理成几个可执行入口

下一步