[PRD] arise 长尾记忆与感知增强(mood_congruence + 环境遥测 + 记忆深度搜索 + 习得贴纸 + 跨平台资料拉取)落地 #66

Closed
opened 2026-07-25 02:08:03 +00:00 by KumaAgent · 0 comments
Member

Problem Statement

从终端用户角度:现在的 arise 已经有了三因子记忆召回、环境感知、深挖任务委托、Callback 送回等一整套基础设施,但几个真实存在的体验缺口还没被填上——机器人回忆起来的记忆跟当下聊天的心情完全脱节(心情好聊起伤心事、心情差还更容易被拽进负面回忆);对同群其它插件产出之外的感知源(比如摄像头、设备活动这类更私密的环境信号)完全无感知;用户模糊地提起"还记得我们聊过的那个想法吗"这种超出常驻记忆范围的回指时,机器人无法主动去查;群里其它人常用的贴纸,机器人学不会、也用不上;用户同意的情况下,机器人也不会主动去看看用户在其它平台上的动态、借此了解用户近况。

从架构角度:这五个缺口在 ADR-0009(mood_congruence)、ADR-0014(环境遥测)、ADR-0031(记忆深度搜索)、ADR-0024(习得贴纸)、ADR-0027(跨平台资料拉取)里都已经拍过板,Phase 4 PRD(issue #33)当时为了收敛范围明确把这五条排除在外。核实确认:这五条彼此完全独立(互不依赖对方,只各自依赖已经交付的 Phase 1-5 基础设施——三因子召回、EnvironmentSignal tier-2 管线、工具港、Knowledge 治理形状、Drive Tick light context、深挖任务委托执行核),是目前 design.md 决策基线里唯一还剩的一批"已拍板但零代码"的条目。

从维护者角度:这五条不做,design.md/CONTEXT.md 就一直挂着一批"文档说有、代码没有"的条目,容易在未来的实现/审查工作中造成"以为已经实现了"的误判(这类误判在本项目历史上已经发生过不止一次,见既往 memory 记录)。

Solution

一次性把这五个独立缺口的规格定下来,作为一个 PRD 发布,拆成 5 个彼此无依赖的独立 slice(不同于 Phase 4 的分叉 DAG,这次可以真正并行开工,互不等待):

  • mood_congruence:三因子召回升级四因子,新增记忆情感一致性偏置项,复用已有情感态/事件写入基础设施,零新增 LLM 调用。
  • 环境遥测EnvironmentSignal 现有契约本身足够通用,只需要给 host 提供的私人环境信号一条跳过 tier-1、直达 tier-2 候选评估的路径。
  • 记忆深度搜索:新增 search_memory 核心工具,复用三因子召回打分逻辑,突破冻结快照 top-K 限制。
  • 习得贴纸:新增 MediaKind.sticker 契约扩展 + 一条独立于两级门控的 fire-and-forget 异步识别流水线,写入治理复用 Knowledge 形状。
  • 跨平台资料拉取:触发候选复用 spontaneous_goal.py 已验证的"纯函数产提示注入 Drive Tick light context"精确形状,执行复用深挖任务委托的执行核但不继承其"履约不可抢占"治理。

User Stories

mood_congruence(记忆情感一致性召回)

  1. 作为用户,我希望机器人回忆起来的事情跟我们当下聊天的气氛更贴——心情好的时候更容易聊起开心的往事,而不是每次召回都是同一批"最相关"但语气完全不搭的记忆。
  2. 作为用户,我希望机器人心情不好的时候,不会因为"心情差更容易想起难过的事"而陷进一个越想越低落的负反馈循环——它应该有意识地不去强化这种下坠。
  3. 作为维护者,我希望这条新增权重是对已有三因子打分函数的纯函数扩展,不引入新的 LLM 调用,也不需要新的存储后端。
  4. 作为验收标准,我希望这个权重项在当前快情感态 valence 为负时确实打折/失效,不是在任何心情下都恒定生效。

环境遥测(Ambient Telemetry)

  1. 作为接了摄像头/设备活动感知的部署者,我希望机器人能从这类私人环境信号里获得一点"氛围感",而不是对对话之外的一切完全无感知。
  2. 作为用户,我不希望机器人因为"看到"我在设备上做什么,就产生一种被监视的神经质反应——它应该只是多了一点参考信息,绝大多数时候依然安安静静,"看了也不说"的沉默权利照常成立。
  3. 作为部署者,我希望没有接这类信号源的部署完全不受影响——这是纯可选能力,不接入任何摄像头/设备感知的 host 不会因为这次改动多出任何新行为。
  4. 作为部署者,我希望这类私人信号不会被误判成"群里很热闹",污染群氛围整体感知的准确性。
  5. 作为验收标准,我希望这类信号确实只喂 tier-2 候选评估,不参与 tier-1 群氛围传染 EMA。

记忆深度搜索(On-demand Memory Search)

  1. 作为用户,我希望我提起"还记得我们聊过的那个想法吗"这种模糊指代时,机器人真能想起来,即使那件事已经超出了它平时自动带着的常驻记忆范围。
  2. 作为维护者,我希望这个能力复用已有的三因子召回打分逻辑,不是另起一套检索算法或评分公式。
  3. 作为部署者,我希望即使有人试图用超长文本作查询参数灌,系统也有兜底截断,不会因为一次异常查询拖慢或搞崩这次请求。
  4. 作为验收标准,我希望这条检索路径不受冻结快照的常驻 top-K 限制,结果也不会被塞进 prefix-cache(本轮才算)。

习得贴纸(Learned Sticker)

  1. 作为用户,我希望机器人会记住群里常用的一些贴纸/表情包是什么意思,供它自己之后发贴纸时用得上。
  2. 作为部署者,我希望这个功能默认关闭——采集别人发的内容默认应该保守,需要我在某个群明确开启才会生效。
  3. 作为用户,我不希望我随手发的每张自拍/截图都被当成"贴纸"分析收集——只有平台意义上真正的贴纸/表情包才算,普通图片不触发这条流水线。
  4. 作为用户,我希望同一张贴纸被识别多次时,机器人不会在库里堆出好几条重复记录。
  5. 作为维护者,我希望贴纸识别是异步的、独立于两级门控——不会因为识别一张贴纸而拖慢机器人当轮的回复速度,即便这轮机器人最终选择沉默不回应,识别本身也照常发生。
  6. 作为部署者,我希望学出来的贴纸含义在真正落库前也过一遍人设漂移守护否决闸,不会被诱导写进不合人设的内容。
  7. 作为用户,我希望这个学习是持续增量的,不需要机器人一次性回顾群里的历史消息才能生效——从功能开启那一刻起,往后新出现的贴纸才会被学习。

跨平台资料拉取(Cross-platform Profile Pull)

  1. 作为用户,我希望机器人只有在我明确同意之后,才会去看我在其它平台上的动态,不是默认就去查。
  2. 作为用户,我希望即使我同意了,机器人也不是每次拉取到内容都主动提起——它可能只是把了解到的信息记下来,不必然生成一条打扰我的消息。
  3. 作为用户,我希望这个拉取行为可以被我当前正在做的事情(比如正跟机器人聊别的)打断/搁置,机器人不会为了坚持完成这件"自己想去做的事"而打扰我们正在进行的对话。
  4. 作为部署者,我希望这个功能复用已有的深挖任务委托执行形态(隔离任务上下文 + 带工具子智能体 + 蒸馏结果返回正常对话),不是另起一整套后台执行机制。
  5. 作为用户,我希望我撤回同意之后,机器人不会再继续尝试拉取我的跨平台资料。

跨条目共同视角(维护者/部署者)

  1. 作为维护者,我希望这 5 个条目各自独立可测、独立可部分交付,不会因为打包在同一个 PRD 里就产生隐藏的相互依赖。
  2. 作为维护者,我希望能验证这次真的没有改动任何一条已有生产管线的核心行为(三因子召回排序算法本身、tier-2 门控裁决逻辑、Delta 压缩、深挖任务委托执行核)——这五条都是新增,不是重构。
  3. 作为部署者,我希望这些新功能里除了习得贴纸沿用既有 sticker 能力位以外,都不需要声明任何新的能力位就能工作,不会让现有部署突然多出一堆必须回答的新配置项。

Implementation Decisions

打包与拆片:5 片彼此无依赖,各自只依赖已交付的既有基础设施(不互相依赖),可完全并行开工——不同于 Phase 4 的分叉 DAG,不需要按依赖顺序等待任何一片先合并。

mood_congruence(三因子召回→四因子,ADR-0009 更新)

  • RecallWeights 新增 mood_congruence: float 权重字段;score_events 打分公式新增第四项。
  • EventRecord/EventCandidate 新增写入时的情感态标签字段((valence, energy))——Delta 压缩管线写入事件候选时,顺手读一次该 chat 当前的快情感态(同一次 cycle 内已有的存储访问模式),不新增任何 LLM 调用(这是本条的核心成本约束,呼应"零额外调用"的既定设计)。
  • mood_congruence 项:当前快情感态 (valence, energy) 与事件写入时标签的相似度,具体距离/相似度函数留实现期选定(PRD 不预先钉死公式细节,同 ADR-0011"具体数字留标定"惯例)。
  • 非对称护栏:当前 valence 为负时,该项权重打折/失效——防止"心情差→更容易召回难过记忆→心情更差"的正反馈环,这是本条唯一不可省略的行为约束。
  • 字段引入前已落盘的旧存量事件——缺省该标签,mood_congruence 项对这些旧记录直接判 0(不假装知道、不做历史回填),同其余快照分段"无数据即空"的既有哲学。

环境遥测(Ambient Telemetry,ADR-0014 更新)

  • 不新增任何字段/类型——host 直接复用现有 EnvironmentSignal 契约(chat_id 由 host 决定路由到哪个会话作为呈现载体,subject_id 设为信号所指向的用户,plugin/action 字段标识来源为环境遥测类);host 侧的 LLM/VLM 预筛选(判断"够不够格当候选")完全是 host 责任,core 不新增任何预筛选逻辑,只负责接收已经筛过的信号。
  • 明确跳过 tier-1:现有的环境信号处理入口无条件先跑 tier-1(喂群氛围传染 EMA)再跑 tier-2——需要给这类信号一条不同的处理路径,跳过 tier-1、直接进入 tier-2 候选评估。"群氛围"这个概念不适用私人环境信号,混进 tier-1 会污染氛围感知的准确性,这是本条最关键的行为边界。

记忆深度搜索(search_memory,ADR-0031)

  • 新增 core 原生工具 search_memory(query)(同 note_pending_intent/delegate_task/search_stickers 先例,不经工具港),复用三因子召回的打分逻辑,但检索范围不受冻结快照常驻 top-K 限制(工具调用可以取更大的候选池,具体数字留实现期定),结果不进 prefix-cache(本轮才算,同触发注入"本轮才算"的既有先例)。
  • 查询参数超长时硬截断,防止查询向量被无关文本稀释导致召回质量下降。
  • 计入 run_limit(同工具港既有工具一样,是一次"推理"工具调用,不豁免)。

习得贴纸(Learned Sticker,ADR-0024)

  • MediaKind 新增 "sticker" 取值(现有仅 "image"/"video"/"audio" 三态)——host 的前处理 port 需要能区分"平台意义上的贴纸/表情包"与"普通图片",只有 kind="sticker" 的媒体才进入识别流程,普通 "image" 不触发。这是本次唯一需要扩展 conversation.py/MediaRef 契约本身的地方。
  • 触发点:fire-and-forget 异步识别——收到带 kind="sticker" 媒体引用、且发送者非机器人自己的消息时,立即异步发起一次无工具 VLM 描述请求(复用既有"新鲜上下文、无工具旁路请求"调用模式,但目标是产出"这个贴纸的含义/使用场景"而非"描述画面内容"),不阻塞当轮门控评估/回复延迟,也不受这轮最终是否真的发言影响——同 tier-1 环境感知"常开、独立于主动性判断"的既有哲学,是本条最核心的架构决定。
  • per-chat 默认关(opt-in):新增能力/配置开关(心智模型同既有 /settool),未开启的 chat 完全不触发识别流程,不产生任何 VLM 调用。
  • 精确去重:按贴纸文件标识(平台稳定 ID/hash,由 host 在 MediaRef 里提供)去重,同一贴纸已识别过则跳过,不重复调用、不重复落库——区别于 Knowledge 的语义模糊匹配。
  • 写入治理复用 Knowledge 形状:sensitivity fail-closed 打标、per-chat_id 作用域、落库前过人设漂移守护否决闸(同 Delta 压缩管线既有的独立调用模式,但触发源是这条新的异步识别流水线而非 Delta 压缩本身)。
  • 检索:新增工具 search_stickers(query)(同 search_memory 先例,不经工具港,不整份注入),供 send_message 发贴纸时按需查询;与资源 port 的 host 静态贴纸目录并存不合并(一份 authoritative 常驻,一份学习型按需检索,两者共同构成可选项全集)。

跨平台资料拉取(ADR-0027)

  • 触发候选:复用 spontaneous_goal.py::familiar_reconnect_hint 的精确先例形状——新增一个纯函数,输入含"该用户是否已同意"+"距上次拉取时长"等,达标才产出提示文本(否则返回空),注入进 Drive Tick 既有 light context 拼装(同现有 reconnect_hint 的挂载位置)。未同意的用户,候选纯函数直接不产出提示(同渐进解锁"未解锁=模型看不到"哲学的变体:这里是"未同意=候选不产生")。不新增独立评估通道。
  • 执行:复用深挖任务委托的执行形状(隔离任务上下文 + 带工具子智能体 + 蒸馏返回主循环,子智能体不直接对用户说话)——但不复用其"履约不可抢占"治理:本机制没有"用户已经在等"这个前提,仍受红线3约束,可被真人活跃抢占/搁置,不做"已经应声了就必须完成"的承诺。是否为此单独起一个新的 core 工具、还是复用既有深挖任务委托执行核加一个来源标记——留实现期按实际代码复用成本决定,PRD 只钉死行为契约(可抢占),不预先断言具体要不要改动深挖任务委托现有代码。
  • 同意机制:per-user 显式同意(用户级命令,内容所有者本人同意,不走 host 权限管理命令体系),可撤销——新增一份同意状态存储,per-user。
  • 产出治理:写入既有画像治理(sensitivity 分桶 + 人设漂移守护);成本概念上归入深挖任务委托的 delegate 池(同现状——六池目前全仓只有 tracing 层面归因,无实际预算/熔断实现,不在本次范围内新增)。
  • 抓取工具:经工具港由 host 注册(core 不认识任何具体平台 API),复用 get_tools("background") 同一契约。

Testing Decisions

好的测试只测外部可观察行为,不测内部实现细节。五片各自独立测试,无需共享 fixture。

  • mood_congruencescore_events 纯函数测试新增非对称护栏场景(负 valence 时权重打折/失效)+ 缺省标签场景(旧记录判 0),仿现有召回测试模式;Delta 压缩集成测试验证写入事件时确实读取并落盘了情感态标签,不新增额外 LLM 调用(断言脚本化 LLM 客户端的调用次数不变)。
  • 环境遥测:环境信号处理入口的分流逻辑测试——ambient 来源信号确实不触碰 tier-1(fast/slow 情感态在处理前后不变),照常进入 tier-2 候选评估,仿现有环境感知测试模式新增分流场景。
  • 记忆深度搜索RuntimeLoop 工具处理测试(脚本化对话:查询→返回召回结果、超长查询触发截断),仿 test_delegate_task_tools.py 既有工具测试模式;打分逻辑本身复用 recall.py 既有纯函数测试覆盖,本片只新增"不受 top-K 限制"这一差异点的验证。
  • 习得贴纸:纯函数(去重判定/sensitivity 打标);异步识别流水线测试(用假 VLM 客户端驱动,验证不阻塞回复延迟、门控判沉默时识别依然发生);写入治理测试(复用 Knowledge 测试模式验证人设漂移守护拦截路径);search_stickers 工具测试(仿 search_memory);per-chat 开关关闭时零 VLM 调用的测试。
  • 跨平台资料拉取:触发候选纯函数测试(仿 spontaneous_goal.py 既有测试模式,含未同意用户不产出候选的场景);同意状态存储测试(含撤销后不再触发);执行路径测试,重点验证"可被抢占"这条与深挖任务委托的行为差异——构造真人活跃场景,断言本机制被搁置延后,而对照场景下深挖任务委托不受同等条件影响。

Out of Scope

  • ADR-0010 完整运营面/cost//why//why_query//diagnose、六池成本治理、系统自检信号层)——独立条目,不在本次顺带实现。
  • 深挖任务委托的"灰度可一键关"缺口issue #61)——独立跟踪,不在本次范围。
  • MediaKind"file" 第四态——CONTEXT.md/ADR-0028 已经决定但从未真正写进代码(本次探索过程中顺手核实到的一个独立缺口,与本 PRD 无关),不在本次范围,留给未来单独一次文档核实工作处理。
  • 贴纸识别的历史回填——只做功能开启后的实时增量识别,不做"回顾群历史消息批量重新分析"。
  • 跨平台资料拉取的具体平台适配(QQ空间/朋友圈/Telegram 动态等抓取工具本身的实现)——那是 host 经工具港注册的责任,core 侧只钉死执行契约形状,不实现任何具体平台对接。
  • 记忆深度搜索的排序算法改进/多路检索融合——ADR-0009 已经明确否决过"向量三因子召回与 Knowledge 关键词路径融合",本次沿用既有立场,不重新评估。

Further Notes

  • 探索过程中顺手核实到一个独立于本 PRD 范围的文档-实现落差:docs/adr/0028-native-multimodal-routing.md/CONTEXT.md 描述的 MediaKind 第四态 "file"(通用文档附件)从未真正写进代码(conversation.py::MediaKind 目前仍只有三态)。这不是本次任务要修的问题,只是核实过程中顺带发现,留给未来某次文档核实工作处理。习得贴纸新增的 MediaKind.sticker 与这个"file"发现是两件独立的事——前者是本 PRD 明确要做的契约扩展,后者是历史遗留、本 PRD 不碰、也不应该被本 PRD 的 slice 顺手夹带解决。
  • 跨平台资料拉取"是否复用 delegate_task 本体加来源标记、还是新起一个工具"这个实现细节故意留了活口——这个判断更适合实现期看到实际代码后再定,在还没看实际代码复用成本之前,PRD 里断言"要改"或"不改"深挖任务委托既有代码都为时过早,硬钉死反而可能与"能不碰就不碰已交付代码"的一贯精神冲突。
  • 5 片都建议在各自 PR 里同样验证一遍"没有意外改动任何既有测试的断言"——这五个条目全部是在已经交付、经过多轮验证的基础设施上做新增,任何一片如果导致既有测试需要改断言(而非纯新增测试),本身就是一个值得停下来核实的信号。
## Problem Statement 从终端用户角度:现在的 arise 已经有了三因子记忆召回、环境感知、深挖任务委托、Callback 送回等一整套基础设施,但几个真实存在的体验缺口还没被填上——机器人回忆起来的记忆跟当下聊天的心情完全脱节(心情好聊起伤心事、心情差还更容易被拽进负面回忆);对同群其它插件产出之外的感知源(比如摄像头、设备活动这类更私密的环境信号)完全无感知;用户模糊地提起"还记得我们聊过的那个想法吗"这种超出常驻记忆范围的回指时,机器人无法主动去查;群里其它人常用的贴纸,机器人学不会、也用不上;用户同意的情况下,机器人也不会主动去看看用户在其它平台上的动态、借此了解用户近况。 从架构角度:这五个缺口在 [ADR-0009](../docs/adr/0009-memory-engineering.md)(mood_congruence)、[ADR-0014](../docs/adr/0014-environmental-awareness.md)(环境遥测)、[ADR-0031](../docs/adr/0031-on-demand-memory-search.md)(记忆深度搜索)、[ADR-0024](../docs/adr/0024-learned-stickers.md)(习得贴纸)、[ADR-0027](../docs/adr/0027-cross-platform-profile-pull.md)(跨平台资料拉取)里都已经拍过板,Phase 4 PRD(issue #33)当时为了收敛范围明确把这五条排除在外。核实确认:这五条彼此完全独立(互不依赖对方,只各自依赖已经交付的 Phase 1-5 基础设施——三因子召回、`EnvironmentSignal` tier-2 管线、工具港、Knowledge 治理形状、Drive Tick light context、深挖任务委托执行核),是目前 design.md 决策基线里唯一还剩的一批"已拍板但零代码"的条目。 从维护者角度:这五条不做,design.md/CONTEXT.md 就一直挂着一批"文档说有、代码没有"的条目,容易在未来的实现/审查工作中造成"以为已经实现了"的误判(这类误判在本项目历史上已经发生过不止一次,见既往 memory 记录)。 ## Solution 一次性把这五个独立缺口的规格定下来,作为一个 PRD 发布,拆成 5 个彼此无依赖的独立 slice(不同于 Phase 4 的分叉 DAG,这次可以真正并行开工,互不等待): - **mood_congruence**:三因子召回升级四因子,新增记忆情感一致性偏置项,复用已有情感态/事件写入基础设施,零新增 LLM 调用。 - **环境遥测**:`EnvironmentSignal` 现有契约本身足够通用,只需要给 host 提供的私人环境信号一条跳过 tier-1、直达 tier-2 候选评估的路径。 - **记忆深度搜索**:新增 `search_memory` 核心工具,复用三因子召回打分逻辑,突破冻结快照 top-K 限制。 - **习得贴纸**:新增 `MediaKind.sticker` 契约扩展 + 一条独立于两级门控的 fire-and-forget 异步识别流水线,写入治理复用 Knowledge 形状。 - **跨平台资料拉取**:触发候选复用 `spontaneous_goal.py` 已验证的"纯函数产提示注入 Drive Tick light context"精确形状,执行复用深挖任务委托的执行核但不继承其"履约不可抢占"治理。 ## User Stories **mood_congruence(记忆情感一致性召回)** 1. 作为用户,我希望机器人回忆起来的事情跟我们当下聊天的气氛更贴——心情好的时候更容易聊起开心的往事,而不是每次召回都是同一批"最相关"但语气完全不搭的记忆。 2. 作为用户,我希望机器人心情不好的时候,不会因为"心情差更容易想起难过的事"而陷进一个越想越低落的负反馈循环——它应该有意识地不去强化这种下坠。 3. 作为维护者,我希望这条新增权重是对已有三因子打分函数的纯函数扩展,不引入新的 LLM 调用,也不需要新的存储后端。 4. 作为验收标准,我希望这个权重项在当前快情感态 valence 为负时确实打折/失效,不是在任何心情下都恒定生效。 **环境遥测(Ambient Telemetry)** 5. 作为接了摄像头/设备活动感知的部署者,我希望机器人能从这类私人环境信号里获得一点"氛围感",而不是对对话之外的一切完全无感知。 6. 作为用户,我不希望机器人因为"看到"我在设备上做什么,就产生一种被监视的神经质反应——它应该只是多了一点参考信息,绝大多数时候依然安安静静,"看了也不说"的沉默权利照常成立。 7. 作为部署者,我希望没有接这类信号源的部署完全不受影响——这是纯可选能力,不接入任何摄像头/设备感知的 host 不会因为这次改动多出任何新行为。 8. 作为部署者,我希望这类私人信号不会被误判成"群里很热闹",污染群氛围整体感知的准确性。 9. 作为验收标准,我希望这类信号确实只喂 tier-2 候选评估,不参与 tier-1 群氛围传染 EMA。 **记忆深度搜索(On-demand Memory Search)** 10. 作为用户,我希望我提起"还记得我们聊过的那个想法吗"这种模糊指代时,机器人真能想起来,即使那件事已经超出了它平时自动带着的常驻记忆范围。 11. 作为维护者,我希望这个能力复用已有的三因子召回打分逻辑,不是另起一套检索算法或评分公式。 12. 作为部署者,我希望即使有人试图用超长文本作查询参数灌,系统也有兜底截断,不会因为一次异常查询拖慢或搞崩这次请求。 13. 作为验收标准,我希望这条检索路径不受冻结快照的常驻 top-K 限制,结果也不会被塞进 prefix-cache(本轮才算)。 **习得贴纸(Learned Sticker)** 14. 作为用户,我希望机器人会记住群里常用的一些贴纸/表情包是什么意思,供它自己之后发贴纸时用得上。 15. 作为部署者,我希望这个功能默认关闭——采集别人发的内容默认应该保守,需要我在某个群明确开启才会生效。 16. 作为用户,我不希望我随手发的每张自拍/截图都被当成"贴纸"分析收集——只有平台意义上真正的贴纸/表情包才算,普通图片不触发这条流水线。 17. 作为用户,我希望同一张贴纸被识别多次时,机器人不会在库里堆出好几条重复记录。 18. 作为维护者,我希望贴纸识别是异步的、独立于两级门控——不会因为识别一张贴纸而拖慢机器人当轮的回复速度,即便这轮机器人最终选择沉默不回应,识别本身也照常发生。 19. 作为部署者,我希望学出来的贴纸含义在真正落库前也过一遍人设漂移守护否决闸,不会被诱导写进不合人设的内容。 20. 作为用户,我希望这个学习是持续增量的,不需要机器人一次性回顾群里的历史消息才能生效——从功能开启那一刻起,往后新出现的贴纸才会被学习。 **跨平台资料拉取(Cross-platform Profile Pull)** 21. 作为用户,我希望机器人只有在我明确同意之后,才会去看我在其它平台上的动态,不是默认就去查。 22. 作为用户,我希望即使我同意了,机器人也不是每次拉取到内容都主动提起——它可能只是把了解到的信息记下来,不必然生成一条打扰我的消息。 23. 作为用户,我希望这个拉取行为可以被我当前正在做的事情(比如正跟机器人聊别的)打断/搁置,机器人不会为了坚持完成这件"自己想去做的事"而打扰我们正在进行的对话。 24. 作为部署者,我希望这个功能复用已有的深挖任务委托执行形态(隔离任务上下文 + 带工具子智能体 + 蒸馏结果返回正常对话),不是另起一整套后台执行机制。 25. 作为用户,我希望我撤回同意之后,机器人不会再继续尝试拉取我的跨平台资料。 **跨条目共同视角(维护者/部署者)** 26. 作为维护者,我希望这 5 个条目各自独立可测、独立可部分交付,不会因为打包在同一个 PRD 里就产生隐藏的相互依赖。 27. 作为维护者,我希望能验证这次真的没有改动任何一条已有生产管线的核心行为(三因子召回排序算法本身、tier-2 门控裁决逻辑、Delta 压缩、深挖任务委托执行核)——这五条都是新增,不是重构。 28. 作为部署者,我希望这些新功能里除了习得贴纸沿用既有 sticker 能力位以外,都不需要声明任何新的能力位就能工作,不会让现有部署突然多出一堆必须回答的新配置项。 ## Implementation Decisions **打包与拆片**:5 片彼此无依赖,各自只依赖已交付的既有基础设施(不互相依赖),可完全并行开工——不同于 Phase 4 的分叉 DAG,不需要按依赖顺序等待任何一片先合并。 ### mood_congruence(三因子召回→四因子,ADR-0009 更新) - `RecallWeights` 新增 `mood_congruence: float` 权重字段;`score_events` 打分公式新增第四项。 - `EventRecord`/`EventCandidate` 新增写入时的情感态标签字段(`(valence, energy)`)——Delta 压缩管线写入事件候选时,顺手读一次该 chat 当前的快情感态(同一次 cycle 内已有的存储访问模式),**不新增任何 LLM 调用**(这是本条的核心成本约束,呼应"零额外调用"的既定设计)。 - mood_congruence 项:当前快情感态 `(valence, energy)` 与事件写入时标签的相似度,具体距离/相似度函数留实现期选定(PRD 不预先钉死公式细节,同 ADR-0011"具体数字留标定"惯例)。 - **非对称护栏**:当前 valence 为负时,该项权重打折/失效——防止"心情差→更容易召回难过记忆→心情更差"的正反馈环,这是本条唯一不可省略的行为约束。 - 字段引入前已落盘的旧存量事件——缺省该标签,mood_congruence 项对这些旧记录直接判 0(不假装知道、不做历史回填),同其余快照分段"无数据即空"的既有哲学。 ### 环境遥测(Ambient Telemetry,ADR-0014 更新) - **不新增任何字段/类型**——host 直接复用现有 `EnvironmentSignal` 契约(`chat_id` 由 host 决定路由到哪个会话作为呈现载体,`subject_id` 设为信号所指向的用户,`plugin`/`action` 字段标识来源为环境遥测类);host 侧的 LLM/VLM 预筛选(判断"够不够格当候选")完全是 host 责任,core 不新增任何预筛选逻辑,只负责接收已经筛过的信号。 - **明确跳过 tier-1**:现有的环境信号处理入口无条件先跑 tier-1(喂群氛围传染 EMA)再跑 tier-2——需要给这类信号一条不同的处理路径,跳过 tier-1、直接进入 tier-2 候选评估。"群氛围"这个概念不适用私人环境信号,混进 tier-1 会污染氛围感知的准确性,这是本条最关键的行为边界。 ### 记忆深度搜索(search_memory,ADR-0031) - 新增 core 原生工具 `search_memory(query)`(同 `note_pending_intent`/`delegate_task`/`search_stickers` 先例,不经工具港),复用三因子召回的打分逻辑,但检索范围**不受**冻结快照常驻 top-K 限制(工具调用可以取更大的候选池,具体数字留实现期定),结果**不进 prefix-cache**(本轮才算,同触发注入"本轮才算"的既有先例)。 - 查询参数超长时硬截断,防止查询向量被无关文本稀释导致召回质量下降。 - 计入 `run_limit`(同工具港既有工具一样,是一次"推理"工具调用,不豁免)。 ### 习得贴纸(Learned Sticker,ADR-0024) - **`MediaKind` 新增 `"sticker"` 取值**(现有仅 `"image"`/`"video"`/`"audio"` 三态)——host 的前处理 port 需要能区分"平台意义上的贴纸/表情包"与"普通图片",只有 `kind="sticker"` 的媒体才进入识别流程,普通 `"image"` 不触发。这是本次唯一需要扩展 `conversation.py`/`MediaRef` 契约本身的地方。 - **触发点:fire-and-forget 异步识别**——收到带 `kind="sticker"` 媒体引用、且发送者非机器人自己的消息时,立即异步发起一次无工具 VLM 描述请求(复用既有"新鲜上下文、无工具旁路请求"调用模式,但目标是产出"这个贴纸的含义/使用场景"而非"描述画面内容"),**不阻塞当轮门控评估/回复延迟,也不受这轮最终是否真的发言影响**——同 tier-1 环境感知"常开、独立于主动性判断"的既有哲学,是本条最核心的架构决定。 - **per-chat 默认关(opt-in)**:新增能力/配置开关(心智模型同既有 `/settool`),未开启的 chat 完全不触发识别流程,不产生任何 VLM 调用。 - **精确去重**:按贴纸文件标识(平台稳定 ID/hash,由 host 在 `MediaRef` 里提供)去重,同一贴纸已识别过则跳过,不重复调用、不重复落库——区别于 Knowledge 的语义模糊匹配。 - **写入治理复用 Knowledge 形状**:sensitivity fail-closed 打标、per-chat_id 作用域、落库前过人设漂移守护否决闸(同 Delta 压缩管线既有的独立调用模式,但触发源是这条新的异步识别流水线而非 Delta 压缩本身)。 - **检索**:新增工具 `search_stickers(query)`(同 `search_memory` 先例,不经工具港,不整份注入),供 `send_message` 发贴纸时按需查询;与资源 port 的 host 静态贴纸目录并存不合并(一份 authoritative 常驻,一份学习型按需检索,两者共同构成可选项全集)。 ### 跨平台资料拉取(ADR-0027) - **触发候选**:复用 `spontaneous_goal.py::familiar_reconnect_hint` 的精确先例形状——新增一个纯函数,输入含"该用户是否已同意"+"距上次拉取时长"等,达标才产出提示文本(否则返回空),注入进 Drive Tick 既有 light context 拼装(同现有 `reconnect_hint` 的挂载位置)。**未同意的用户,候选纯函数直接不产出提示**(同渐进解锁"未解锁=模型看不到"哲学的变体:这里是"未同意=候选不产生")。不新增独立评估通道。 - **执行**:复用深挖任务委托的执行形状(隔离任务上下文 + 带工具子智能体 + 蒸馏返回主循环,子智能体不直接对用户说话)——但**不复用其"履约不可抢占"治理**:本机制没有"用户已经在等"这个前提,仍受红线3约束,可被真人活跃抢占/搁置,不做"已经应声了就必须完成"的承诺。是否为此单独起一个新的 core 工具、还是复用既有深挖任务委托执行核加一个来源标记——留实现期按实际代码复用成本决定,PRD 只钉死行为契约(可抢占),不预先断言具体要不要改动深挖任务委托现有代码。 - **同意机制**:per-user 显式同意(用户级命令,内容所有者本人同意,不走 host 权限管理命令体系),可撤销——新增一份同意状态存储,per-user。 - **产出治理**:写入既有画像治理(sensitivity 分桶 + 人设漂移守护);成本概念上归入深挖任务委托的 `delegate` 池(同现状——六池目前全仓只有 tracing 层面归因,无实际预算/熔断实现,不在本次范围内新增)。 - **抓取工具**:经工具港由 host 注册(core 不认识任何具体平台 API),复用 `get_tools("background")` 同一契约。 ## Testing Decisions 好的测试只测外部可观察行为,不测内部实现细节。五片各自独立测试,无需共享 fixture。 - **mood_congruence**:`score_events` 纯函数测试新增非对称护栏场景(负 valence 时权重打折/失效)+ 缺省标签场景(旧记录判 0),仿现有召回测试模式;Delta 压缩集成测试验证写入事件时确实读取并落盘了情感态标签,不新增额外 LLM 调用(断言脚本化 LLM 客户端的调用次数不变)。 - **环境遥测**:环境信号处理入口的分流逻辑测试——ambient 来源信号确实不触碰 tier-1(fast/slow 情感态在处理前后不变),照常进入 tier-2 候选评估,仿现有环境感知测试模式新增分流场景。 - **记忆深度搜索**:`RuntimeLoop` 工具处理测试(脚本化对话:查询→返回召回结果、超长查询触发截断),仿 `test_delegate_task_tools.py` 既有工具测试模式;打分逻辑本身复用 `recall.py` 既有纯函数测试覆盖,本片只新增"不受 top-K 限制"这一差异点的验证。 - **习得贴纸**:纯函数(去重判定/sensitivity 打标);异步识别流水线测试(用假 VLM 客户端驱动,验证不阻塞回复延迟、门控判沉默时识别依然发生);写入治理测试(复用 Knowledge 测试模式验证人设漂移守护拦截路径);`search_stickers` 工具测试(仿 `search_memory`);per-chat 开关关闭时零 VLM 调用的测试。 - **跨平台资料拉取**:触发候选纯函数测试(仿 `spontaneous_goal.py` 既有测试模式,含未同意用户不产出候选的场景);同意状态存储测试(含撤销后不再触发);执行路径测试,重点验证"可被抢占"这条与深挖任务委托的行为差异——构造真人活跃场景,断言本机制被搁置延后,而对照场景下深挖任务委托不受同等条件影响。 ## Out of Scope - **ADR-0010 完整运营面**(`/cost`/`/why`/`/why_query`/`/diagnose`、六池成本治理、系统自检信号层)——独立条目,不在本次顺带实现。 - **深挖任务委托的"灰度可一键关"缺口**([issue #61](https://code.srcz.one/ProjectKuma/arise/issues/61))——独立跟踪,不在本次范围。 - **`MediaKind` 的 `"file"` 第四态**——CONTEXT.md/ADR-0028 已经决定但从未真正写进代码(本次探索过程中顺手核实到的一个独立缺口,与本 PRD 无关),不在本次范围,留给未来单独一次文档核实工作处理。 - **贴纸识别的历史回填**——只做功能开启后的实时增量识别,不做"回顾群历史消息批量重新分析"。 - **跨平台资料拉取的具体平台适配**(QQ空间/朋友圈/Telegram 动态等抓取工具本身的实现)——那是 host 经工具港注册的责任,core 侧只钉死执行契约形状,不实现任何具体平台对接。 - **记忆深度搜索的排序算法改进/多路检索融合**——ADR-0009 已经明确否决过"向量三因子召回与 Knowledge 关键词路径融合",本次沿用既有立场,不重新评估。 ## Further Notes - 探索过程中顺手核实到一个独立于本 PRD 范围的文档-实现落差:`docs/adr/0028-native-multimodal-routing.md`/CONTEXT.md 描述的 `MediaKind` 第四态 `"file"`(通用文档附件)从未真正写进代码(`conversation.py::MediaKind` 目前仍只有三态)。这不是本次任务要修的问题,只是核实过程中顺带发现,留给未来某次文档核实工作处理。习得贴纸新增的 `MediaKind.sticker` 与这个"file"发现是两件独立的事——前者是本 PRD 明确要做的契约扩展,后者是历史遗留、本 PRD 不碰、也不应该被本 PRD 的 slice 顺手夹带解决。 - 跨平台资料拉取"是否复用 `delegate_task` 本体加来源标记、还是新起一个工具"这个实现细节故意留了活口——这个判断更适合实现期看到实际代码后再定,在还没看实际代码复用成本之前,PRD 里断言"要改"或"不改"深挖任务委托既有代码都为时过早,硬钉死反而可能与"能不碰就不碰已交付代码"的一贯精神冲突。 - 5 片都建议在各自 PR 里同样验证一遍"没有意外改动任何既有测试的断言"——这五个条目全部是在已经交付、经过多轮验证的基础设施上做新增,任何一片如果导致既有测试需要改断言(而非纯新增测试),本身就是一个值得停下来核实的信号。
Yushu closed this issue 2026-07-27 04:38:15 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ProjectKuma/arise#66
No description provided.