01 · Decision
SLA 是逐话轮事件契约,不是组件报表相加
分位数没有可加性。正确做法是直接从每个有效话轮计算端到端观测延迟,并让超时、失败、降级与一致性错误留在分母。
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
首字节、首音频包和用户听到声音是三个事件
每个阶段保留自己的诊断指标,但端到端分位数只从同一话轮的两个边界直接计算。失败直到观测窗口结束仍要形成删失样本。
| 样本状态 | 端到端观测值 | 分母处理 |
|---|---|---|
| 正常起音 | T19 - T05 | valid event |
| deadline 后才起音 | T19 - T05 + deadline_missed | 继续保留 |
| 永不返回 / timeout | terminal_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
校验 turn_id + input_revision;partial 修订后,旧 final 只能进审计。
LLM 与工具结果再校验 response_generation_id,取消后不得写回当前轮次。
TTS chunk 还要校验 audio_generation_id;停播后旧 chunk 不得再次入队。
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 · Java | Media Core 队列、generation、provider 隔离;历史 85 / 85 Surefire | 本机缺 Maven;无重试、熔断、fallback;RTP timeout 回收未闭环 | 历史证据 |
| Duplex Trace | 事件转换、seq 覆盖、collector 失败不阻断本地 trace | 没有把全组件串进同一真实 call trace | 本地工具 |
| ASR / Qwen Bench | timeout 与失败记录管线 | 现有结果多为 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 先对账,副作用保持一次
Naive positive control
- 失败样本可能从延迟口径消失
- 接受旧 revision / generation 结果
- 重试不检查 deadline 与总等待预算
- 持续请求故障 provider
- WebSocket 一直等到父 deadline 耗尽
- UNKNOWN 写换 key 重做
07 · Results
错误算法差 1.8 秒,延迟分位数却仍看不见一致性故障
错峰尾延迟反例
1250 ms 20 条话轮直接计算的合成 e2e p95同一批样本把 ASR、LLM、TTS、播放各自 p95 相加得到 3050 ms。组件分位数只用于归因,不可相加成端到端 SLA。
合成控制结果
| 聚合指标 | Guarded | Naive | 为什么不能只看一列 |
|---|---|---|---|
| 合成 p50 / p95 / p99 | 500 / 1250 / 1300 ms | 500 / 1250 / 1300 ms | 分位数相同,不代表最终状态正确 |
| deadline miss | 2 / 36 | 11 / 36 | 必须作为独立 bad event |
| 失败 / 删失 | 1 / 1 | 9 / 9 | 失败不能从延迟样本删除 |
| 受控降级 | 6 / 36 | 2 / 36 | 降级与正常成功分层报告 |
| 旧结果与重复副作用 | 全部拦截 | 阳性对照出现 | “有声音”不等于成功 |
机器可读 raw SHA-256:0cdbacf289cc342cca70a2be1a39b5b8861148030885498ed98fda28dfef648d。18 / 18 单元测试通过;独立临时目录重跑与仓内 raw/summary 逐字节一致。
08 · Recovery rules
实时链路的恢复动作必须服从剩余时间和副作用风险
子 timeout 必须小于父 deadline,预留 fallback、合成与播放时间。
SDK、网关、Agent 只允许一个明确层重试,避免指数放大。
尊重服务端等待建议,但等待后无执行余量时立即降级。
读可切 provider;写先幂等、查状态,UNKNOWN 不直接重做。
按 provider / region / capability 拆分,half-open 只放少量探针。
为 ASR、LLM、TTS 隔离队列和并发,慢流不能拖垮整通电话。
缓存 → 小模型 → 无工具解释 → 预录语 → 文本 / 人工。
支付、订单、账户等高风险动作失败时不得由模型猜成功。
09 · SLI / SLO design
SLO 至少同时约束六类结果
| 层级 | 最低指标 | 常见误区 |
|---|---|---|
| 建呼 / 媒体 | 2xx、双向 RTP、loss、jitter、concealment、单向静音 | SIP 200 当成用户已听到声音 |
| 识别 / EOU | partial/final、revision、final 缺失、误切/漏切 | partial 直接触发不可逆写操作 |
| Agent / 工具 | deadline、任务成功、最终状态、重复副作用、UNKNOWN | 只看最后文本,不看外部状态 |
| TTS / 播放 | TTFB、可解码音频、audible onset、underrun、旧音频 | 首字节当用户感知起音 |
| 业务 / 降级 | 任务完成、转人工、重复提问、放弃、fallback | 把预录语返回算正常完成 |
| 一致性 | 陈旧结果、旧音频、重复写、越权状态 | 用普通错误预算容忍安全不变量 |
10 · Production path
先统一 ID、deadline 与状态,再接真实线路
复现本地控制实验
11 · Sources
标准、官方资料与本地证据
- Google SRE · Service Level Objectives — SLI、SLO 与 SLA 边界。
- Google SRE Workbook · Implementing SLOs — 用户旅程、good/valid events 与窗口。
- Google SRE Workbook · Error Budget Policy 与 Alerting on SLOs — 错误预算和 burn-rate。
- Google SRE · Monitoring Distributed Systems — latency、traffic、errors、saturation。
- The Tail at Scale — 多组件服务的尾延迟放大。
- RFC 3261 · SIP、RFC 3550 · RTP/RTCP、RFC 3611 · RTCP XR — 信令与媒体统计。
- W3C WebRTC Statistics 与 RFC 6455 · WebSocket — RTC 指标、关闭与重连边界。
- ITU-T G.114 — 单向传输时延;不等于整轮 Agent SLA。
- W3C Trace Context 与 OpenTelemetry Trace API — 跨服务 trace。
- OpenTelemetry GenAI Semantic Conventions — 实验性生成式 AI 遥测命名。
- Amazon Transcribe · Partial-result stabilization — partial 修订与 final 边界。
- OpenAI Realtime VAD 与 Interruption / Truncation — VAD、取消与播放侧职责。
- Azure Speech · Synthesis latency — first byte、completion 与网络延迟。
- RFC 6585 §4 · 429 与 RFC 9110 · Idempotent Methods — 限流与重试边界。
- AWS Builders' Library · Timeouts, retries and backoff — 限次、退避、jitter 与 retry budget。
- AWS Builders' Library · Making retries safe — 稳定请求 ID 与原结果复用。
- Microsoft · Circuit Breaker pattern — open、half-open 与探针。
- Sagas 与 AWS Transactional Outbox — 补偿、双写与最终状态。
- 本地Speech Gateway Go / Java、Duplex Trace、Tool Transaction Bench — 代码、历史测试与本轮复跑证据。
- 本轮Voice SLA Fault Bench — 14 场景、28 运行、72 话轮、275 事件与可复算结果。