Skip to content

如何衡量“修好了”,以及不知道能否修好 ​

假设助手碰到任何故障都拒绝写入,它的越权写入数可以是零;可它也没有修好任何故障。反过来,七次都猜对病例名称,也不能说明现场恢复更快。这一章用两套分母:离线样本回答诊断是否命中,真实注入任务回答服务是否恢复。

sequenceDiagram
Fixture->>Planner: 同一组带标签观察
Planner-->>Scorer: 预测及查询次数
Scorer->>Scorer: 未命中也计入分母
LiveRun-->>Verifier: 另行回读新副本
Verifier-->>Report: 记录恢复时间及审批等待
sh
.venv/bin/python opspilot/cluster/eval.py --mode rules
# 配置兼容 Function Calling 的 LLM 后,分别运行:
.venv/bin/python opspilot/cluster/eval.py --mode react
.venv/bin/python opspilot/cluster/eval.py --mode context
.venv/bin/python opspilot/cluster/eval.py --mode memory

回放固定带标签的合成观测,覆盖 selector、GPU 不足、OOM、镜像拉取、CrashLoop、DNS 和无就绪端点。每组使用相同输入和确定性结论验证器;差异是读工具选择、上下文压缩与历史提示。Root Cause Accuracy 以全部样本为分母,无法确诊也算未命中。Tool Calls 计不同来源查询;Token Cost 要区分实际 usage 和供应商单价。只读回放不能测修复成功率或 MTTR,结果刻意为空。在线注入时 Task Success 必须有新就绪证据;MTTR 从故障被观测到验证完成,另报人工等待;Safety Violation Rate 用未授权或越界写次数/注入任务数,同时报告尝试被挡的次数。固定夹具命中不能当作线上泛化准确率。

验证拒绝分支、重复批准、审批前变更、进程在写成功后丢失响应,比只演示成功路径更能说明执行正确性。原单机工程 tests/test_graph.py 用真实 SqliteSaver 重开连接并注入丢包;集群案例使用真实 Kubernetes UID 与 resourceVersion。两者验证的边界不同。

集群内运行方式:从仓库根目录 docker build -f opspilot/cluster/Dockerfile -t opspilot-runtime:lab .,kind load docker-image opspilot-runtime:lab --name handbook-lab;在 opspilot-lab 创建包含两个密钥的 ops-api-keys Secret 后 kubectl apply -f deploy/opspilot.yaml。Service 使用 ClusterIP;用 kubectl -n opspilot-lab port-forward svc/opspilot 18190:8080 测试。PVC 挂载到 /app/data,Recreate 策略避免两个 SQLite 写实例并存。工具通过投射的 ServiceAccount tokenFile 与 CA 凭证访问 API;进程只可 impersonate 实验中的 observe/repair 两个身份。MCP 读会话不注册写工具,不向工具传 LLM 密钥或 PostgreSQL DSN。

OPS_TOKEN_BUDGET 为一次诊断的模型预算,默认 32000。每次请求限制生成长度,并在模型调用和 schema 重试之前估算序列化输入、检查剩余额度;实际用量由 provider 的 usage 回填。字节估算对不同 tokenizer 和隐藏模板并非精确计费上限,无法取得 usage 的服务还需在供应商端配置硬额度。

实测的边界。 用本机 Ollama 的 qwen2.5-coder:14b 完成一次真实 selector 故障的工具选择、人工审批和 Ready 回读。历史记录另在七个合成病例上比较四种模式:规则 7/7、基础模型选择 6/7、压缩上下文 6/7、附已验证历史 7/7。每组只运行一次,顺序、随机性和模型版本都会影响结果;一个样本的差异不能证明记忆带来因果提升。证据保存在 evidence/eval-*.jsonl,失败或未确诊同样保留。本次案例没有估算云服务价格,Token 数不是货币成本。

把离线诊断和在线恢复分成两张计分表 ​

本轮 rules 的 7 个合成病例全部命中,各行保留工具查询次数;无模型消耗,未发生写入。相同输入及错误样本都可在 原始 JSONL 复算。此前的语言模型七例对照属于历史记录,不是本轮重新运行,也不能估算云端价格。

sh
.venv/bin/python opspilot/cluster/eval.py --mode rules > /tmp/cloudlab-eval.jsonl
python3 - <<'EVAL'
import json
rows=[json.loads(line) for line in open('/tmp/cloudlab-eval.jsonl')]
print('correct/total',sum(r['correct'] for r in rows),len(rows))
print('calls', [r['tool_calls'] for r in rows])
print('mttr', [r['mttr'] for r in rows])
EVAL
rm /tmp/cloudlab-eval.jsonl

在线测 MTTR 必须先定义起点。若从首次监测故障到新副本验证通过,审批等待是产品耗时的一部分;另报不含人工等待的执行时长。本轮轨迹从第一次读取 pods 才开始,不能把这段间隔硬说成从故障发生的 MTTR。跨租户误写应在独立测试环境用拒绝断言和服务端审计验收;回放的 write_attempts=0 不足以证明生产永远没有越权。**追问:**把所有病例都拒绝修复,安全指标可能很好但系统无用,故需同时报可修病例成功率、未知故障拒绝率、工具/Token 成本。