1、Trace 与 Metrics 的分工
Trace 擅长回答单次请求为什么会出问题,但如果我们需要了解系统在一段时间内的整体变化,例如:这周整体延迟是不是变慢了,新模型上线之后,记忆命中率有没有下降,情绪系统是不是突然变得过于敏感,Token 成本为什么这个月异常上升。仅靠 Trace 还不够。
这些问题主要通过 Metrics,也就是指标体系来回答。
Trace 负责深入排查具体请求,Metrics 负责发现整体趋势。两者结合起来,才能为 AI 系统的日常运营提供完整依据。
2、核心指标
核心指标:先记录请求总数、成功数、错误数、客户端中断数和模型供应商错误数。这组指标用于判断系统是否可用,不能只依赖业务 Trace,因为没有成功创建 Trace 的请求也可能是故障的一部分。
延迟指标:延迟是用户最容易感知到的质量指标。在查看相关数据之前,我们先理解两个常用术语:
| 术语 | 描述 | 定义 |
|---|---|---|
| TTFB | Time To First Byte,首字节时间 | 从请求发出到收到 HTTP 响应第一个字节的耗时。它受网络、代理和响应头生成影响,不等同于模型开始生成文本的时间 |
| TTFT | Time To First Token,首 token 时间 | 从请求发出或模型调用开始,到收到第一个可显示模型 token 的耗时。在流式回复中,TTFT 更接近用户等待 AI 开始输出的体验 |
| P50 / P95 / P99 | 百分位数 | P50 表示 50% 的请求比这个值快,也就是中位数;P95 表示 95% 的请求比这个值快。P95 和 P99 越高,说明尾部慢请求越严重,也就是大部分请求正常,但仍有少数用户等待时间很长 |
检索质量指标:用户反馈最近回复变慢时,可以先从这组指标入手,判断问题发生在整体管线还是模型调用阶段。
对于 AI 伴侣,记忆系统是否有效,会直接影响用户对连续对话的感受。检索质量指标可以帮助我们判断记忆是否顺利召回,以及召回结果中是否混入了过多噪声。
| 指标 | 计算方式 | 关注点 |
|---|---|---|
| 候选召回率 | 检索结果至少包含 1 条候选记忆的请求占比 | 判断检索是否有结果,不能直接代表相关性 |
| 相关记忆命中率 | 经人工标注、规则或离线评估确认命中的请求占比 | 判断召回结果是否真的有用 |
| 平均有效召回条数 | 每次检索到并通过相关性阈值的记忆数量 | 太少信息不足,太多噪声过大 |
| Top-1 相似度分布 | 每次检索第一条的得分分布,并按模型、索引版本分组 | 观察检索变化;不同模型或向量库的分数不能直接横向比较 |
情绪系统指标:情绪状态机出现问题时,通常不会直接报错,更多表现为回复语气或关系状态不自然。这类变化很难通过错误日志发现,因此尤其依赖指标观察
| 指标 | 计算方式 | 关注点 |
|---|---|---|
| 情绪分类分布 | 各情绪状态占比 | 是否长期偏向某一类 |
| 状态切换频率 | 每会话切换次数 | 是否过度敏感 |
| 状态转移矩阵 | 起始状态到目标状态的转移次数 | 是否出现异常跳转 |
| 亲密度变化分布 | 按会话或用户分组统计每次增量,而不是只看日均值 | 是否出现异常跳变或单次累积过大 |
成本指标:AI 系统的调用过程会持续产生 Token 和模型费用,因此成本不只是财务统计,也会反过来影响模型选择、上下文长度和安全策略等架构决策。
| 指标 | 计算方式 | 关注点 |
|---|---|---|
| Token 消耗量 | 输入加输出 token 总数 | 决定 API 账单 |
| 单次对话成本 | token 数乘模型单价 | 是否突破预算 |
| 模型调用次数 | 按模型、供应商和路由统计调用次数 | 是否因为重试或降级导致调用放大 |
安全与质量指标:安全拦截率不属于成本指标,但它是重要的业务质量指标。应同时观察误拦截率、漏检率、策略版本和人工复核结果;仅凭拦截比例本身无法判断策略是否合理。
| 指标 | 计算方式 | 关注点 |
|---|---|---|
| 安全拦截率 | 被安全策略拦截的请求占比 | 是否出现策略过严或过松 |
| 人工复核误拦截率 | 被拦截请求中经复核确认不应拦截的比例 | 判断误杀情况 |
| 策略版本分布 | 按安全策略版本统计请求数和结果 | 对比策略发布前后的变化 |
3、指标采集
指标不需要像 Trace 一样保存完整现场,只需要在请求执行过程中提取关键数值。
实现采集时,可以先处理两种基本类型。真正的落地还需要选择指标后端;不要把所有请求都读改写到同一个 KV key:KV 是最终一致的,同一个 key 的并发写入可能互相覆盖,并且有同 key 写入频率限制。
- 计数器(Counter):统计某件事发生了多少次,例如请求总数和 Token 消耗量,每次采集只需要累加
- 直方图(Histogram):记录每次观测到的具体值,例如延迟和相似度分数,后续由指标后端计算平均值、分位数和分桶统计
metrics.ts
class MetricsCollector {
private points: A