docs(issue): archive legacy issues and add iss-015

This commit is contained in:
zhuyongxin
2026-07-23 19:54:01 +08:00
parent 529f4ff43b
commit 49180abccf
18 changed files with 186 additions and 40 deletions
@@ -0,0 +1,142 @@
# Executor 证据归因幻觉
**状态**:已归档(旧架构问题被 ISS-014 替代)
**严重程度**:高
**发现时间**:2026-07-07
**来源**:Trace Workbench 复核 / 最近 Chat 诊断会话低置信分析
**关联**:ISS-005(证据链补齐与降级契约收敛)、ISS-006(固定诊断评测集与回归 Harness)、`chat-verifier-agent`、`diagnosis-playbook-skills`
**归档时间**:2026-07-23
---
## 归档说明
本问题针对旧 Planner/Executor/Verifier/Composer 链路提出,相关 Executor 与 Verifier 主链路现已被 ISS-014 的单体 Diagnosis Agent、EvidenceGuard、SemanticGuard 和确定性 Release/Fallback 机制替代。旧架构下的输出分区、Verifier `LOW_CONFID` 和 Prompt 修补不再是当前实现入口。
证据引用真实性、语义支持性和信息化 Fallback 已由 ISS-014 统一承接;E2E 后新发现的 Agent 停止策略、Evidence Repair Schema 和审计验证继续在 [ISS-015 诊断运行质量与 Reasoning 审计收敛](../active/ISS-015-diagnosis-runtime-quality-and-reasoning-audit.md) 中追踪。本 Issue 以“旧架构问题被替代”归档,不表示所有诊断质量问题已经关闭。
---
## 背景
最近连续多条 Chat 诊断会话都被 Verifier 判定为 `LOW_CONFID`。这些会话并不是没有调用工具;相反,它们大多完成了 `lookup_knowledge`、`query_metrics`、`query_logs` 等证据工具调用。
问题出在 Executor 的最终答案:它拿到部分真实工具返回后,将以下三类内容混在一起输出为“本次事故结论”:
1. 本次工具直接返回的事实。
2. runbook、知识库或历史案例里的通用模式。
3. 模型基于经验补全的推断。
Verifier 随后逐条核查 `executor_final_answer`,发现大量关键事实没有对应工具证据,于是按规则输出 `LOW_CONFID`。
---
## 现象
最近 5 条 Chat 诊断会话均为低置信:
| session | verdict | groundedness_score | direct_evidence | indirect_support | no_evidence |
|---|---:|---:|---:|---:|---:|
| `e2e-mysql-skill-rag-20260706-2355` | LOW_CONFID | 0.50 | 2 | 14 | 5 |
| `e2e-mysql-skill-rag-20260706-2312` | LOW_CONFID | 0.37 | 4 | 11 | 14 |
| `e2e-mysql-skill-rag-20260706-2255` | LOW_CONFID | 0.10 | 1 | 2 | 18 |
| `e2e-mysql-skill-rag-20260706-2242` | LOW_CONFID | 0.53 | 3 | 9 | 4 |
| `e2e-mysql-skill-rag-20260706-2230` | LOW_CONFID | 0.20 | 1 | 2 | 11 |
典型无证据断言:
- `order-service 出现 OutOfMemoryError: Java heap space`
- `OrderService.processLargeOrder() 内存泄漏导致 JVM OOM`
- `频繁 Full GC(10 分钟 15 次,平均 850ms)`
- `users + user_profiles 慢查询 2.8s,全表扫描`
- `UPDATE orders 锁等待 2.1s`
- `user-service DB 查询超时 5.2s~5.8s`
这些事实要么没有出现在工具返回中,要么属于其它服务或历史案例,不能作为当前会话的直接事实。
---
## 根因判断
这是一个经典的 Agent 幻觉问题,但更准确地说是:
**Executor 的证据归因幻觉。**
Executor 已经调用了工具,但在综合答案阶段没有严格区分:
- `direct evidence`:工具本次实际返回的事实
- `reference / runbook`:流程指导、历史模式、建议方向
- `hypothesis`:基于已知证据的推测
- `missing evidence`:还没有被工具证实的内容
因此它会把“可能相关的历史模式”写成“当前事故事实”,并把“建议排查方向”写成“已确认根因”。
---
## 影响
- Verifier 正确拦截后,最近 Chat 会话长期停留在 `LOW_CONFID`。
- 用户侧结果虽然带免责声明,但仍难以直观看出哪些内容是真实证据、哪些只是推测。
- 评测里 verdict 分布会被 Executor 输出质量拖低,掩盖工具链本身是否已经足够。
- 面试讲解时容易被追问:既然工具都调用了,为什么答案仍然不可信?
---
## 本 issue 目标
收紧 Executor 的最终输出契约,避免把未证实内容写成确认结论。
完成后应做到:
1. Executor 最终答案明确分区:
- `已证实事实`
- `合理推测`
- `证据缺口`
- `建议动作`
2. `已证实事实` 只能来自本轮 evidence tools 的返回。
3. runbook / skill / 知识库中的流程和历史案例不得直接作为本次事故事实。
4. 其它服务的证据不得迁移为当前服务事实。
5. 根因结论必须绑定至少一条直接或间接证据;否则只能放入 `合理推测` 或 `证据缺口`。
6. Verifier 的 `LOW_CONFID` 缺口应能直接映射回 Executor 的分区错误。
---
## 范围
### In scope
- 修改 `chat-executor-prompt.md`,加入证据分区和证据归因规则。
- 必要时在 `ChatService.buildChatExecutorAgent(...)` 中注入更明确的最终答案格式约束。
- 增加 focused tests,覆盖 Executor prompt 中的证据边界规则。
- 增加或更新诊断 eval fixture,验证 unsupported claims 不会出现在确认结论中。
- Trace Workbench 可继续消费 Verifier 缺口展示低置信原因。
### Out of scope
- 不放宽 Verifier 的 PASS 判定矩阵。
- 不通过调高 `verifier.low-confidence-threshold` 掩盖问题。
- 不把 runbook 或 skill 内容写入 `tool_invocation` 伪装成事实证据。
- 不新增数据库 schema。
---
## 验收标准
- 对 MySQL 连接池耗尽类 case,Executor 输出中:
- 已证实事实只包含工具返回的服务、指标、日志、慢 SQL 等事实。
- OOM、Full GC、连接泄漏等未证实内容只能出现在推测或证据缺口中。
- 不再把 `order-service` / `user-service` 事实混入 `payment-service` 当前事故。
- Verifier 对同类会话的 `no_evidence` 数量明显下降。
- 若证据不足,最终用户输出明确说明“当前无法确认根因”,而不是补全一个完整事故故事。
- 评测报告能捕捉 unsupported confirmed claims 的回归。
---
## 相关文件
- `src/main/resources/prompts/chat-executor-prompt.md`
- `src/main/resources/prompts/chat-verifier-prompt.md`
- `src/main/java/com/superbiz/agent/service/ChatService.java`
- `src/main/java/com/superbiz/agent/service/ToolTraceSummaryService.java`
- `src/test/java/com/superbiz/agent/service/ChatServiceSequentialAgentTest.java`
- `mvp/eval/`