← 调研中心 生产验证专题 · 06 / 08

Per-turn SLI · Deadline · Recovery truth

端到端语音 Agent SLA
与无密钥故障注入

不再把 ASR、LLM、TTS 的分位数机械相加。对每个话轮直接测“用户声学结束 → 扬声器实际起音”,并把失败、降级、陈旧结果与工具最终状态放进同一条 trace。

2026-08-3114 SCENARIOS28 RUNS72 TURNS18 TESTSNO VENDOR KEY
证据边界

本报告完成了本地代码审计和单进程确定性故障注入。没有真实 SIP/RTC、运营商、云端 ASR/LLM/TTS、真人音频或生产流量;所有毫秒数都是固定脚本输入,不是生产 SLA,也不用于厂商排名。

01 · Decision

SLA 是逐话轮事件契约,不是组件报表相加

分位数没有可加性。正确做法是直接从每个有效话轮计算端到端观测延迟,并让超时、失败、降级与一致性错误留在分母。

14 / 14Guarded 业务不变量通过
11 / 11Naive 阳性对照故障全部被击穿
28 / 28Harness expectation 匹配
72有效话轮样本,失败不删除
T05 · USER ACOUSTIC END用户声学结束;不是 ASR final
T19 · AUDIBLE RESPONSE ONSET扬声器真正起音;不是 TTS 首字节
关键反例:Guarded 与 Naive 的合成 p50 / p95 / p99 都是 500 / 1250 / 1300 ms,但 Naive 有 11 / 36 deadline miss、9 / 36 失败和多类一致性泄漏。单看延迟会把错误答案、旧音频和重复副作用误当成功。

02 · Evidence boundary

代码事实、控制实验与真实生产要分开

本地代码已确认

Go Gateway 有下行 generation、队列上限和 WebSocket 写 deadline;Java 有队列清理和 provider 隔离。现有 ASR/Qwen 客户端没有统一 retry budget、熔断与 fallback。

合成实验已确认

逐话轮分位数、失败分母、三类 epoch gate、429/deadline、retry budget、breaker、fallback、预录降级与 UNKNOWN 对账可被确定性验证。

真实环境仍未知

真实建呼、RTP/RTCP、WebRTC、厂商长尾、限流、区域故障、声学起音、并发和 soak 均未测试,不能给生产阈值或合同承诺。

03 · Measurement contract

首字节、首音频包和用户听到声音是三个事件

每个阶段保留自己的诊断指标,但端到端分位数只从同一话轮的两个边界直接计算。失败直到观测窗口结束仍要形成删失样本。

T05 · 声学结束端到端起点
T08 · EOU commit承诺 input revision
T09 · ASR final最终识别结果
T10 / T11 · LLM请求与首 token
T12 · Tool关键路径与最终状态
T15 · TTS bytes网络首字节
T16 · Decodable首个可解码 sample
T18 · Enqueued播放器入队
T19 · Audible端到端终点
样本状态端到端观测值分母处理
正常起音T19 - T05valid event
deadline 后才起音T19 - T05 + deadline_missed继续保留
永不返回 / timeoutterminal_observation - T05 + censored继续保留
降级语起音实际降级起音 - T05标 degraded,不能混成正常成功

04 · Trace and epochs

每条异步结果都要证明“属于现在”

一个粗粒度 session ID 无法阻止旧 ASR、旧模型答案、旧工具回执和旧音频污染新话轮。最小契约需要以下关联字段。

trace_idcall_idsession_idturn_idinput_revisionresponse_generation_idtool_operation_idaudio_generation_idprovider_request_idattemptseqat_ms
ASR gate

校验 turn_id + input_revision;partial 修订后,旧 final 只能进审计。

Response gate

LLM 与工具结果再校验 response_generation_id,取消后不得写回当前轮次。

Audio gate

TTS chunk 还要校验 audio_generation_id;停播后旧 chunk 不得再次入队。

Write recovery

UNKNOWN 先按稳定 operation/idempotency key 对账;不能换 key 直接重做。

05 · Local audit

已有组件能局部自保,还没有统一的整轮可靠性层

本地资产已有证据主要缺口证据等级
Speech Gateway · Go真实 loopback UDP/RTP/WebSocket、generation、队列与写 deadline;Go 全包本轮通过没有跨 ASR/LLM/tool/TTS 的 parent deadline 与统一 trace代码 + 重跑
Speech Gateway · JavaMedia Core 队列、generation、provider 隔离;历史 85 / 85 Surefire本机缺 Maven;无重试、熔断、fallback;RTP timeout 回收未闭环历史证据
Duplex Trace事件转换、seq 覆盖、collector 失败不阻断本地 trace没有把全组件串进同一真实 call trace本地工具
ASR / Qwen Benchtimeout 与失败记录管线现有结果多为 mock;无统一重试、breaker、fallback管线证据
Tool Transaction幂等、UNKNOWN、Saga、Outbox、去重的确定性验证单进程内存世界,不是生产事务系统控制实验

06 · Deterministic lab

14 个场景同时打 latency、deadline 与一致性

Guarded

  • 逐话轮 valid-event 分母与删失样本
  • ASR / response / audio 三类 epoch gate
  • parent deadline、阶段 timeout 与执行预留
  • Retry-After、限次、retry budget
  • breaker、half-open、fallback 与预录语
  • UNKNOWN 先对账,副作用保持一次
14 / 14控制不变量通过
6 / 36受控降级话轮

Naive positive control

  • 失败样本可能从延迟口径消失
  • 接受旧 revision / generation 结果
  • 重试不检查 deadline 与总等待预算
  • 持续请求故障 provider
  • WebSocket 一直等到父 deadline 耗尽
  • UNKNOWN 写换 key 重做
11 / 11阳性对照出现预期故障
9 / 36失败话轮
SLA math × 2错峰尾延迟;失败与 deadline miss 分母。PERCENTILE / DENOMINATOR
Epoch gates × 4旧 ASR、LLM、TTS 与跨话轮工具结果。STALE REJECTION
Retry × 3429 可等待、超过 deadline、预算耗尽。BOUNDED RETRY
Circuit breaker × 1closed → open → half-open → closed。RECOVERY STATE
Timeout / fallback × 2provider stage 与 WebSocket 无数据。DEGRADE
Tool final state × 1提交后响应丢失,UNKNOWN 先 reconcile。ONE SIDE EFFECT
Baseline × 1统一 call/turn trace 的无故障控制。CONTROL

07 · Results

错误算法差 1.8 秒,延迟分位数却仍看不见一致性故障

错峰尾延迟反例

1250 ms 20 条话轮直接计算的合成 e2e p95

同一批样本把 ASR、LLM、TTS、播放各自 p95 相加得到 3050 ms。组件分位数只用于归因,不可相加成端到端 SLA。

合成控制结果

Guarded 不变量
14 / 14
Naive 故障检出
11 / 11
Harness 匹配
28 / 28
单元测试
18 / 18
聚合指标GuardedNaive为什么不能只看一列
合成 p50 / p95 / p99500 / 1250 / 1300 ms500 / 1250 / 1300 ms分位数相同,不代表最终状态正确
deadline miss2 / 3611 / 36必须作为独立 bad event
失败 / 删失1 / 19 / 9失败不能从延迟样本删除
受控降级6 / 362 / 36降级与正常成功分层报告
旧结果与重复副作用全部拦截阳性对照出现“有声音”不等于成功

机器可读 raw SHA-256:0cdbacf289cc342cca70a2be1a39b5b8861148030885498ed98fda28dfef648d。18 / 18 单元测试通过;独立临时目录重跑与仓内 raw/summary 逐字节一致。

08 · Recovery rules

实时链路的恢复动作必须服从剩余时间和副作用风险

Timeout hierarchy

子 timeout 必须小于父 deadline,预留 fallback、合成与播放时间。

One retry layer

SDK、网关、Agent 只允许一个明确层重试,避免指数放大。

Retry-After + reserve

尊重服务端等待建议,但等待后无执行余量时立即降级。

Read vs write

读可切 provider;写先幂等、查状态,UNKNOWN 不直接重做。

Scoped breaker

按 provider / region / capability 拆分,half-open 只放少量探针。

Bulkhead

为 ASR、LLM、TTS 隔离队列和并发,慢流不能拖垮整通电话。

Fallback ladder

缓存 → 小模型 → 无工具解释 → 预录语 → 文本 / 人工。

Fail closed

支付、订单、账户等高风险动作失败时不得由模型猜成功。

09 · SLI / SLO design

SLO 至少同时约束六类结果

层级最低指标常见误区
建呼 / 媒体2xx、双向 RTP、loss、jitter、concealment、单向静音SIP 200 当成用户已听到声音
识别 / EOUpartial/final、revision、final 缺失、误切/漏切partial 直接触发不可逆写操作
Agent / 工具deadline、任务成功、最终状态、重复副作用、UNKNOWN只看最后文本,不看外部状态
TTS / 播放TTFB、可解码音频、audible onset、underrun、旧音频首字节当用户感知起音
业务 / 降级任务完成、转人工、重复提问、放弃、fallback把预录语返回算正常完成
一致性陈旧结果、旧音频、重复写、越权状态用普通错误预算容忍安全不变量

10 · Production path

先统一 ID、deadline 与状态,再接真实线路

01 · EVENT CONTRACT统一时间点、错误码、valid-event 分母
02 · EPOCH GATESturn / revision / response / audio / operation
03 · DEADLINE跨组件 parent deadline 与执行预留
04 · RECOVERYretry budget、breaker、bulkhead、fallback
05 · DURABILITY持久幂等、Outbox、对账与人工异常队列
06 · REAL CANARY目标地区线路、合法音频、负载与 soak
升级为真实 SLA 的硬门:需要目标地区运营商或测试线路、真实供应商账号/密钥、合法测试音频、播放器实际可听起音埋点、生产等价的隐私控制,以及并发、重启、网络和资源压力测试。按本轮要求,这些环节全部跳过。
多 FreeSWITCH 桥接的后续方案:AI 客服呼入多 FreeSWITCH 语音质量监控专题进一步拆解 MiniMax 分块、每个 call leg、逐跳 RTP/RTCP、播放 buffer 与终端录音的关联和定位。

复现本地控制实验

cd ./voice-sla-fault-bench python3 -m voice_sla_fault_bench run --output-dir results python3 -m voice_sla_fault_bench validate-results \ --raw results/raw_results.jsonl --summary results/summary.json python3 -m unittest discover -s tests -v

11 · Sources

标准、官方资料与本地证据

  1. Google SRE · Service Level Objectives — SLI、SLO 与 SLA 边界。
  2. Google SRE Workbook · Implementing SLOs — 用户旅程、good/valid events 与窗口。
  3. Google SRE Workbook · Error Budget Policy 与 Alerting on SLOs — 错误预算和 burn-rate。
  4. Google SRE · Monitoring Distributed Systems — latency、traffic、errors、saturation。
  5. The Tail at Scale — 多组件服务的尾延迟放大。
  6. RFC 3261 · SIP、RFC 3550 · RTP/RTCP、RFC 3611 · RTCP XR — 信令与媒体统计。
  7. W3C WebRTC Statistics 与 RFC 6455 · WebSocket — RTC 指标、关闭与重连边界。
  8. ITU-T G.114 — 单向传输时延;不等于整轮 Agent SLA。
  9. W3C Trace Context 与 OpenTelemetry Trace API — 跨服务 trace。
  10. OpenTelemetry GenAI Semantic Conventions — 实验性生成式 AI 遥测命名。
  11. Amazon Transcribe · Partial-result stabilization — partial 修订与 final 边界。
  12. OpenAI Realtime VAD 与 Interruption / Truncation — VAD、取消与播放侧职责。
  13. Azure Speech · Synthesis latency — first byte、completion 与网络延迟。
  14. RFC 6585 §4 · 429 与 RFC 9110 · Idempotent Methods — 限流与重试边界。
  15. AWS Builders' Library · Timeouts, retries and backoff — 限次、退避、jitter 与 retry budget。
  16. AWS Builders' Library · Making retries safe — 稳定请求 ID 与原结果复用。
  17. Microsoft · Circuit Breaker pattern — open、half-open 与探针。
  18. Sagas 与 AWS Transactional Outbox — 补偿、双写与最终状态。
  19. 本地Speech Gateway Go / Java、Duplex Trace、Tool Transaction Bench — 代码、历史测试与本轮复跑证据。
  20. 本轮Voice SLA Fault Bench — 14 场景、28 运行、72 话轮、275 事件与可复算结果。