生产级Agent(20):SLO与错误预算

文章摘要

生产级 Agent 做到第 20 篇,系统已经具备 Planner、Tool、Memory、Checkpoint、Human-in-the-Loop、多 Agent、Sandbox、Eval、Control Plane、Registry、Delegated Authority、Audit Ledger、Replay 和 Failure Forensics。

到这一阶段,一个新的问题会变得非常现实:

系统到底算不算“稳定”?

传统服务很容易用:

Availability
Latency
Error Rate

定义 SLO。

Agent 不一样。

一个请求 HTTP 200,不代表任务成功;一次 Task Success,也可能用了 40 次模型调用、花了 5 美元、绕了 8 次 Tool、最终还产生了错误副作用;响应很快,也可能答案完全不可靠;成本很低,也可能是因为 Agent 跳过了必要验证步骤。

所以 Agent 的 SLO 不能只有“接口可用率”。

它至少要同时覆盖:

Task Success
Safety / Side Effect
Latency
Cost
Human Intervention

更关键的是,这些指标之间存在冲突:为了提高 Task Success,可以增加 Replan 和 Tool Call;为了降低延迟,可以减少 Judge;为了降低成本,可以切便宜模型;为了提高安全,可以增加审批。

这意味着 Agent 可靠性真正需要的是 多维 SLO + Error Budget + Burn Rate + Release Policy

本篇直接实现这套体系。


一、先区分SLI、SLO和SLA

SLI:

实际测到的指标

例如:

Task Success = 97.4%
P95 Latency = 8.2s

SLO:

团队内部目标

例如:

Task Success >= 99%

SLA:

对客户承诺

Agent 初期我不建议直接把复杂质量指标写进 SLA。

先内部稳定 SLO。

二、Agent最容易犯的监控错误:HTTP 200当成功

例如:

POST /agent/run
200 OK

响应:

{
  "answer": "订单已取消"
}

真实世界:

订单根本没有取消

HTTP 指标:

100%成功

业务指标:

失败

所以 Task Outcome 必须独立于 Transport Outcome。

三、Task Outcome状态

public enum TaskOutcome {
    SUCCESS,
    PARTIAL_SUCCESS,
    BUSINESS_FAILURE,
    SAFETY_BLOCKED,
    USER_CANCELED,
    SYSTEM_FAILURE,
    UNKNOWN
}

特别要保留:

UNKNOWN

例如 Tool 副作用结果无法确认。

不要硬算成 Success 或 Failure。

四、第一类SLI:Task Success Rate

公式:

成功完成业务目标的Run
/
可评估Run

注意:

USER_CANCELED

是否进入分母要按业务定义。

例如:

public boolean eligibleForSuccessRate(
        AgentRun run) {

    return run.outcome()
            != TaskOutcome.USER_CANCELED;
}

五、Partial Success不能简单当0.5

例如:

用户让Agent完成3件事
完成2件

看起来可以记:

0.67

但如果没完成的是:

最后一步付款

业务上可能整体失败。

所以最好按:

Outcome Contract

定义。

六、Outcome Contract

public record OutcomeContract(
        String taskType,
        Set requiredOutcomes,
        Set optionalOutcomes,
        Set forbiddenOutcomes) {
}

例如续约分析:

required:
  - customer_loaded
  - contract_loaded
  - risk_assessed

optional:
  - email_draft

forbidden:
  - external_send_without_approval

所有 Required 满足才算 Success。

七、第二类SLI:Safety Success

Task Success 高并不代表安全。

我会单独定义:

Safe Execution Rate
=
没有越权、重复副作用、错误外发、跨租户访问的Run
/
全部Run

这个指标目标通常接近:

100%

八、安全错误不能被平均值稀释

例如:

10000次Run
9999正常
1次跨租户泄露

Safe Execution Rate:

99.99%

数字看起来很好。

但安全上可能仍然不可接受。

所以高风险事件同时定义:

Zero Tolerance SLI

例如:

Cross-tenant Access = 0
Duplicate Payment = 0
Unauthorized External Send = 0

这类不走普通 Error Budget。

九、第三类SLI:Latency

Agent 的延迟不能只有:

Total Duration

最好拆:

Time to First Useful Output
Time to First Action
Total Completion Time
Human Wait Time
Tool Wait Time
Model Wait Time

不同业务关注点不同。

十、Chat Agent关注First Useful Output

用户问:

帮我分析合同

30 秒完成不一定糟。

如果 2 秒内先出现:

“已读取合同,正在检查付款和终止条款”

体验会好很多。

所以:

TTFU
Time to First Useful Output

很重要。

十一、后台Agent关注Completion Time

例如:

每天8:00生成销售风险报告

用户不盯着。

真正 SLO:

8:15之前完成

所以不同 Task Type 必须有不同 Latency SLO。

十二、第四类SLI:Cost

Agent 成本不能只统计 Token。

完整:

Model
Embedding
Tool API
Sandbox
Storage
Eval
Human Review

最核心指标:

Cost per Successful Task

而不是:

Cost per Request

十三、Cost per Successful Task

该任务类型全部执行成本
/
成功Task数

失败尝试也算成本。

如果:

100任务
模型总成本$100
成功50

真实:

$2 / Success

不是:

$1 / Request

十四、第五类SLI:Human Intervention Rate

Agent 最终全都能完成,但 70% 都需要人工救场:

它还不算真正自动化

定义:

Human Intervention Rate
=
需要人工介入的Run
/
全部Run

但 Approval 不能和 Rescue 混。

十五、Approval和Rescue分开

Approval:

设计好的控制点

例如:

发送邮件前批准

Rescue:

Agent卡住
必须人来修

所以分别:

Planned Approval Rate
Unplanned Intervention Rate

后者才代表 Agent 不稳定。

十六、第六类SLI:Loop Rate

一个 Agent 虽然成功,但经常:

Planner
→ Tool
→ Reviewer
→ Replan

跑 10 轮。

成本和延迟都会恶化。

定义:

Replan Count
Tool Call Count
Model Call Count

可以直接做 SLI:

P95 Replan  0

二十四、Latency Error Budget

SLO:

95% Run
 14x
AND
6h Burn > 6x
→ Critical Alert

避免偶发几个失败就报警。

二十九、Agent特别适合按Failure Code烧Budget

例如:

TOOL_TIMEOUT
MODEL_FORMAT
RAG_MISS
AUTH_DENIED

分别看。

如果:

总失败率没变

但:

AUTH_DENIED
突然10倍

可能是权限策略发布问题。

三十、Failure Code模型

public enum AgentFailureCode {
    MODEL_TIMEOUT,
    MODEL_FORMAT_ERROR,
    TOOL_TIMEOUT,
    TOOL_FAILURE,
    TOOL_UNKNOWN,
    RETRIEVAL_MISS,
    POLICY_DENIED,
    APPROVAL_TIMEOUT,
    STATE_CORRUPTION,
    MAX_REPLAN,
    BUDGET_EXCEEDED
}

每个失败至少有:

Primary Code

不要只存 Exception Message。

三十一、SLO Service

@Service
public class AgentSloService {

    public SloSnapshot calculate(
            String agentId,
            String taskType,
            TimeWindow window) {

        List runs =
                repository.find(
                    agentId,
                    taskType,
                    window);

        return calculator.calculate(runs);
    }
}

三十二、SloSnapshot

public record SloSnapshot(
        double taskSuccessRate,
        double safeExecutionRate,
        long p95CompletionMs,
        BigDecimal costPerSuccess,
        double unplannedInterventionRate,
        double failureBurnRate,
        double remainingErrorBudget) {
}

三十三、数据层最好按Event聚合

不要每次实时扫全部 Run。

可以:

RunCompleted Event
↓
Metric Aggregator
↓
Hourly Bucket
↓
Daily Bucket

表:

agent_slo_hourly

Key:

hour
agent_id
task_type

保存:

eligible_runs
success_runs
failure_runs
safe_runs
latency_histogram
cost_sum
human_rescue

三十四、Histogram不要只存平均值

Latency 必须保:

Histogram

Prometheus / Micrometer 都可以。

例如:

Timer.builder("agent.run.duration")
    .tag("agent", agentId)
    .tag("task", taskType)
    .publishPercentileHistogram()
    .register(registry);

不要把:

run_id
user_id

放 Tag。

会高基数爆炸。

三十五、Cost指标也不要把Run ID放Metric

Metric:

agent_run_cost_usd_sum

Tag:

agent
task
model_profile

Run 细节放 Trace / DB。

三十六、Release和SLO必须联动

Candidate 发布前:

离线Eval通过

不代表可以无条件全量。

线上 SLO 正在烧预算时:

停止新Release

除非是修复事故。

三十七、Release Policy

public record ReleasePolicy(
        double minRemainingErrorBudget,
        double maxBurnRate,
        boolean blockOnSafetyIncident) {
}

例如:

Remaining  2x
→只允许Fix

Safety Incident > 0
→冻结高风险功能

三十八、这是Error Budget真正的价值

没有 Error Budget 时:

开发:

“这个新功能很重要。”

SRE:

“最近不稳定,不要发。”

双方靠争论。

有 Budget:

剩余8%

规则提前写好:

只允许 Reliability Fix

决策更客观。

三十九、模型升级也算Release

很多团队只对代码做 Gate。

模型:

v1 → v2

同样可能改变:

Task Success
Latency
Cost
Tool Behavior

所以模型升级必须进入同一 Release Policy。

四十、Prompt升级也算Release

Prompt v18:

代码没变

但它可能:

增加Tool Call
提高拒绝率
降低成本

同样需要:

Candidate
Canary
SLO

四十一、Capability变更也算Release

新增:

email.send

风险面发生变化。

即使 Agent Task Success 更高:

Safety SLO

必须重新评估。

四十二、Canary SLO不要用全局混算

10% Canary:

Candidate

90%:

Baseline

如果混在全局 Dashboard:

Candidate的问题会被稀释

必须按:

agent_version

切片。

四十三、Canary比较

Candidate Task Success
vs
Baseline

Candidate P95
vs
Baseline

Candidate Cost
vs
Baseline

Candidate Safety
vs
Baseline

不是只看 Candidate 自己有没有过绝对线。

四十四、Relative Gate

例如:

canary:
  success_drop_max: 0.01
  latency_increase_max: 0.20
  cost_increase_max: 0.15

即使 Candidate:

Success 97%

绝对值超过最低 95%。

Baseline:

99%

掉 2%。

仍然不通过。

四十五、Agent质量必须做Slice SLO

总体:

98%

中文:

99%

英文:

98%

高风险退款:

82%

平均会掩盖问题。

所以关键 Slice 独立 SLO:

language
tenant_tier
risk
tool_type
task_complexity

四十六、避免Slice爆炸

不要全组合:

language × tenant × model × tool × region

会产生大量样本不足指标。

只定义:

Business Critical Slices

例如:

HIGH_RISK
VIP_CUSTOMER
PAYMENT

四十七、样本不足时不要显示绿色

如果:

n = 3

通过 3 条:

100%

没有意义。

SLO Snapshot 应包含:

sample_count

低于阈值:

INSUFFICIENT_DATA

而不是 PASS。

四十八、Confidence Interval

Task Success 是比例。

可以计算:

Wilson Interval

小样本时更稳。

例如:

98/100

和:

9800/10000

虽然都是 98%,置信度完全不同。

四十九、Cost SLO要防止“质量降级换便宜”

Candidate:

成本 -40%
Task Success -5%

不能只庆祝成本下降。

所以成本优化有前置条件:

Quality Non-regression

例如:

Task Success Drop  99.5%
Error Budget > 70%

才允许:

EXECUTE_WITH_APPROVAL

如果出现安全事故:

立即降到DRAFT

六十二、SLO不是给老板看的Dashboard

真正价值是驱动自动动作:

停止发布
切Fallback
降低Autonomy
缩短Tool权限
提高Review比例
触发Incident

如果 SLO 只是图表:

红了以后大家看一眼

作用很有限。

六十三、Action Policy

public record SloActionPolicy(
        Condition condition,
        List actions) {
}

例如:

Burn Rate > 4x

动作:

Freeze Release
Enable Fallback
Raise Sampling

六十四、提高Sampling是什么意思

正常只保留:

10%详细Trace

事故期间:

100%

这样能快速拿证据。

SLO Alert 可以动态提高 Observability。

六十五、错误预算快烧完时,Eval也要变严格

例如平时发布:

100 Case

预算只剩 20%:

500 Case
+
全量高风险Slice

把可靠性状态和 Release Evidence 强度联动。

六十六、一个完整控制闭环

Production Runs
↓
SLI Aggregation
↓
SLO Snapshot
↓
Error Budget
↓
Burn Rate
↓
Policy
↓
Release / Autonomy / Fallback Action

这才是 Agent Reliability Control Plane。

六十七、Spring Boot数据模型

@Entity
public class AgentSloWindowEntity {

    @Id
    private String id;

    private String agentId;
    private String taskType;

    private Instant windowStart;
    private Instant windowEnd;

    private long eligibleRuns;
    private long successfulRuns;
    private long unsafeRuns;

    private long p95CompletionMs;

    private BigDecimal totalCostUsd;

    private long unplannedInterventions;

    private double errorBudgetRemaining;

    private double burnRate;
}

六十八、SLO Definition表

create table agent_slo_definition (
    slo_id varchar(128) primary key,
    agent_id varchar(128) not null,
    task_type varchar(128) not null,
    metric varchar(64) not null,
    target numeric(12,6) not null,
    window_days int not null,
    zero_tolerance boolean not null,
    version varchar(64) not null
);

SLO 本身必须版本化。

六十九、为什么SLO变更也要PR

把:

Task Success 99%

改成:

95%

系统瞬间“变绿”。

所以配置不能后台随手改。

SLO Definition:

Git
PR
Owner
Review

高风险 SLO 降级需要更高批准。

七十、SLO版本和Release版本要关联

每次 Release 保存:

evaluated_under_slo_version

以后 SLO 改了,可以知道:

旧版本是按什么标准发布

七十一、Dashboard第一页不要放50个指标

我会只放 6 个:

Task Success
Safe Execution
P95 Completion
Cost / Success
Unplanned Intervention
Error Budget Remaining

点进去再看细分。

七十二、颜色要谨慎

例如:

Safe Execution:
99.99%

如果发生 1 次 Critical Incident:

必须红

不能因为百分比高显示绿。

颜色逻辑要考虑:

Zero Tolerance Event

七十三、Incident触发条件

Cross-tenant
Duplicate Payment
Unauthorized External Send

立即 P1。

不等 Burn Rate。

普通 Task Failure:

看Burn Rate

两套机制并存。

七十四、一个完整告警策略

alerts:

  task_failure:
    short_window: 1h
    long_window: 6h
    short_burn: 14
    long_burn: 6

  latency:
    p95_ms: 10000
    duration: 15m

  safety:
    zero_tolerance: true

  cost:
    p95_success_usd: 0.10
    duration: 1h

七十五、SLO Review要按周看“错误预算花在哪”

不是只看剩余多少。

例如:

Tool Timeout 42%
RAG Miss 21%
Model Format 15%
Approval Timeout 8%
Other 14%

这直接决定下周工程优先级。

七十六、Reliability Backlog按Budget贡献排序

如果最大失败来源:

Tool Timeout

不要继续调 Prompt。

先修 Tool Reliability。

Agent 平台很容易把所有问题归因到模型。

SLO Breakdown 能防止这种偏差。

七十七、Cost Breakdown也一样

Model 48%
Sandbox 20%
Judge 15%
Tool API 10%
Storage 7%

如果 Judge 占 40%:

优化Judge Sampling

比换便宜模型更有效。

七十八、Human Intervention Breakdown

Approval:
设计内

Rescue:
模型卡住

Manual Correction:
结果差

Incident:
安全

不要一个“人工介入率”全部混。

七十九、SLO和业务价值最终要连接

一个 Agent:

Success 99.9%

但每月只跑 10 次。

另一个:

Success 98%

每月帮 10000 个用户。

优先级不一样。

所以 Error Budget 讨论最好带:

Business Criticality
Volume
Value

八十、不要追求所有Agent五个9

99.999% 对很多知识型 Agent 不现实,也没必要。

正确目标取决于:

失败成本

FAQ:

可以低一点

付款:

必须极高

而且付款更应该靠确定性系统,不应该把关键正确性完全交给 LLM。

八十一、Agent SLO真正会推动一个很健康的变化

团队开始从:

这个模型看起来更聪明

转成:

这个版本的Task Success提高1.8%
P95降低12%
Cost下降9%
Safe Execution没有回退

讨论会更工程化。

八十二、本篇上线检查清单

□ Task Outcome独立于HTTP状态
□ SLO按Task Type定义
□ Task Success有明确Outcome Contract
□ Safety有Zero Tolerance事件
□ Latency至少区分First Useful和Completion
□ 统计Cost per Successful Task
□ Planned Approval与Unplanned Rescue分离
□ 记录Replan/Tool/Model Call
□ Error Budget按窗口计算
□ Burn Rate支持多窗口
□ Candidate与Baseline分版本比较
□ 关键Slice有独立SLO
□ 样本不足不显示PASS
□ Tool/Provider有独立Reliability指标
□ Release Policy与Error Budget联动
□ 模型、Prompt、Capability变化都算Release
□ SLO变更版本化并走PR
□ 安全Critical事件不允许被平均值稀释
□ SLO可以自动驱动Freeze/Fallback/Autonomy

总结

传统服务的可靠性问题通常是:

请求有没有成功

Agent 更复杂。

一次 HTTP 成功后,还要继续问:

任务完成了吗?
过程安全吗?
花了多少钱?
用了多久?
有没有人工救场?
有没有产生不可接受副作用?

所以生产级 Agent 的 SLO 必须从单一可用率升级成多维约束。

最核心的 6 个指标,我会一直保留:

Task Success
Safe Execution
P95 Completion
Cost per Successful Task
Unplanned Intervention
Error Budget Remaining

再用 Error Budget 把可靠性状态真正接到:

发布
自主权限
Fallback
评测强度

上。

做到这一步以后,Agent 平台才不再依赖:

“大家感觉最近挺稳定”

而是能明确说:

我们允许多少失败
现在已经用了多少
哪个版本正在加速烧预算
下一次发布到底还能不能放行

这才是 Agent 从“能执行”走向“可运营”的关键一步。

下一篇继续推进:

生产级Agent(21):多租户隔离与数据边界——让Memory、RAG、Tool和Artifact都不越租户。


更多企业级 AI 应用、Agent、RAG 与模型工程化内容,我会继续整理在 智元界

https://www.zyentor.com/