CodexQA

行业与实践研究与基准测试

成功率有两套算法:华为云把 Skill 观测拆成加载和释放

CodexQA 团队阅读约 6 分钟

华为云 AgentArts 把 Skill 拆成加载和释放,不单建 Skill Span。四条指标里,成功率同时写成 call.count 减 error.count,以及 status 为 True 的次数除以总次数。指标 60 秒上报一次,Prometheus 的 increase() 会把次数显示成小数。

本文目录

成功率有两套算法:华为云把 Skill 观测拆成加载和释放

这篇是华为云帮助中心「智果(AgentArts)智能体平台」最佳实践《Skill(技能)观测数据上报》,页面更新时间是 2026 年 9 月 29 日。页脚有版权声明,没有另写禁止引用的句子。下面按页面顺序整理做法、口径和它自己写明的限制,不补线上拦截率。

Skill(技能)嵌在智能体调用链里面。文档举的线上问题有三类:某个 Skill 加载变慢,拖累整次响应;Skill 经常失败,但没有告警;Skill 正文太长,注入模型后 Token 成本往上走。没有专项观测时,这三件事都藏在链路内部。

上报分两路,都走 OpenTelemetry 的 OTLP、gRPC。Trace(调用链)进华为云 APM,看单次请求经过哪些节点。Metric(指标)进华为云 AOM,看次数、耗时和成功率。Trace 用 BatchSpanProcessor 批量发送。Metric 用 PeriodicExportingMetricReader。示例里 OTLP 指标导出间隔是 60000 毫秒,本地控制台导出间隔是 15000 毫秒,本地文件叫 otel_debug.log,用来在看板出数之前确认采集是否正常。APM 和 AOM 按使用量计费,并有免费额度。页面没有写免费额度的具体数字,部署前要另看计费说明。

不单独建 Skill Span

文档把一次 Skill 生命周期分成两段:加载 skill_tool,释放 skill_complete。两段都当成工具调用。原理段写的是:不要再单开一种 Skill Span,把属性和事件挂在对应的工具执行 Span 上,避免链路变长。

一条带 Skill 的链,文档画成四段。根 Span 叫 agent_dialogue_session。然后是模型 Span llm_decision_call,由模型决定要不要调用 Skill。接着工具 Span skill_tool,操作名 load_skill,带 gen_ai.skill.name、gen_ai.skill.id,加载成功再打事件 skill.loaded,事件里记路径。然后工具 Span skill_complete,操作名 release_skill,结束时打事件 skill.released。最后是模型 Span llm_final_answer,这次调用已经带上 Skill 内容。

示例脚本和这段原理并不一致。脚本里 skill_tool 和 skill_complete 的 gen_ai.span.type 都写成 model,不是工具。释放阶段的技能标识用 skill_ 加上技能名哈希的绝对值再对 10 的 8 次方取余。页面没有解释为什么原理图和示例脚本的 span 类型不同,这里两处都照录,不把它们收成一种。

四条 Skill 指标,成功率写了两种

表 2 的四条都挂在技能名上。

gen_ai.skill.call.count 是 Counter。在 skill_tool 这段 Span 结束时加 1。成功和失败都算。它是次数和成功率的底数。

gen_ai.skill.duration 是 Histogram,单位秒。在 skill_complete 结束时记录。计时从加载开始,到释放完成,不是只算其中一段。平台用它算平均耗时,以及耗时 Top5。

gen_ai.skill.error.count 是 Counter。只在执行结果含错误时加 1。表 2 写:成功次数用 call.count 减 error.count,再得到成功率。

gen_ai.skill.token.usage 是 Counter。在 Skill 内容加载完成、最终那次大模型调用之前上报。它统计的是 SKILL.md 正文注入模型时的 Token 估算,不是整段对话的 Token。示例用正文的 UTF-8 字节数除以 4,至少记 1。有正文就用正文,没有就用失败说明文本。这是估算,不是模型返回的 usage。

维度缺了,看板会空。表 3 写明:

gen_ai.resource.id 是智能体 ID,四条指标都必填。缺了,这条指标归不到任何智能体。

gen_ai.skill.name 必填。去重、调用次数排行、耗时排行、成功率排行都靠它。缺了,排行榜没有数据。

domain.id 是账号 ID,必填,用来做租户隔离。填错或缺失,查询时被滤掉,看板什么都没有。

gen_ai.call.status 取值 True 或 False。call.count、duration、error.count 必填。这里的成功率写成:status 为 True 的 call.count,除以总 call.count。duration 带上这个字段之后,还可以把成功和失败的耗时分开看。缺了,成功率看板没有数。

gen_ai.request.model 只对 token.usage 必填,用来按模型比较同一个 Skill 的 Token。其他指标可以带,不强制。

两套成功率要分开读。表 2 是 call.count 减 error.count。属性说明是「status 为 True 的次数 / 总次数」。页面没有证明这两套在示例脚本里永远相等。脚本只在 call_status 为假时给 error.count 加 1,同时又把 call.status 放进同一次属性里。若以后有人只加错误计数、不改 status,两套就会分开。不能把其中一套说成另一套的化简。

示例还登记了应用级和大模型级指标,不是 Skill 专有:gen_ai.usage.status(UpDownCounter,记用户和会话是否活跃)、requests_total、client.operation.duration(端到端秒数)、gen_ai.total.requests、gen_ai.usage.input_tokens、gen_ai.usage.output_tokens。会话或调用链上的 Token 列如果显示 0,文档说是因为平台读的是根 Span。只写在模型 Span 上不够。示例在根 Span 关闭前,把这次请求里所有模型 Span 的输入、输出和总 Token 加总再写入。决策一次、最终回答一次,根上的数是两次之和。模型不调用工具、直接回答时,只有一次模型调用,根上就写这一次。

接入时类型被写成「单智能体」

控制台路径是「观测与优化 > 观测 > 智能体列表 > 智能体接入」。名称自定,类型选择「单智能体」。下一步的接入指南给出 agent_id、trace_endpoint、trace_token,以及 metric_endpoint、metric_token、project_id、promID。账号 ID domain_id 和 IAM 用户 ID user_id 在「我的凭证 > API凭证」,不在这段接入指南里。

示例 Skill 叫 skill-creator,目录里要有 SKILL.md。脚本先检查文件在不在,再把内容注入最终的模型调用。文件不存在,就走不到 Skill 路径,也就没有 Skill 的 Trace 和 Metric。页面给的 SKILL.md 是一个「写出新 Skill 文本」的说明,并写明直接在回复里输出,不要执行命令或写文件。这是演示对象,不是一份评测集。

依赖版本写死为:Python 建议 3.9 以上;opentelemetry-api、opentelemetry-sdk、opentelemetry-exporter-otlp 都是 1.41.1;openai 1.14.0;python-dotenv 1.0.0。模型示例是 deepseek-v4-flash,地址 https://api.modelarts-maas.com/openai/v1,密钥到 MaaS 申请。Trace 的服务名是 AgentArts.{agent_id}.default。Metric 的令牌如果已经带 Bearer 前缀,脚本会先去掉再补上一次,避免变成 Bearer Bearer。OTLP 的 insecure 在示例里设为 true。Trace 和 Metric 的地址要求是纯域名,不带 https://。

运行是 python skill.py,然后多轮对话。演示用的 skill-creator 是技能生成器,对话里要明确说需要创建或使用 Skill,否则模型可能直接回答,控制台只有大模型指标。指标每 60 秒批量上报一次。页面要求对话 3 分钟以上再打开看板。退出时要 shutdown Trace 和 Metric 的 Provider,把还没发出的批次刷出去。看板在「观测与优化 > 观测 > 智能体列表」里点智能体名称。页面有调用链和 Skill 数据的示意图,没有给出任何一次运行的成功率、耗时或 Token 数字。

看板会骗人的几种空和小数

常见问题一节把失败原因写死了,不能改成别的解释。

鉴权失败 UNAUTHENTICATED:查 METRIC_TOKEN;Bearer 不要手写;projectID、promID 的大小写要和接入指南一致。

看板有别的数、没有 Skill 指标:三个维度 gen_ai.resource.id、gen_ai.skill.name、domain.id 必须在;并且等过 60 秒的批次,对话要超过 3 分钟。

只有大模型指标:模型不是每次都调用工具。提问里要明确要求创建或使用 Skill。

属性类型报错,Invalid type NoneType:.env 里缺项,常见是 AGENT_NAME,读出来是 None。

UNAVAILABLE:端点格式不对,多半是带了 https://。

Token 列是 0:根 Span 上没有三件套 gen_ai.usage.input_tokens、output_tokens、total_tokens。

Skill 调用次数变成小数:AOM 用 Prometheus 的 increase() 算 Counter 在时间窗里的增量。窗口边界和上报时间对不齐时,首尾会做线性插值,外推出小数。累计次数本身仍是整数。要看整数,把查询窗口对齐成 60 秒的整数倍,和上报周期一致。

domain.id 或 user.id 用了假值:查询按当前登录账号的真实 domain.id 过滤。对不上就整板为空。必须用凭证页上的真实 ID。

这些不能被读成什么

页面没有 Skill 成功率、耗时或 Token 的实测结果,不能从字段名推出一个分数。成功率的两种写法都留着,不合并。示例把加载和释放的 span 类型标成 model,和原理段的「工具执行 Span」不一致。Token 是字节数除以 4 的估算,不是接口返回的 usage,也不能当成计费账单。接入类型只写了单智能体。演示 Skill 不是评测集,没有参考答案,也没有回归门禁。计费只说到按量并有免费额度。没有业务拦截率,没有第三方复测。

出处:华为云,智果(AgentArts)智能体平台帮助中心,Skill(技能)观测数据上报,2026-09-29,https://support.huaweicloud.com/bestpractice-agentarts/agentarts_06_0037.html

觉得有用,转给同事

微信扫码

用微信扫一扫,在手机上打开后即可转发。

用 RSS 订阅

提交勘误