> 🤖 本 issue 由审阅 agent 手动提交(`File agent issue` workflow 尚未进入 `main`),结论**未经维护者核实**,不代表维护者判断。 ## 问题 三个 `weight_pooling` 在强度和为 0 时直接返回 `Err`: ```rust // crates/soul-mem-query/src/embedding/situation/event.rs:30-34 // (emotion.rs:22-26 / sensory_data.rs:22-26 同款) let intensity_sum = events.iter().map(|e| e.intensity).sum::<f32>(); if intensity_sum == 0.0 { return Err(EmbeddingCalcError::InvalidNumValue); } ``` 而 `intensity` 是 core 里的裸 `pub f32`(`crates/soul-mem-core/src/memory_note/situation_mem.rs:169,185,206`),从 LLM 产出的 JSON 直接反序列化,**全工作区没有任何校验或钳制**。 因此一条 `Emotion { name: "平静", intensity: 0.0 }`(或 `action_intensity: 0.0`、感官 `intensity: 0.0`)会让**整条记忆**(含 tag 与 narrative)的 `embed` 失败。后果是静默且不可逆的:运行时写不进 DB(`mapper/note.rs:231` 硬要求 `tag_emb`,否则 `MapperError::MissingField`),也没有任何 KNN 列能索引它——该记忆**永远检索不到**,且没有任何报错。 同一处的第二个缺陷:守卫只挡「精确 0」。 - `[-0.5, 0.5]` → 和为 0 → `Err`(整条记忆丢失); - `[-0.6, 0.5]` → 和为负 → 权重 `intensity / intensity_sum` 变**负**,最强的信号起反向作用(静默反转,无测试覆盖)。 ## 最小复现 ```rust use soul_mem_core::memory_note::situation_mem::{Emotion, Participant, Context}; // 其余字段任意,只要有一个 intensity = 0.0 let ctx = Context { emotions: vec![Emotion { name: "平静".into(), intensity: 0.0 }], ..Default::default() }; let note = /* 含该 ctx 的 SpecificSituation 记忆 */; note.embed(&model) // Err(EmbeddingCalcError::InvalidNumValue) // 整条记忆无嵌入 → 无法写入 DB、无法参与 KNN ``` `crates/soul-mem-query/src/embedding/situation/emotion.rs:126` 的 `test_weight_pooling_zero_intensity` 已经固化了「零强度和 → Err」这一行为,所以修法需要同时更新该断言。 ## 建议修法 - 跳过 `intensity == 0.0` 的条目; - 若跳过之后没有剩余条目、或和 ≤ 0,退化为均匀 `mean_pooling` 而不是 `Err`; - 负数 `intensity` 显式拒绝或钳制到 0(避免负权重反转)。 ## 位置 - `crates/soul-mem-query/src/embedding/situation/event.rs:26-56` - `crates/soul-mem-query/src/embedding/situation/emotion.rs:19-42` - `crates/soul-mem-query/src/embedding/situation/sensory_data.rs:19-42` - `crates/soul-mem-core/src/memory_note/situation_mem.rs:169,185,206` - `crates/soul-mem-runtime/src/storage/surreal/mapper/note.rs:231` ## 环境 分支 `dev`(`efaf5cb`);仅静态分析——沙箱为只读,未运行 `cargo`。
Activity
dynamder commentedon Oct 14, 2026
intensity的合法数值是 (0,1],intensity为0的项目应该直接删除而不应该出现在embedding链路,钳制应该在构造note时进行。