relations 补回指消解——ADR-0016 遗漏的第四个写入目标(issue #144 拍板) #146
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
#144(relations 回指消解开放问题,评估侧已拍板,见下方原文引用)
What to build
给
relations补回指消解(resolved_subject),补齐 ADR-0016 遗漏的第四个写入目标;顺带补上 Delta压缩 prompt 里
relations缺失的自然语言指导文本(相邻缺口,同一处顺手改)。原文(
docs/adr/0016-reference-resolution.md「更新(2026-08-17,issue #144)」节):Acceptance criteria
一、schema 改动(
delta.py::_EXTRACT_MEMORIES_TOOL,"relations"那段items.properties)user_a_id/user_b_id的"type"从"string"改成["string", "null"](同 facts 的scope_id形状),description 更新为"结构化已知(消息里明确点名)时填,只是代词/模糊指代推断的不要填在这里,
改填
resolved_subject_a(/_b),这里留null"resolved_subject_a/resolved_subject_b(各["string", "null"]),description 仿 facts/events 现有
resolved_subject字段的措辞("尝试通过上下文消解代词/模糊指代锁定的具体 sender_id;实在锁定不了才填 null,不要瞎猜")
"required"列表(现为["user_a_id", "user_b_id", "label", "sensitive"])去掉user_a_id/user_b_id,只留["label", "sensitive"]"——同 facts 的scope_id、events 的resolved_subject都不在各自的
required里这个既有形状一致二、解析改动(
delta.py::_parse_relation+_resolve_subject)_resolve_subject(raw)泛化成接受字段名参数(如_resolve_subject(raw, field="resolved_subject")默认值不变,facts/events 现有调用点不用改),避免为
resolved_subject_a/_b各写一份重复校验(该函数现有 docstring 已经点名"facts 与 events 共用同一条校验,避免各写一份逐字段相同的判断悄悄
分叉"——延续同一条原则,不要破例)
_parse_relation:user_a_id/user_b_id允许为None;分别用"结构化值 or 对应resolved_subject_a/b"合并出最终 id;合并后任一侧仍是
None,整条候选返回None(丢弃)——同现有"
user_a_id == user_b_id"防御性丢弃走同一条"整条候选丢弃"路径,不要新开一条不同形状的返回逻辑
user_a_id == user_b_id的防御性检查在合并后的最终 id上做(不是在原始结构化字段上),避免"A 结构化点名张三,B 靠代词消解也解到张三"这种合并后才会暴露的重复没被拦住
三、prompt 指导文本补齐(
delta.py::_build_prompt的instruction字符串,相邻缺口顺手补)instruction里现在只枚举了facts=/events=/knowledge=各自的抽取指导,完全没有relations=这一条(目前 relations 只在工具级description与逐字段 schema description 里有只言片语)——补一条
relations=谁与谁是什么关系的指导文本,比照 facts/events 现有措辞给出resolved_subject_a/_b的消解指引("能通过消息里明确点名确定的,直接填 user_a_id/user_b_id;只是通过代词/模糊指代推断出来的……写进对应的 resolved_subject_a/resolved_subject_b,这个位置留
null,实在锁定不了也填 null,不要瞎猜")
四、测试
_parse_relation补单元测试:两侧都结构化 / 一侧结构化一侧靠 resolved_subject 消解 / 一侧消解不了整条丢弃 / 两侧都消解不了整条丢弃 / 合并后 A==B 防御性丢弃
test_delta_compression_cycle.py现有 facts/events回指消解用例的形状),钉住 relations 候选真的能借代词消解落库,不能只断言解析函数正确
Not in scope
/why记录"本轮因回指模糊丢弃了几条 relations 候选"(ADR-0016 原有备注已把这类观测性需求留给实现期按需加,本票不强制要求,需要时再开)
relations以外任何字段/机制的改动(tension/affinity四轴、label枚举等一律不动)