Files
SuperBizAgent-java/mvp/issues/archived/executor-evidence-attribution-hallucination.md

143 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/`