基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
AIHT
内容
精选全部 AI 动态热点榜AI 日报收藏
分类
模型行业编程产品技术观点开源
更多
Agent 接入
返回首页开发者导航
AIHT
精选 / 资讯详情
8.0
热点
AI SCORE
编程提效2026-10-31 02:43

评估 Copilot 内部工具别只看调用量

dev.to · AI#Copilot#MCP#效果评估
Editor brief · 编辑速览

Copilot 使用指标 API 开始记录自定义技能、Agent 和 MCP 服务名称,每条记录容量从 5 项增至 25 项。文章强调应结合评测结果判断推广效果,并考虑遥测缺失,权限控制仍需独立落实。

文章思维导图
Knowledge map
拖拽缩放
AI deep read

AI 深度解读

GitHub Copilot 的 usage metrics API 开始报告内部 skills、custom agents 和 MCP servers 的名称,单条记录的容量也从 5 项增加到 25 项。团队终于能看见自建工具有没有人用,但作者提醒:调用多,只能证明有人在用,不能证明工具有效。

这篇文章值得读的地方,是把使用统计、任务评估和推广决策接了起来。对正在维护内部 AI 工具的团队,它提供了一套可参考的数据处理方案,也指出了排行榜最容易掩盖的缺口。

从 5 项到 25 项,解决了什么问题

按照原文描述,过去组织部署了多个内部 MCP servers 和 custom agents,统计结果仍可能只显示某种自定义扩展被使用,难以区分具体工具。现在 API 会带上客户配置的名称,团队可以回答更具体的问题:上个迭代上线的只读账单服务,究竟有没有人使用?

容量变化也有实际意义。一个开发者一天接触十几种工具,只有 5 个位置的记录可能容纳不下,后面的工具便从统计中消失。增加到 25 项,能保留更多长尾工具,但仍不代表数据完整。

名称让采用情况可见,次数却不能替工具质量作证。

连接成功不等于任务完成,调用发生也不等于代码最终合入。作者反复强调的,是避免把这几件事混成同一个指标。

这里还有一个信息边界:原文没有列出适用套餐、正式响应结构或具体接口路径。因此,不能把文章里的 TypeScript 类型当成 GitHub 的官方 schema,接入时仍要按实际 API 文档映射。

先把数据存下来,再谈看板

作者建议定时拉取 API,将结果存入自己的表,而不是直接拿 API 响应画图。原因很实际:趋势需要历史数据,后续关联任务结果,也需要稳定的数据结构。

下面是作者提出的标准化示例,每行对应某一天、某个用户使用的某个工具。它是建议实现,并非原文展示的生产实测代码。

// normalize-usage.ts
// Map whatever the usage metrics API returns into one row per named tool, per user, per day.

type RawUsageRecord = {
  day: string; // map from the API's date field
  user: string; // map from the API's user identifier
  entries: Array<{
    kind: "skill" | "agent" | "mcp_server";
    name: string; // the customer configured name, now reported
    interactions: number;
  }>;
};

export type ToolUsageRow = {
  day: string;
  user: string;
  toolKind: "skill" | "agent" | "mcp_server";
  toolName: string;
  interactions: number;
  truncated: boolean; // the record hit the entry limit, so its tail may be missing
};

const ENTRY_LIMIT = 25;

export function normalize(records: RawUsageRecord[]): ToolUsageRow[] {
  return records.flatMap((record) =>
    record.entries.map((entry) => ({
      day: record.day,
      user: record.user,
      toolKind: entry.kind,
      toolName: entry.name.trim().toLowerCase(),
      interactions: entry.interactions,
      truncated: record.entries.length >= ENTRY_LIMIT,
    }))
  );
}

要看的是 truncated: record.entries.length >= ENTRY_LIMIT:达到 25 项就标记「可能缺失」,并不是确认发生了截断。看板应该保留这种不确定性。

名称处理同样需要留神。trim().toLowerCase() 能消除首尾空格和大小写差异,却不能自动识别工具改名,也可能合并原本不同的名称。作者提出统一名称是对的,但这段示例还不能独立解决工具身份的长期追踪问题。

怎样把调用次数接到任务结果上

GitHub 一侧的数据已经聚合,团队自己的评估通常按单次运行记录。两边粒度不同,不能直接逐条拼接。作者选择「工具名称+日期」作为共同关联键,让同一天的采用情况和评估表现出现在同一行。

作者没有推荐按用户排名。他认为,这容易把采用报告变成对个人的监控,进而促使开发者绕开统计。

评估数据需要团队自己补。原文引用 OpenTelemetry semantic conventions 1.44.0,建议用 span,也就是一次操作的追踪记录,分别描述执行行为和评估结果。示例使用 @opentelemetry/api 的 trace.getTracer("agent-evals") 与 startActiveSpan,设置:

  • gen_ai.operation.name,值为 execute_tool。
  • gen_ai.tool.name,记录工具名称。
  • gen_ai.evaluation.name,示例值为 task_passed。
  • gen_ai.evaluation.score.value,记录评估分数。

作者也明确提醒,评估属性的确切名称要核对所用 semconv 版本。更关键的是,埋点代码不能替你定义「任务通过」:原文没有展开如何生成可靠的 passed 和 score,也没有给出它们与生产效果的验证数据。

下面的 SQL 解决另一个常见问题:先分别聚合,再关联,避免多条使用记录与多条评估记录互相匹配,把次数放大。

WITH usage AS (
  SELECT day, tool_name,
         SUM(interactions) AS interactions,
         BOOL_OR(truncated) AS any_truncated
  FROM tool_usage
  GROUP BY day, tool_name
),
evals AS (
  SELECT day, tool_name,
         COUNT(*) AS evaluated_runs,
         AVG(CASE WHEN passed THEN 1.0 ELSE 0.0 END) AS pass_rate
  FROM tool_evals
  GROUP BY day, tool_name
)
SELECT u.day, u.tool_name, u.interactions, u.any_truncated,
       e.evaluated_runs, e.pass_rate
FROM usage u
LEFT JOIN evals e USING (day, tool_name)
ORDER BY u.day DESC, u.interactions DESC;

要看的是 LEFT JOIN:有使用、没评估的工具也会留下来。evaluated_runs 为 NULL 是一个待处理的发现,不该被展示成零分,更不该默认为成功。

什么情况下该推广,什么情况下该收缩

作者把决策分成四种情况:使用多且结果好,可以扩大推广;使用多但结果差,先修复或限制;使用少但结果好,可以加强推广;使用少且结果差,可以考虑下线。没有评估结果,则暂缓判断。

结合使用量与评估结果决定扩大、修复、推广或下线

这张表成立的前提,是先承认统计有缺口。有些客户端不报告遥测,有些网络会阻断上报。工具看起来少人使用,可能只是它的使用入口更难被统计到。作者因此建议把次数看成观测下限,优先比较同一工具自身的趋势,避免制作团队排行榜。

权限又是另一回事。原文引用 OWASP LLM06,将过度代理能力的来源分为功能过多、权限过大和自主程度过高。统计系统只能记录行为,无法替代这些边界的执行。一个不需要写权限的 MCP server,即使广受欢迎,也不能靠好看的使用曲线证明权限合理。

我的判断

我赞同作者把采用率和质量拆开,尤其是保留「有人用,但没人评估」这一状态。它比直接展示热门工具排名更能帮助平台团队安排工作。

但这仍是一套经验方案。作者提到生产评估和看板建设经历,却没有提供改造前后的对照数据,也没有证明「工具名称+日期」足以支持准确的推广决策。

按天关联,最多说明当天的使用量与被评估运行的表现同时出现,不能证明每次调用都获得了对应效果。如果只评估了一小部分容易通过的任务,整体通过率仍会误导。这个方案比只数调用次数前进了一步,评估覆盖范围却依然需要交代。

对工具较少的团队,也不必立即搭齐 OpenTelemetry 和数据仓库。先保存每日使用数据、整理一组固定任务的评估结果,同样可以验证决策表是否有用。工具链的完整程度,不能代替评估本身的可信度。

能拿来做什么

  • 如果团队已经部署内部 MCP servers,就先定时保存 usage metrics,统一名称,并给达到 25 项的记录标出可能缺失,保留后续追踪趋势的条件。
  • 在 Node 编写的 agent 或工具执行层记录运行结果,先明确哪些任务算通过,再接入 OpenTelemetry;同时核对 semantic conventions 1.44.0 对应的属性定义。
  • 给采用看板同时展示 interactions、evaluated_runs 和 pass_rate,将没有评估的工具单独列出,优先补齐它们的质量证据。
  • 推广 AI 编程工具时,结合使用趋势和评估表现安排试用范围;MCP 的读写权限与自主执行边界,则通过独立机制约束。
Original source

本文由 AI 通读原文后重新编写,观点部分为站内判断,细节以原文为准,来源 dev.to · AI,原文版权归原作者所有。

阅读原文
上一篇
Claude改错后,用回退重建干净上下文
下一篇
通过Paper MCP让Claude直接修改线框图

资讯速览

dev.to · AI · 2026-10-31 02:43

AI 评分 8.0 / 10

相关标签

#Copilot#MCP#效果评估

继续阅读

  • 代理命令拦截不能只检查首个单词
  • Claude改错后,用回退重建干净上下文
  • 通过Paper MCP让Claude直接修改线框图
  • 把重复提示词封装成有验收条件的技能
  • Cursor 市场恶意扩展冒充 Claude Code