mood_congruence:三因子召回升级四因子情感一致性偏置 #72
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/67-mood-congruence"
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?
Closes #67
What
三因子召回(recency + importance + 向量余弦)升级为四因子,新增 mood_congruence 情感一致性偏置——机器人回忆起来的记忆跟当下聊天的心情更贴,心情好的时候更容易聊起开心的往事。复用已有情感态/事件写入基础设施,零新增 LLM 调用。
实现要点
MoodTag(affective_state.py):valence/energy 两轴的写入时情感态标签。不复用三轴AffectiveState——dominance 在写入侧从不被标注;EventRecord/EventCandidate持有单个mood: MoodTag | None,"只知道 valence 不知道 energy"这种半填状态不可表示。mood_similarity(affective_state.py):归一化欧氏距离相似度,落在 [0,1],与其余三项同量纲。选欧氏而非余弦——中性态 (0,0) 是最常见的默认值,余弦对零向量未定义/数值不稳定。delta.py):Delta 压缩 cycle 落盘事件前读一次该 chat 当前快情感态,同批事件共用同一标签;只在真有事件候选时才读(同_flush既有节流手法)。零新增 LLM 调用。RecallWeights.mood_congruence_negative_guard_factor打折,防"心情差→更容易召回难过记忆→心情更差"正反馈环。系数默认取打折态而非 1.0——"忘了配"落在保守侧。current_mood缺省None时该项恒为 0,既有三因子排序行为完全不变。_recall_events只在 mood_congruence 权重非零且真有候选时才读快情感态。Review
/code-review两轴(Standards + Spec)已跑,两轴都发现了真实问题:_recall_events最初无条件读快情感态(即便权重为 0),逼得既有测试test_a_single_send_never_reads_affective_state只能从"整轮零读"改写成计数断言——违反 AC"既有测试断言不受意外改动"。加守卫后旧测试原文恢复,热路径也少一次 DB 查询。另补了storage.py真实路径的 MoodTag 往返测试(此前只覆盖内存假存储)。mood_valence/mood_energy这对裸 float 在 7 处成对旅行且允许非法半填状态——收口成MoodTag;mood_similarity随之迁到MoodTag旁边(它本就只是两个情感态间的距离,不该住在recall.py反向 importAXIS_BOUND);护栏系数并入RecallWeights,消掉RuntimeLoop构造器那一串散射改动。Tests
全仓库 942 个测试通过(新增约 20 个:
mood_similarity纯函数、score_events四因子/护栏/旧记录判 0、Delta 打标签 + 零新增 LLM 调用断言、持久化往返、_recall_events接线与读取节流、端到端排序验证)。