docs: add interview project materials

This commit is contained in:
aruo
2026-07-05 01:39:37 +08:00
parent 246c99b954
commit bf5286c8f4
5 changed files with 607 additions and 0 deletions
+99
View File
@@ -0,0 +1,99 @@
# 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 和连接数预算调优。
主动讲清这些限制,反而能体现工程判断:先把可追踪闭环打通,再逐步增强质量门和生产可靠性。