Knowledge差异化合并升级为同轮LLM融合 #134
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Parent
#103 第四批清单:31 条实现类落差 + 9 条待拍板(条目 16)
What to build
ADR-0015 拍板的 Knowledge 合并是"同一次 Delta 压缩 LLM 调用产出的结构化融合 + 差异化保留"(合并时默认保留旧信息里没被新信息明确否定/取代的部分),而 origin/main 上
knowledge.py::merge_knowledge是一句确定性字符串拼接(f"{meaning};{candidate.canonical_meaning}"),过期事实与新事实并列单调堆积,且合并逻辑活在存储适配层、发生在 LLM 调用返回之后——这个位置本身就使 ADR 要的"同一次调用产出融合结果"无法成立。核心是一次 port 契约反转:把合并决策从存储层上提到编排层。
Acceptance criteria
_compress_one_chat在压缩前先storage.get_knowledge(chat_id),用trigger_injection.py::match_and_rank拿当轮 delta 原文预筛出相关条目(复用既有匹配器,解开"trigger_keywords 要等 LLM 返回才存在"的先有鸡先有蛋问题,同时天然给 prompt 输入限界)_EXTRACT_MEMORIES_TOOL.knowledge[]增加"合并目标 entry id + 合并后 canonical_meaning"出口;_build_prompt增加已有 Knowledge 输入 + 差异化保留的 instruction;compress()签名新增已有条目入参write_knowledge实现(storage.py/sent_log.py)与KnowledgeStoragePort的 docstring 契约同步改(不再是"内部负责查重合并",改为"调用方传入已融合结果")原文(docs/adr/0015-topic-memory-knowledge-and-persona-lore.md「决策」节 Knowledge 写入条):
原文(同 ADR「更新(2026-07-10 第三方项目对照 grill 第二轮)」节第 2 条——差异化保留精确定义):
merge_knowledge(现有确定性拼接)必须保留、不能删除——按 ADR-0009 点名管 Knowledge 的容错纪律,它正好就是"合并 LLM 调用失败时的机械兜底"原文(docs/adr/0009-memory-engineering.md「更新(2026-07-11 第三方项目对照 grill 第三轮)」节第 3 条尾句):
canonical_meaning,改成 LLM 融合后,送去判的是融合结果还是新增部分?融合结果里含大量既有已通过的旧内容,整段重判会改变否决率,须在片内定_EXTRACT_MEMORIES_TOOL的facts[]/events[]/knowledge[]是同一个 dict——本片与"关系网 tension/affinity"片都要往它加字段,见下方 Blocked byskill.py::merge_skill——它自称沿用merge_knowledge先例(向量相似度替代关键词匹配),本片改动 Knowledge 侧后两者会分叉,AC 里写清楚是有意不同步,不是遗漏Blocked by
_EXTRACT_MEMORIES_TOOLschema 与同一段 Delta 压缩 instruction 字符串加字段,并行改会冲突,需串行实现期对 AC 字面要求的一处偏离,留痕说明
AC 第二条要求
_EXTRACT_MEMORIES_TOOL.knowledge[]增加"合并目标 entry id + 合并后canonical_meaning"出口——PR #141 没有按字面加
target_entry_id这个 LLM 输出字段。设计阶段四路独立对抗校验推翻了这个方向,理由两条:
零新增字段/新增机制"——这条约束当时是为差异化保留契约本身写的,同样覆盖"要不要为
合并目标识别新开一个字段"这件事。
write_knowledge本就无条件做find_matching_entry查重(ADR-0015"拒绝了"节"写入盲目追加,不查重"),让 LLM 的判断结果失效时(编造/搞错 id)退回同一套关键词匹配兜底,等于
新机制的"失败路径"与"不加这个机制"完全等价,用更粗的机制(关键词交集)去否决更精确的
判断,方向也反了。
最终形状:不加任何新 LLM schema 字段,合并目标继续 100% 由
find_matching_entry(关键词交集)在编排层决定;LLM 只借助新增的"已知话题记忆"prompt 输入块写出更准的
trigger_keywords(自然复用/扩展旧关键词)与差异化保留的完整
canonical_meaning——AC 要的"合并目标识别"能力诉求依然兑现,只是识别机制换成了既有的关键词交集,不是 LLM 显式指认。
完整论证已写入 ADR-0015"更新(2026-08-14,issue #134)"节(docs 分支)与 PR #141 描述。