Skip to content

memo 自动提取缺少语义去重,且提取边界应按 run 而非 fixed recent window #601

@Yumiue

Description

@Yumiue

Problem Description

当前长期记忆自动提取存在两个连续缺陷:

  1. 去重仅是精确匹配,语义相近但措辞不同的记忆会重复沉淀。
  2. 提取输入来自会话全量后再 recent window 截断,而不是当前 run 边界,导致跨 run 混入。

这会导致记忆噪声持续累积,召回质量下降。

Current Defects

  • runtime 在 run 结束后传入的是 session.Messages,不是 run-slice。
  • memo 提取窗口依赖固定 extract_recent_messages,承担了不该承担的边界职责。
  • 去重键是 exact key(type+title+content)+ payload fingerprint,不具备语义收敛能力。

Expected Changes

  1. 提取边界改为“当前 run transcript”,recent window 仅作 run 内裁剪。
  2. 自动提取后增加模型语义去重 pass(全量检查)。
  3. 去重命中后保留一条并合并内容;删除重复条目。
  4. 覆盖全部来源(含 UserManual),但当簇内存在 UserManual 时,UserManual 必须作为 canonical。
  5. 仅高置信重复结论才允许自动改写;低置信只记录并跳过。
  6. 模型来源复用当前 selected_provider/current_model,不新增配置项。
  • runtime -> memo 调度边界改造:
  • 将 MemoExtractor.Schedule(sessionID, messages) 升级为携带 run 语义边界的输入(推荐新增 runID 和 run-slice 消息)。
  • 在 Run 收敛时只传当前 run transcript 给 memo,不再传全会话消息。
  • memo 去重链路升级:
  • 保留现有 exact dedup(低成本第一层)。
  • 在 extractAndStore 完成新增后,追加 semantic dedup pass(全量检查)。
  • 去重流程:分组(按 Type)-> 模型判簇 -> canonical 选择 -> 合并字段(keywords/content)-> 删除重复 topic/index 引用。
  • canonical 规则:簇内存在 UserManual 时优先它;否则按模型建议。
  • 置信门槛:仅高置信执行改写;中低置信仅记录日志并跳过。
  • 配置与接口:
  • 先不新增配置项,复用当前 memo 提取模型链路。
  • 增加内部常量化阈值与日志字段(如 semantic_dedup_hit、semantic_dedup_skip_low_confidence)。
  • 文档更新:
  • 更新 docs/tools-and-tui-integration.md,明确“按 run 边界提取 + 每轮后语义去重”。

Acceptance Criteria

  • 同一事实的同义改写不再重复沉淀。
  • 本轮提取不混入历史 run 消息。
  • 包含 UserManual 的重复簇,最终保留 UserManual 条目。
  • 低置信判重不改写数据。
  • 现有 exact dedup / fingerprint dedup / remember-skip 行为不回退。

Related Areas

  • internal/runtime/run.go
  • internal/runtime/memo.go
  • internal/memo/auto_extractor.go
  • internal/memo/service.go
  • internal/memo/llm_extractor.go
  • internal/context/projection.go
  • docs/tools-and-tui-integration.md

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions