/why + /why_query 可解释性命令(含记忆敏感闸) #83

Closed
opened 2026-07-27 05:44:10 +00:00 by KumaAgent · 0 comments
Member

Parent

#77 [PRD] arise 运营与质量(决策快照 + 六池成本治理 + 管理命令)—— ADR-0010 完整落地

What to build

让部署者在群友问"它刚才为什么不理我"时,能拉出那次的决策记录看到具体原因(级一没过?预算耗尽?还是模型自己选择了沉默),而且是人能读懂的话,不是一坨要自己解析的 JSON。同时提供假设性查询用于调参——给定模拟的查询和情感坐标,看候选记忆各维度分别打了多少分。

但管理员身份 ≠ 记忆主人。 跟机器人私聊过敏感话题的普通用户,不该因为某人是群管理员就被 /why 泄漏私人记忆内容。

Acceptance criteria

  • 新增 /why:取最近一条决策快照 + 纯函数渲染成人类可读解释(结构化记录 → 文本,可直接断言输出文本)
  • 解释能看到那次决策的情感态三轴数值与沉默预算余量(最常见的"为什么它今天这么安静"的答案来源)、注入了哪些记忆条目
  • 新增 /why_query:给定模拟的 (query, 情感坐标),展示候选记忆的分维度得分明细(recency / importance / relevance / mood_congruence);候选数设静态上限。区别于 /why 只能回看真实发生过的一轮
  • 两个命令渲染记忆条目时都按"命令是在哪个 chat 发起的"重新过一遍既有可见性闸events.is_event_visible(event, current_chat_id=<发起命令的 chat>);画像/Knowledge 等其它记忆类型同理走各自既有的同一套规则),不可见的条目降级为"有 N 条不可见条目参与了这次决策"之类的计数占位,不泄漏内容
  • 理由:现有可见性闸是按 chat 作用域判定的,从来不是"谁有权看"的授权模型。决策发生时对 chat A 可见,不等于现在对发起命令的 chat B 可见;is_admin 授予的是"能不能管这个机器人",不该顺带成为绕过敏感度治理的后门。这与 PR #76 修掉的"隐私外送"是同一形状的坑,同一个错误不该在这条新出口上再犯一次
  • 敏感闸测试必须带反向对照:只断言"输出里没有那段敏感文本",在渲染压根没实现条目展示的情况下同样成立——必须同时断言非敏感条目/同 chat 场景正常渲染出来,并建议做一次变异验证(把敏感闸那行删掉,确认测试真的会挂)
  • /why_query 的 embedding 消耗记进 embedding 池——算 relevance 要真的 embed 一次模拟查询,是真实 provider 调用;调参工具不是记账体系的例外,否则"今天花了多少钱"这个数本身就不准
  • embedding 池已熔断时 /why_query 明确失败并说明原因,不绕过熔断照常调用;测试断言假 embedding 客户端的调用计数为零(不是断言"没有输出结果"——那在多种原因下都成立)
  • 两个命令均经 is_admin 校验(复用 #80 建立的权限与命令基建),校验失败无状态变更、无 LLM 调用、不泄漏管理员才可见的信息
  • /why_query 的分维度得分明细计算复用既有 recall.py 打分纯函数,本片只测明细展开

Blocked by

  • #79 — 决策快照结构化落库 + 全触发路径覆盖(/why 要读的记录)
  • #80 — host 权限 port is_admin + 四个运行时管理命令(权限与命令基建)
  • #82 — 池预算与熔断 + 前台回复优先保(/why_query 的 embedding 池熔断约束)
## Parent #77 [PRD] arise 运营与质量(决策快照 + 六池成本治理 + 管理命令)—— ADR-0010 完整落地 ## What to build 让部署者在群友问"它刚才为什么不理我"时,能拉出那次的决策记录看到具体原因(级一没过?预算耗尽?还是模型自己选择了沉默),而且是人能读懂的话,不是一坨要自己解析的 JSON。同时提供假设性查询用于调参——给定模拟的查询和情感坐标,看候选记忆各维度分别打了多少分。 **但管理员身份 ≠ 记忆主人。** 跟机器人私聊过敏感话题的普通用户,不该因为某人是群管理员就被 `/why` 泄漏私人记忆内容。 ## Acceptance criteria - [ ] 新增 `/why`:取最近一条决策快照 + **纯函数**渲染成人类可读解释(结构化记录 → 文本,可直接断言输出文本) - [ ] 解释能看到那次决策的情感态三轴数值与沉默预算余量(最常见的"为什么它今天这么安静"的答案来源)、注入了哪些记忆条目 - [ ] 新增 `/why_query`:给定模拟的 `(query, 情感坐标)`,展示候选记忆的分维度得分明细(recency / importance / relevance / mood_congruence);候选数设静态上限。区别于 `/why` 只能回看真实发生过的一轮 - [ ] **两个命令渲染记忆条目时都按"命令是在哪个 chat 发起的"重新过一遍既有可见性闸**(`events.is_event_visible(event, current_chat_id=<发起命令的 chat>)`;画像/Knowledge 等其它记忆类型同理走各自既有的同一套规则),不可见的条目降级为"有 N 条不可见条目参与了这次决策"之类的计数占位,不泄漏内容 - [ ] 理由:现有可见性闸是**按 chat 作用域**判定的,从来不是"谁有权看"的授权模型。决策发生时对 chat A 可见,不等于现在对发起命令的 chat B 可见;`is_admin` 授予的是"能不能管这个机器人",不该顺带成为绕过敏感度治理的后门。这与 PR #76 修掉的"隐私外送"是同一形状的坑,同一个错误不该在这条新出口上再犯一次 - [ ] **敏感闸测试必须带反向对照**:只断言"输出里没有那段敏感文本",在渲染压根没实现条目展示的情况下同样成立——必须同时断言非敏感条目/同 chat 场景**正常渲染出来**,并建议做一次变异验证(把敏感闸那行删掉,确认测试真的会挂) - [ ] `/why_query` 的 embedding 消耗记进 `embedding` 池——算 relevance 要真的 embed 一次模拟查询,是真实 provider 调用;调参工具不是记账体系的例外,否则"今天花了多少钱"这个数本身就不准 - [ ] embedding 池已熔断时 `/why_query` 明确失败并说明原因,不绕过熔断照常调用;测试断言假 embedding 客户端的**调用计数为零**(不是断言"没有输出结果"——那在多种原因下都成立) - [ ] 两个命令均经 `is_admin` 校验(复用 #80 建立的权限与命令基建),校验失败无状态变更、无 LLM 调用、不泄漏管理员才可见的信息 - [ ] `/why_query` 的分维度得分明细计算复用既有 `recall.py` 打分纯函数,本片只测明细展开 ## Blocked by - #79 — 决策快照结构化落库 + 全触发路径覆盖(`/why` 要读的记录) - #80 — host 权限 port `is_admin` + 四个运行时管理命令(权限与命令基建) - #82 — 池预算与熔断 + 前台回复优先保(`/why_query` 的 embedding 池熔断约束)
KumaAgent changed title from C:/Program Files/Git/why + /why_query 可解释性命令(含记忆敏感闸) to /why + /why_query 可解释性命令(含记忆敏感闸) 2026-07-27 05:44:58 +00:00
Yushu closed this issue 2026-07-28 09:17:08 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ProjectKuma/arise#83
No description provided.