Skip to content

跨类型同义双录(如 pitfall + constraint)在去重与 #641 分诊链路上的盲区 #687

Closed

Description

@xueyue33

今天在本地长期库(0.14.0,约 1650 条活跃记忆)上顺手跑了一次不限 type 的全量向量余弦比对,发现一个挺有意思的现象,跟 #641 刚好能对上:

目前同类型的近重复其实已经被 autoDream 和冲突链路清得很干净了,库里残存的高相似对几乎全是跨类型的:

  • sim >= 0.90 共 7 对:同类型仅 1 对,跨类型 6 对(86%)
  • sim >= 0.88 共 24 对:同类型仅 3 对,跨类型 21 对(88%)
  • sim >= 0.85 共 81 对:同类型仅 9 对,跨类型 72 对(89%)

翻了一下具体条目,最典型的是同一次编码调试对话被蒸馏时,模型经常把同一件事拆成一条 pitfall(现象+根因+规避方法)外加一条 constraint(工程约束),有时后续还跟着一条 decision / project 或 sleep 提出来的 pattern(比如一条 [pitfall] 某工具发送文件必须在允许目录内 和一条 [constraint] 某工具发送本地文件路径限制,相似度 0.917)。

顺着代码看了一圈,这类跨类型双胞胎目前刚好卡在三处过滤的夹缝里:

  1. 蒸馏源头(src/lang.js:18 codingSummary):提示词鼓励拆成多条,同时给了概念边界有重叠的 pitfall(含解决/规避方法)和 constraint,没提示同一结论择一 type 记录,模型很自然会交两份。
  2. 落库去重(src/service.js:1490 findSessionDuplicate):store.list({ type: memory.type, source }) 锁了同 type + 同会话,且 summarize.js 同一批次内是先查完再去落盘,同窗双录互相看不见。
  3. 巩固与 [Feature] 冲突处理第二机制(beta):确定性分诊 + 矛盾账本 + 惰性消解(零人工) #641 分诊入口(src/dream/clustering.js:117 findPotentialConflicts):第一行 if (memories[i].type !== memories[j].type) continue; 直接跳过了异类比对,所以这 88% 的跨类型高相似对进不了 conflict_pending 和 conflict_ledger,在观测账本里也完全隐身了。

想到的一个低风险思路(不碰 #339 dreamMergeGuard,也不放开容易坏事的跨类型 LLM merge):

  • 源头:codingSummary 补一句互斥约束(同一个坑既然在 pitfall 里写了规避方法,就不再重复单开一条同义 constraint),顺便在单次蒸馏批内做一下高相似去重;
  • 存量消解:在 [Feature] 冲突处理第二机制(beta):确定性分诊 + 矛盾账本 + 惰性消解(零人工) #641 的确定性分诊里,考虑对语义高度重合的近亲类型对(比如 pitfall ↔ constraint、decision ↔ project)放开进入 T1 dup,复用 supersedeInfoFirstPair / superseded_by(留信息更完整的一条,正文零改写)。

供参考,看看合不合适并进 #641 后续阶段一块考虑~

Activity

  1. added
    area:dream巩固/蒸馏/睡眠维护
    in-progress有人在改(Ephor 接手)
    needs-decision要桉桉拍口径才能往下走
    fixed已修并合并进 main
    and removed
    needs-decision要桉桉拍口径才能往下走
    in-progress有人在改(Ephor 接手)
    fixed已修并合并进 main
    on Nov 13, 2026
  2. added a commit that references this issue on Nov 13, 2026
  3. modusensus commented on Nov 13, 2026

    @modusensus
    Member

    已在 #690 落地(合并 commit eb47f674),三层都做了:

    1. 源头互斥:src/lang.js 的 codingSummary 提示词(中英)补一条——同一结论只记一条,pitfall 与 constraint 不双写,时间序列/状态快照写进同一条。
    2. 批内去重:蒸馏落盘前对 pitfall↔constraint、history↔project 两组做跨类型去重,planBatchCrossTypeDedupe() 纯函数,按相似度降序、每条最多被退休一次、不许链式藏行;处置走 supersedeChain,只写 superseded_by / superseded_at,保留正文更全的一条、被取代者正文零改写、判错可回退。
    3. 存量处置:只做成一次性人工动作,不进代码——按 cosine>=0.90 出 17 对清单(scripts/cross-type-dedupe-dryrun.mjs),人工复核后按纯 SQL 打链,已在本机库执行(17 对全部 applied,库先备份)。不合并正文,正文零改写。

    没开常开类型闸:本机 9,275 条活跃记忆里跨类型 cosine>=0.90 共 45 对,读正文后 36 对确为同义、9 对合并会丢信息(5 对时间序列、2 对症状vs修复、1 对结论反转、1 对版本号不同)。只占活跃总量 0.97%,风险与收益不对称。

    注意两把尺子:存量 17 对按余弦挑,线上规则按词面重合 textSim ≥0.85 判;17 对里只有约 1–3 对会被线上规则认出来。清单不是「新规则会抓到什么」的证据。

  4. added
    fixed已修并合并进 main
    and removed
    in-progress有人在改(Ephor 接手)
    on Nov 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:dream巩固/蒸馏/睡眠维护area:retrieval检索与注入fixed已修并合并进 main

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions