前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片NEW
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 业务场景题真实业务问题与追问
  • 查漏补缺常见问题解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
    • AI 定制路线NEW按你的简历现排
    • AI 知识地图NEW串起全站知识点
  • 动态
    • AI 热点NEWAI 每日动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
AI 助手NEW
旧版
返回 AI 情报前线
All News · 全部资讯8773
  • Claude Code 高级编排:子 Agent 模式与防耗尽策略
  • 用 Spring Boot 搭建自托管 AI 客服组件,零 SaaS 订阅
  • 给 AI 写指令本质是写警告标签
  • Meta 认为编程代理的未来在于持久记忆而非更强模型
  • GitHub Code Quality 不再自动为 PR 添加 Copilot 审阅者
  • 别再往ChatGPT扔错误堆栈了
  • Claude Fable 5单次会话从推文构建可玩3D游戏
  • 让AI Agent拥有支付能力:x402协议实战
  • AI Agent工具优化:让Agent能安全调用你的工具
  • 用 Python + AI 自动化播客元数据流水线
  • AWS上Agentic AI实际成本拆解:单元经济学分析
  • open-connector:让AI Agent永远不接触用户凭证
  • npm脚本骗过多数用户:Agent权限提示研究
  • 警惕:MCP服务器正重蹈npm安全覆辙
  • GitHub Actions触发器丢失需手动恢复,附多条工具快讯
  • 本地语音助手如何做到「即时感」的工程实践
  • SpaceXAI Grok 4.6、OpenAI 免费无限聊、Meta 编程 Agent 入局
  • 子进程清理的正确姿势:terminate 的三个谎言
  • TypeScript 子代理设计指南:何时该分叉,何时该内联
  • LLM 返回 Markdown 而非 JSON 的工程解法
  • AI Agent降级早知道:三大监控指标
  • GraphRAG生产环境实体重复问题及免费修复方案
  • JSON提示词Runner bug验证:200次重跑结论依然显著
  • 传统 API 网关为何无法保护 AI Agent 及解决方案
  • AI Agent 事故响应:滚动消失前应记录的关键数据
  • 字节跳动训练10万亿参数大模型对标Anthropic
  • MasterGo MCP Server 打通设计工具与 IDE:减少上下文切换认知损耗
  • Node.js AI Agent 工具超时:超时机制设计与模型可见性
  • AI助手为何总是答非所问:RAG系统的版本地狱
  • 我在 Claude Code 用了一周十亿 token?97% 是缓存
  • 我把 croniter 移植到 Rust 拿了 228/228,但这个数字什么也证明不了
  • 用代码量化品牌在 AI 搜索引擎中的可见度:GEO 扫分工具
  • 多模态模型的真正瓶颈在最弱编码器
  • Cloudflare 解读 Agent 时代的 Bot 行为评分体系
  • SvelteKit 配置可直接写入 vite.config.js
  • Cloudflare 统一 AI Gateway 与 Workers AI,提供统一路由与计费
  • Cloudflare Radar Researcher:用自然语言探索全球互联网流量数据
  • 在 Claude Code 中使用 Kimi K3 省钱提效
  • Matt Pocock 技能套装安装量突破 54 万次
  • 2026 年 AI 模型格局:主要玩家一览及选型指南
  • 电商从 1 到 1000 单的工程架构演进实战
  • AI Agent 让分布式系统双写问题代价飙升
  • Stack Overflow 流量暴跌 78%,AI 编码助手改变开发问题解决方式
  • Flow Render:用async/await思维重构UI交互
  • 我为何不再信任系统提示词的优先级
  • OpenAI GPT-5.6 发布:Sol/Terra/Luna 三层分级,Free 用户默认使用 Terra
  • 用 TypeScript 构建 Image-to-Video 提示词规划 MCP Server 教程
  • 链上 AI Agent 的信任边界设计实践
  • RAG Agent 行动前的人类在环机制设计
  • Uber 四个月烧完全年 AI 编码预算,微软停用付费编码工具
  • GitHub Actions 和 Pages 降级可用性的应对指南
  • 已加载 51 / 8773
8.0
热点
AI SCORE
编程提效2026-08-07 21:37

AI Agent降级早知道:三大监控指标

dev.to · AI#Agent#监控#LLM
Editor brief · 编辑速览

文章提出用任务完成率、步数分布和工具调用有效率三个代理指标,在用户投诉前发现Agent退化。

文章思维导图
Knowledge map
拖拽缩放
Full translation

完整中文译文

传统的监控回答的是"系统还活着吗"。对于 Agent 来说,它永远活着。你真正关心的退化表现为:状态码一样、延迟一样,但回答质量下降了,工具调用出错的频率更高了。

没有人会发警报给你。三周后客服说"最近这东西越来越不好用了",但没人说得清是什么时候开始的。

有两个东西可以解决这个问题。代理信号(在任何人投诉之前就会变动的指标),以及一个固定的测试集,可以反复运行来确认代理信号所暗示的问题。

四个最先变动的代理信号

这些指标都不直接测量质量,但都与质量相关,而且收集起来都是免费的。

1. 结果分布

每一次运行都恰好结束于一种终结状态。

export type Outcome =
  | "complete" | "refused" | "gave_up"
  | "max_turns" | "budget_exceeded" | "tool_failed" | "timeout";

metrics.increment("agent.outcome", 1, { outcome, model, promptVersion });

完成(complete)的占比是仪表盘上最有用的一个数字。它会因为真实的原因而变动——模型降级、工具损坏、提示词变更——而且会在有人提工单前几天就开始变动。

2. 完成所需轮数

如果同一个任务 Agent 需要更多步骤才能完成,说明它在变差。

metrics.histogram("agent.turns", turns, { intent, model });

关注 p50,而不是均值。p50 从 4 变到 6,即使均值保持平稳,也是一个真实的回归。

3. 工具调用参数有效性

模型生成的参数无法通过 schema 校验的频率。

const parsed = schema.safeParse(call.input);
metrics.increment("agent.tool_args", 1, {
  tool: call.name,
  valid: String(parsed.success),
});

这个指标异常敏感。一个悄然变动的模型在文字质量明显下降之前,schema 校验失败率就会显著升高。

4. 重试与自我修正率

Agent 用略微不同的参数反复调用同一个工具,或者在不同轮次之间自相矛盾的频率。

const repeats = countRepeatedCalls(trace);        // same tool, similar args
metrics.histogram("agent.repeat_calls", repeats, { model });

Four proxy signals moving before any user report<br>
arrives.

黄金集确认代理信号的怀疑

代理信号告诉你有东西变了,但它们无法告诉你答案是否真的变差了。为此你需要一组固定的输入和已知的正确答案,按计划反复运行。

export type GoldenCase = {
  id: string;
  input: string;
  mustCall?: string[];          // tools that should be used
  mustNotCall?: string[];       // tools that must not be
  assert: (out: AgentOutput) => Promise<Verdict>;
};

断言是难点部分,而且应该尽可能地确定性。用可检验的属性来判断,而不是评判文字表述:

{
  id: "refund-under-limit",
  input: "I want a refund for order ord_4471, it arrived broken",
  mustCall: ["get_order", "refund_order"],
  mustNotCall: ["send_email"],
  assert: async (out) => {
    const call = out.toolCalls.find((c) => c.name === "refund_order");
    if (!call) return fail("no refund attempted");
    if (call.input.orderId !== "ord_4471") return fail("wrong order");
    if (call.input.amountCents !== 8900) return fail("wrong amount");
    return pass();
  },
}

这类结构性断言在不同模型版本和反复运行中都是稳定的。对措辞的断言则不是——它们会在同义改写时失败,然后训练你忽略整个测试套件。

对于输出质量本质上就是文字的情况,使用带评分标准的模型评判者,并接受它有更多噪音。把这些用例跑三次,取多数结果。

对生产配置运行,按计划执行

// nightly, plus on every deploy that touches prompts, tools or model
export async function runGolden(): Promise<GoldenReport> {
  const cases = await loadCases();
  const results = await pMap(cases, async (c) => {
    const out = await runAgent(c.input, prodLikeCtx());   // real prompts, stub tools
    return { id: c.id, verdict: await c.assert(out), turns: out.turns };
  }, { concurrency: 4 });

  const passed = results.filter((r) => r.verdict.ok).length;
  metrics.gauge("golden.pass_rate", passed / results.length);
  return { results, passRate: passed / results.length };
}

使用录制的响应来 stub 工具,这样套件测量的是模型和提示词,而不是你集成那边出了什么状况。真实的 system prompt、真实的工具 schema、真实的模型 ID。

夜间运行很关键,因为你要防范的是你没有主动做的变更。提供方一侧的变更不需要发版就会生效,而只在 CI 中运行的套件是看不到它的。

针对 delta 告警,而非级别

const today = await runGolden();
const base = await loadBaseline();

const regressed = base.results.filter((b) =>
  b.verdict.ok && !today.results.find((t) => t.id === b.id)?.verdict.ok);

if (regressed.length >= 2) {
  await pager.notify(`golden: ${regressed.length} cases regressed`, {
    cases: regressed.map((r) => r.id),
    model: process.env.MODEL_ID,
  });
}

说出具体的用例名称才能让凌晨三点的告警有可操作性。"通过率降到了 87%"只能让人耸耸肩;但"refund-under-limit 和 refund-over-limit-needs-approval 都退化了"才是一个诊断结论。

用两个用例而不是一个,因为单个不稳定的用例最终一定会触发,然后训练所有人都忽略这个告警。

版本化管理输出所依赖的一切

logger.info("agent run", {
  runId, outcome, turns, costUsd,
  model: cfg.model,
  promptVersion: cfg.promptVersion,
  toolsetVersion: cfg.toolsetVersion,
  retrievalIndexVersion: cfg.indexVersion,
});

当质量下降时,第一个问题是"什么变了"。每次运行带上四个版本字段就把这个问题变成了一次查询。没有它们,就成了一次跨越发布日志和提供商变更日志的考古工作。

A golden-set run compared against its baseline, naming the specific cases<br>
that<br>
regressed.

最便宜的信号

问用户。对输出点一个赞或踩,与 run id 一起存储。

await db.feedback.create({ data: { runId, verdict, userId } });

响应率很低,而且样本偏向于不满的用户。但它仍然是唯一一个来自真正知道答案是否有用的人发出的信号——将它与运行轨迹关联起来,就把一条投诉变成了一個可复现的用例,而这正是黄金集最需要的东西。

《AI That Ships》涵盖了 AI 特性的评估和监控——代理指标、黄金集和结构性断言、回归告警,以及让"什么变了"变得有答案的版本化管理。

AI That Ships — Taking AI Features to Production

完整系列见 xgabriel.com/ai-in-typescript。

Original source

本文由 AI 翻译整理自 dev.to · AI,原文版权归原作者所有。

阅读英文原文
上一篇
LLM 返回 Markdown 而非 JSON 的工程解法
下一篇
GraphRAG生产环境实体重复问题及免费修复方案