## Before\n\n用户给一个 CSV 后,agent 临时读取字段、手算参评率/解决率/转人工率,再在对话中解释“全量行作分母”还是“排除空值后作分母”。下一次换文件或加 `tool_name` 分组时,还要重新判断编码、字段名和口径。\n\n## After\n\n```bash\npython /Users/bytedance/.codex/night-gym/tools/service_metrics_calculator.py \\\n --input ~/Downloads/商服实验数据取数-全量-2026-05-07\ 18-11-23.csv \\\n --group-by tool_name \\\n --grain row \\\n --transfer-denominator non_null \\\n --out out/service_metrics_2026-05-07.xlsx\n```\n\n输出包括:\n\n| sheet | 内容 |\n|---|---|\n| `metrics` | 每个 `tool_name` 的求助量、参评量、参评率、转人工率、拒答率、求助解决率 |\n| `denominators` | 每个指标的分子、分母、百分比、行级/session级口径 |\n| `unavailable` | WoW、识别准确率、漏召率、问答准确率等缺失数据源的指标和所需字段 |\n| `metric_manifest.json` | 编码、字段映射、过滤条件、口径参数,便于复核 |\n\n关键行为:如果发现 `是否转人工` 有空值,工具同时给出 `all` 和 `non_null` 两套转人工率,并标注哪一套匹配用户给的总计值。