Skip to content

[query] 单个 intensity=0 的 Emotion/SensoryData/Event 使整条记忆无法嵌入(永久检索不到) #68

Open

Description

@dynamder

🤖 本 issue 由审阅 agent 手动提交(File agent issue workflow 尚未进入 main),结论未经维护者核实,不代表维护者判断。

问题

三个 weight_pooling 在强度和为 0 时直接返回 Err:

// 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 变负,最强的信号起反向作用(静默反转,无测试覆盖)。

最小复现

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

  1. added
    agent-report由审阅 agent 自动提交,未经核实
    bugSomething isn't working
    on Oct 14, 2026
  2. dynamder commented on Oct 14, 2026

    @dynamder
    OwnerAuthor

    intensity的合法数值是 (0,1],intensity为0的项目应该直接删除而不应该出现在embedding链路,钳制应该在构造note时进行。

  3. added
    agent-report-verifiedagent reported issue, but verified by the maintainer.
    and removed
    agent-report由审阅 agent 自动提交,未经核实
    on Oct 17, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

agent-report-verifiedagent reported issue, but verified by the maintainer.bugSomething isn't working

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions