Files
SuperBizAgent-java/interview/design-tradeoffs.md
T

100 lines
4.4 KiB
Markdown
Raw 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.
# Design Tradeoffs
## 1. 为什么要做 trace,而不是只返回答案
普通 Chatbot 只关注最终回答,但故障诊断更需要可审计性。一次诊断至少要回答三件事:
- 结论是什么
- 证据来自哪里
- 哪些步骤由哪个 Agent 完成
因此项目把一次会话拆成:
- `diagnosis_session`:会话级摘要、最终答案、质量评估、反馈。
- `agent_step`:Agent 模型输入输出、耗时、token 和工具调用标记。
- `tool_invocation`:真实工具调用参数、输出预览、成功状态和检索元数据。
这个设计牺牲了一些实现复杂度,但换来了可回放、可调试、可演示。
## 2. 为什么 Chat 有 Verifier,AIOps 暂时没有
Chat 入口的问题更开放,用户可能要求复杂推理或跨领域结论,所以 Verifier 是必要的质量门。当前 Chat 链路通过 `Planner -> Executor -> Verifier` 固定流程,把 groundedness 和 facts checked 写入 `self_evaluation`。
AIOps 当前阶段先不加 Verifier,原因是:
- AIOps 刚完成从“自动跑告警”到“可追踪告警入口”的改造。
- 先要确认告警 payload、工具证据、最终报告和 trace 能闭环。
- AIOps Verifier 的规则不同于 Chat Verifier,需要检查告警 scope、证据覆盖和处置建议,不宜直接复用。
后续可以做 lightweight AIOps Verifier,检查报告是否聚焦 payload、是否引用工具证据、是否误展开无关告警。
## 3. 为什么 AIOps payload scope 先用 prompt 控制
运行验证发现:传入 `HighCPUUsage/payment-service` 后,Agent 仍可能把 mock Prometheus 返回的所有 active alerts 都展开分析。这个问题的本质是任务边界不清晰。
当前选择 prompt-level scope control:
- 有 payload:`PAYLOAD_TARGETED`,最终报告围绕传入告警。
- 无 payload:`AUTO_DISCOVERY`,先调用 `queryPrometheusAlerts` 自动发现告警。
没有先做 Java 侧过滤,是因为:
- 过滤工具结果会降低 Agent 发现关联风险的能力。
- 目前需要的是报告主线聚焦,而不是完全屏蔽上下文。
- Prompt 改动小,风险低,能保留 Agent 灵活性。
已验证结果:主报告有 `HighCPUUsage/payment-service` 的完整根因分析,`HighMemoryUsage` 和 `SlowResponse` 只作为相关风险出现。
## 4. 为什么用 `tool_invocation` 统计真实工具调用次数
早期可以通过 `agent_step.hasToolCall` 粗略判断是否调用工具,但它统计的是“哪些模型步骤包含工具调用”,不是“真实调用了几次工具”。
现在 `tool_call_count` 来自:
```text
ToolInvocationRepository.countBySessionId(sessionId)
```
这样更符合 trace 语义:
- 一个 step 可能调用多个工具。
- 工具可能来自不同来源:知识库、日志、指标、Prometheus。
- 面试时可以把 `tool_call_count` 和 trace 中返回的工具明细对上。
## 5. 为什么保留 mock Prometheus 和 mock CLS
面试 Demo 最怕不稳定。真实 Prometheus、日志平台和线上故障都有不可控因素,所以 MVP profile 保留 mock 工具:
- `prometheus.mock-enabled=true`
- `cls.mock-enabled=true`
这样可以稳定复现:
- `HighCPUUsage/payment-service`
- `HighMemoryUsage/order-service`
- `SlowResponse/user-service`
- system-metrics、application-logs、database-slow-query 等日志证据
这不是逃避真实集成,而是把“Agent 编排和证据追踪”作为面试演示的主目标。
## 6. 为什么把面试材料单独放 `interview/`
`mvp/` 是持续迭代现场,包含过程文档、验收记录和 runbook。面试材料的目标不同,它应该是可讲、可演示、可评估的展示层。
因此:
- `mvp/` 保留真实演进材料。
- `devflow/` 保留决策沉淀。
- `interview/` 只组织面试叙事和演示脚本。
这样后续继续做 AIOps Verifier、UI、更多工具集成时,不会污染面试讲稿。
## 7. 可以主动承认的限制
- AIOps 还没有 Verifier。
- Prompt-level scope control 不能做到强约束,只能通过 trace 和测试观察遵循情况。
- 当前 mock 数据适合 demo,不代表生产接入已经完成。
- Hikari 连接池已经加了短生命周期和 keepalive,但真实生产还需要按数据库 wait_timeout 和连接数预算调优。
主动讲清这些限制,反而能体现工程判断:先把可追踪闭环打通,再逐步增强质量门和生产可靠性。