Skip to content

延迟分位数、用量与成本归因 ​

平均用时把绝大多数快请求和少数极慢请求混在一起。p95回答95%的样本不超过什么值,但算法与窗口要明确;小样本p95常等于最大值,不能过度解释。

可重复的统计定义 ​

完整标准库实验使用nearest-rank定义,排序后取ceil(p*n)-1。费用为示意整数微单位,并非供应商报价。

python
import math

def percentile(values,p):
    if not values or not 0<p<=1:raise ValueError("invalid sample")
    return sorted(values)[math.ceil(p*len(values))-1]
latency=[10,11,12,13,100]
assert percentile(latency,.5)==12
assert percentile(latency,.95)==100
usage=[{"input":100,"cached":40,"output":20}, {"input":100,"cached":0,"output":10}]
def cost(row):
    if not 0<=row["cached"]<=row["input"]:raise ValueError("bad cache usage")
    return (row["input"]-row["cached"])*2+row["cached"]*1+row["output"]*6
assert sum(map(cost,usage))==540
print(percentile(latency,.95),sum(map(cost,usage)))

缓存输入在本题已包含于input,必须先扣除再按缓存单价计费,否则重复计算。真实供应商字段与价格可能不同,按对应模型/版本官方计费定义映射。重试失败也可能消耗token,不应只统计最终成功调用。

从投诉拆到原因 ​

用户说“十秒才出现文字”,先拆排队、网络、首token、生成、工具与后处理。流式首token改善不一定减少总耗时;工具循环增加总任务时间但不一定出现在单次模型span里。成本按task/tenant/模型/工具归因,缓存、Embedding、重排、存储和GPU有各自计量,不全归入输出token。

检索质量下降先看召回、权限过滤与索引版本;回答空白可能来自schema拒绝而不是模型无输出;工具风暴可能由重试层叠加。比较发布前后时保持请求切片一致,输入主题变化和模型回归是两种原因。

SLO要有分母与窗口,例如过去30分钟可用请求中成功比例及p95阈值。低流量时分位数波动大,结合错误预算和最小样本数;告警必须关联可操作动作,不能只说“AI质量不好”。用户点赞、重问、编辑、转人工都是代理信号,需要与任务验收和人评交叉核对。

练习 ​

为空样本与p=0分别验证ValueError;再输入cached>input,费用计算必须拒绝,不能产生负的未缓存token。

核对本章答案

下一章

用心记录每一步成长