#AI#大模型#DevOps

AI 质量合成探针:用固定任务持续检测模型、RAG 与 Agent 退化

HTTP 200 无法证明 AI 结果仍然可用。本文把固定任务做成低风险黑盒探针,覆盖评分契约、隔离执行、OpenTelemetry 指标、Prometheus 告警和误报回滚。

本文要点

  • 主题聚焦:AI、大模型、DevOps
  • 适合人群:独立开发者、全栈工程师、AI 应用开发者
  • 核心价值:快速理解背景、实践路径、常见误区和工程建议
作者 @admin·发布于 2026年1月12日·更新于 2026年7月20日

AI 服务最危险的退化常常返回 200 OK:模型开始忽略格式约束,RAG 引用过期页面,Agent 选择了错误工具,或者备用供应商能响应却不再满足业务规则。请求错误率和 CPU 看板都可能正常,直到用户集中投诉才暴露问题。合成质量探针是在没有真实用户参与时,定时提交已知任务并检查结果,主动回答“关键能力现在还能不能完成”。

它不替代离线评测。LLM 评测框架 适合在发布前比较大样本和候选版本;合成探针只选少量高信号任务,持续穿过生产域名、鉴权、路由、模型、检索和工具依赖。它也不同于 LLM SLO 与告警 的通用指标设计,本篇关注探针如何安全执行、怎样产生可信告警。

每个探针必须有明确契约

从用户旅程选 5 到 20 个任务,而不是随机向模型提问。每个任务记录稳定 ID、业务能力、输入夹具版本、允许模型、最大 token、超时、预算、禁止副作用和判定规则。例如退款政策问答要求引用指定知识域且日期不旧于基线;结构化抽取要求 JSON Schema 通过;Agent 工单流程只能调用只读沙箱工具,并到达 resolved 状态。

yaml
id: refund-policy-citation-v3
schedule: "*/10 * * * *"
route: support-rag
fixture_ref: sealed://quality-probes/refund-v3.json
limits:
  timeout_ms: 15000
  max_output_tokens: 500
  max_cost_usd: 0.03
assertions:
  schema_valid: true
  required_citation_hosts: [docs.example.com]
  forbidden_claims: ["永久退款", "无需订单"]
  grounded_score_min: 0.85

断言分三层。确定性检查包括状态码、Schema、必需字段、引用域名和工具调用白名单,应直接决定成败。规则评分检查关键事实、数值范围与禁止声明。模型裁判只处理语义相关性等无法精确编码的部分,并固定裁判模型、Prompt 和温度;边界分数进入复核而不是立刻呼叫值班人员。这样裁判自身波动不会伪装成业务事故。

探针必须与真实用户隔离

为探针建立专用租户、凭证、配额和数据集,所有写工具指向可重置沙箱。请求携带 synthetic=true 和有限的 probe_id,便于在 Trace 中识别,但生产路由不能因为这个标签跳过鉴权、检索或模型调用,否则只验证了一条特制捷径。计费和用户分析需要排除探针流量,容量和供应商限额则应保留,因为它们正是端到端依赖的一部分。

Kubernetes CronJob 适合低频调度,但要设置 concurrencyPolicy: Forbid、起始截止时间和作业 TTL,防止控制面恢复后补跑大量旧探针。调度器故障本身也要监控;“没有失败样本”可能只是任务从未启动。跨区域部署时,每个区域用相同夹具和版本,探针 ID 增加有限的 region 标签,避免把运行 UUID 写进指标。

输出低基数指标和可追踪证据

每次运行创建独立 Trace,根 span 采用 OpenTelemetry GenAI 语义属性,并补充 probe.id、fixture.version、assertion.outcome 与 failure.class。完整输入输出经过脱敏后放入受限证据库,指标只暴露有限维度:

text
ai_synthetic_probe_runs_total{probe,region,outcome,failure_class}
ai_synthetic_probe_duration_seconds{probe,region}
ai_synthetic_probe_score{probe,region,assertion}
ai_synthetic_probe_last_success_timestamp_seconds{probe,region}

质量分用 gauge 记录当前结果,同时保留 pass/fail 计数。不要把回答文本、Trace ID 或执行时间戳当标签。告警采用连续失败与多窗口组合,单次超时只建事件:

yaml
- alert: AiSyntheticCapabilityDegraded
  expr: |
    sum by (probe, region) (
      increase(ai_synthetic_probe_runs_total{outcome="fail"}[20m])
    ) >= 2
  for: 5m
  labels:
    severity: page

告警附最近成功时间、失败类别、探针版本和 Trace 链接。若多个不同探针同时出现 provider timeout,倾向基础设施事故;只有一条引用断言下降,更可能是知识或评分规则变化。线上真实信号可参考 Agent 在线评测指标,两者同时异常才升级质量事故等级。

发布前证明探针能发现已知故障

先在预生产环境做故障注入:让模型返回非法 JSON、移除一篇知识文档、延迟工具响应、阻断备用区域,再确认探针在约定时间内失败且分类正确。随后恢复依赖,确认告警自动清除。以最近三十次稳定运行建立延迟和分数基线,任何阈值都要留出模型自然波动,不能根据一条漂亮样本设定。

探针定义同代码评审,夹具和评分器版本都进入变更记录。发布新 Prompt 或索引前,同时跑旧、新两套探针,确认差异来自被测系统而非探针升级。RAG 评测漂移控制 中的锚点样本适合用于校准引用与 grounded score,避免裁判模型更新后整条曲线无意义平移。

误报和真实事故使用不同回滚

探针失败后先检查调度、凭证、专用配额与夹具可用性,再用同一版本手工重跑一次,并对照真实请求指标。确认业务退化时,冻结相关发布,按路由切回上一模型、Prompt 或索引版本,再等待连续三轮探针通过后解除事故状态;不要只因一次成功就恢复全量。

若问题来自探针本身,先把该探针降为 ticket 级别,保留运行和证据,不要关闭整个探针系统。回滚到上一份已签名定义,修正夹具或裁判后,在历史成功与失败样本上回放,证明误报率恢复再重新启用 paging。任何情况下都不能通过降低业务阈值来“修复”告警而不记录原因。

合成质量探针的目标不是给模型做每日考试,而是让一小组关键能力拥有持续、外部、可操作的证据。任务固定、执行隔离、判定分层且回滚可验证后,SRE 才能在 HTTP 仍然成功时,提前发现 AI 系统已经不再完成用户真正需要的工作。

延伸阅读

Related

相关推荐