[PRD] arise 长尾记忆与感知增强(mood_congruence + 环境遥测 + 记忆深度搜索 + 习得贴纸 + 跨平台资料拉取)落地 #66
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem Statement
从终端用户角度:现在的 arise 已经有了三因子记忆召回、环境感知、深挖任务委托、Callback 送回等一整套基础设施,但几个真实存在的体验缺口还没被填上——机器人回忆起来的记忆跟当下聊天的心情完全脱节(心情好聊起伤心事、心情差还更容易被拽进负面回忆);对同群其它插件产出之外的感知源(比如摄像头、设备活动这类更私密的环境信号)完全无感知;用户模糊地提起"还记得我们聊过的那个想法吗"这种超出常驻记忆范围的回指时,机器人无法主动去查;群里其它人常用的贴纸,机器人学不会、也用不上;用户同意的情况下,机器人也不会主动去看看用户在其它平台上的动态、借此了解用户近况。
从架构角度:这五个缺口在 ADR-0009(mood_congruence)、ADR-0014(环境遥测)、ADR-0031(记忆深度搜索)、ADR-0024(习得贴纸)、ADR-0027(跨平台资料拉取)里都已经拍过板,Phase 4 PRD(issue #33)当时为了收敛范围明确把这五条排除在外。核实确认:这五条彼此完全独立(互不依赖对方,只各自依赖已经交付的 Phase 1-5 基础设施——三因子召回、
EnvironmentSignaltier-2 管线、工具港、Knowledge 治理形状、Drive Tick light context、深挖任务委托执行核),是目前 design.md 决策基线里唯一还剩的一批"已拍板但零代码"的条目。从维护者角度:这五条不做,design.md/CONTEXT.md 就一直挂着一批"文档说有、代码没有"的条目,容易在未来的实现/审查工作中造成"以为已经实现了"的误判(这类误判在本项目历史上已经发生过不止一次,见既往 memory 记录)。
Solution
一次性把这五个独立缺口的规格定下来,作为一个 PRD 发布,拆成 5 个彼此无依赖的独立 slice(不同于 Phase 4 的分叉 DAG,这次可以真正并行开工,互不等待):
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(记忆情感一致性召回)
环境遥测(Ambient Telemetry)
记忆深度搜索(On-demand Memory Search)
习得贴纸(Learned Sticker)
跨平台资料拉取(Cross-platform Profile Pull)
跨条目共同视角(维护者/部署者)
Implementation Decisions
打包与拆片:5 片彼此无依赖,各自只依赖已交付的既有基础设施(不互相依赖),可完全并行开工——不同于 Phase 4 的分叉 DAG,不需要按依赖顺序等待任何一片先合并。
mood_congruence(三因子召回→四因子,ADR-0009 更新)
RecallWeights新增mood_congruence: float权重字段;score_events打分公式新增第四项。EventRecord/EventCandidate新增写入时的情感态标签字段((valence, energy))——Delta 压缩管线写入事件候选时,顺手读一次该 chat 当前的快情感态(同一次 cycle 内已有的存储访问模式),不新增任何 LLM 调用(这是本条的核心成本约束,呼应"零额外调用"的既定设计)。(valence, energy)与事件写入时标签的相似度,具体距离/相似度函数留实现期选定(PRD 不预先钉死公式细节,同 ADR-0011"具体数字留标定"惯例)。环境遥测(Ambient Telemetry,ADR-0014 更新)
EnvironmentSignal契约(chat_id由 host 决定路由到哪个会话作为呈现载体,subject_id设为信号所指向的用户,plugin/action字段标识来源为环境遥测类);host 侧的 LLM/VLM 预筛选(判断"够不够格当候选")完全是 host 责任,core 不新增任何预筛选逻辑,只负责接收已经筛过的信号。记忆深度搜索(search_memory,ADR-0031)
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契约本身的地方。kind="sticker"媒体引用、且发送者非机器人自己的消息时,立即异步发起一次无工具 VLM 描述请求(复用既有"新鲜上下文、无工具旁路请求"调用模式,但目标是产出"这个贴纸的含义/使用场景"而非"描述画面内容"),不阻塞当轮门控评估/回复延迟,也不受这轮最终是否真的发言影响——同 tier-1 环境感知"常开、独立于主动性判断"的既有哲学,是本条最核心的架构决定。/settool),未开启的 chat 完全不触发识别流程,不产生任何 VLM 调用。MediaRef里提供)去重,同一贴纸已识别过则跳过,不重复调用、不重复落库——区别于 Knowledge 的语义模糊匹配。search_stickers(query)(同search_memory先例,不经工具港,不整份注入),供send_message发贴纸时按需查询;与资源 port 的 host 静态贴纸目录并存不合并(一份 authoritative 常驻,一份学习型按需检索,两者共同构成可选项全集)。跨平台资料拉取(ADR-0027)
spontaneous_goal.py::familiar_reconnect_hint的精确先例形状——新增一个纯函数,输入含"该用户是否已同意"+"距上次拉取时长"等,达标才产出提示文本(否则返回空),注入进 Drive Tick 既有 light context 拼装(同现有reconnect_hint的挂载位置)。未同意的用户,候选纯函数直接不产出提示(同渐进解锁"未解锁=模型看不到"哲学的变体:这里是"未同意=候选不产生")。不新增独立评估通道。delegate池(同现状——六池目前全仓只有 tracing 层面归因,无实际预算/熔断实现,不在本次范围内新增)。get_tools("background")同一契约。Testing Decisions
好的测试只测外部可观察行为,不测内部实现细节。五片各自独立测试,无需共享 fixture。
score_events纯函数测试新增非对称护栏场景(负 valence 时权重打折/失效)+ 缺省标签场景(旧记录判 0),仿现有召回测试模式;Delta 压缩集成测试验证写入事件时确实读取并落盘了情感态标签,不新增额外 LLM 调用(断言脚本化 LLM 客户端的调用次数不变)。RuntimeLoop工具处理测试(脚本化对话:查询→返回召回结果、超长查询触发截断),仿test_delegate_task_tools.py既有工具测试模式;打分逻辑本身复用recall.py既有纯函数测试覆盖,本片只新增"不受 top-K 限制"这一差异点的验证。search_stickers工具测试(仿search_memory);per-chat 开关关闭时零 VLM 调用的测试。spontaneous_goal.py既有测试模式,含未同意用户不产出候选的场景);同意状态存储测试(含撤销后不再触发);执行路径测试,重点验证"可被抢占"这条与深挖任务委托的行为差异——构造真人活跃场景,断言本机制被搁置延后,而对照场景下深挖任务委托不受同等条件影响。Out of Scope
/cost//why//why_query//diagnose、六池成本治理、系统自检信号层)——独立条目,不在本次顺带实现。MediaKind的"file"第四态——CONTEXT.md/ADR-0028 已经决定但从未真正写进代码(本次探索过程中顺手核实到的一个独立缺口,与本 PRD 无关),不在本次范围,留给未来单独一次文档核实工作处理。Further Notes
docs/adr/0028-native-multimodal-routing.md/CONTEXT.md 描述的MediaKind第四态"file"(通用文档附件)从未真正写进代码(conversation.py::MediaKind目前仍只有三态)。这不是本次任务要修的问题,只是核实过程中顺带发现,留给未来某次文档核实工作处理。习得贴纸新增的MediaKind.sticker与这个"file"发现是两件独立的事——前者是本 PRD 明确要做的契约扩展,后者是历史遗留、本 PRD 不碰、也不应该被本 PRD 的 slice 顺手夹带解决。delegate_task本体加来源标记、还是新起一个工具"这个实现细节故意留了活口——这个判断更适合实现期看到实际代码后再定,在还没看实际代码复用成本之前,PRD 里断言"要改"或"不改"深挖任务委托既有代码都为时过早,硬钉死反而可能与"能不碰就不碰已交付代码"的一贯精神冲突。