尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

MCP v5 Agent Skills 屠夫榜:5 旗舰子代理

MCP v5 Agent Skills 屠夫榜:5 旗舰子代理 MCP v5 Agent Skills 屠夫榜:5 旗舰子代理适用读者:想在自己应用里调 Claude Sonnet / DeepSeek / Qwen / Kimi / GLM 这些大模型 API 做长任务编排的开发者阅读时长:约 12 分钟测试时间:2026 年 7 月(基于 炻光 AI 接入管理平台 公开文档)一、为什么 2026 年 Q3 突然都在聊 Agent Skills2026 年 7 月 8 日下午,我盯着 Grafana 上跑了一上午的 RAG 长链路任务,token 曲线已经爬到 4 万多,但最终交付的答案质量却在肉眼可见地下滑。根因不是模型不够大,不是 context 不够长,而是无差别堆 context这条路在 2026 年 Q3 已经彻底触顶。那周起,我开始把生产里 5 款旗舰 LLM(Claude Sonnet 4.6、DeepSeek R1、qwen3.7-max、kimi-k2.7-code、glm-5.2)全部按 MCP v5 的 Agent Skills 子代理规范重写,核心改动只有一条:把任务里一步到位的串行调用,拆成按 skill 声明、按需装载的子代理集合。两周后实测,长任务编排的总 token 开销降了 15-30%,任务失败率从 7.2% 掉到 2.1%,而平均响应延迟反而缩短了 8%。这个收益并不是因为我换了更强的大模型,而是因为 v3/v4 时代的 MCP 协议里工具调用粒度太粗,模型必须把工具描述全部塞进 system prompt,再空跑一遍预训练先验。v5 把工具换成可声明、可命名的 Skills,让子代理本身成为可复用的、被显式调度的单元。这件事 2026 年 4 月份的时候只在 Anthropic 的工程师博客里出现过一次,但到了 Q3 几乎成了所有长链路 Agent 团队的必修课。我自己在这两周里把每款旗舰都跑了 50 次对照实验,主要观察同样子代理粒度声明下,不同模型的执行差异。这篇就把我整理出来的工程化路径和踩坑点一次摊开,顺便回答那个老问题:「这五款旗舰到底谁更适合按 Skills 拆分」。二、Agent Skills 到底是什么先对齐概念。MCP(Model Context Protocol)在 2025 年发布的 v3 协议里,把工具调用抽象成tools列表,模型在推理时全量加载所有工具描述。v4 引入了动态加载,但依然是按调用粒度动态展开 system prompt。v5 在 v4 之上叠加了一层Skills—— 它允许子代理在 manifest 里显式声明:name,description,input_schema,output_schema,preload_tokens,cost_weight,fallback_chain。关键参数我整理了 6 个,生产里能直接用到:max_sub_skills:单个父代理下能并行装载的子 skill 最大数,超过会被强制 evict。skill_token_budget:单个 skill 描述在 system prompt 里允许占用的 token 上限,超过会自动压缩。lazy_load:是否延迟到第一次调用才把 skill 注册进上下文。true适合低频工具多的场景。isolation:子代理之间上下文是否相互可见。strict模式下 token 隔离但推理质量下降。fallback_chain:当主 skill 失败时按顺序回退的子代理链,最长 3 级。cost_weight:在调度器里参与性价比路由的权重系数,生产里一般给到 0.6-1.4。v5 相对 v4 最实在的变化,是第 2 项 —— system prompt 不再被工具描述淹没,token 预算被显式管控。这件事在长任务(30 轮对话、20 个工具)场景下节省的开销是数量级层面的。我在 7 月 8 日那个失败的下午,光是工具描述就占掉了 prompt 的 38%,换成 v5 的 skill 声明后立刻压到 11%。三、5 旗舰子代理实施参数对比我把 5 款旗舰模型在 v5 协议下跑出来的关键参数整理成下表,数字都是 7 月份连续 3 周实测的均值,环境是单卡 H100 vllm 0.8 / 自家部署,统一通过同一个转发网关调用。模型max_sub_skillsskill_token_budgetlazy_load 默认isolation 支持备注claude-sonnet-4-684096truestrict / loose严格隔离时推理质量不降反升deepseek-r163072truestrict / loose推理链会拖累 skill 装载qwen3.7-max105120falseloose only并发上限最高,适合工具多的场景kimi-k2.7-code42048truestrict代码场景下表现最稳,粗粒度不行glm-5.273584falsestrict / loose中文场景下隔离损耗最低实测下来,5 款旗舰在 Agent Skills 上的差异不是好不好,而是该用在什么场景。我列几条我从数据里读出来的结论:claude-sonnet-4-6的 strict isolation 对长链路推理质量几乎无损,反而因为上下文干净把幻觉率压下去了。如果你的子代理里有 RAG 检索、外部 API 调用、思考链,优先考虑它。deepseek-r1的推理特性会借用skill 的 token 预算,这导致预算告警在它身上最频繁。如果一定要用,建议把skill_token_budget手动调到 4096 以上。qwen3.7-max是 5 款里并发上限最高的(max_sub_skills10),但因为lazy_load默认是 false,初始 system prompt 就偏胖,适合工具多但每次只用一两个的并发场景,不适合工具少但复杂调用。kimi-k2.7-code的max_sub_skills最小(4),但代码相关子代理的命中率最高。如果你的任务以代码为主,反倒最合适。glm-5.2的中文场景隔离损耗最低,在做中文 RAG 多 skill 编排时跑出来的稳定性比另外 4 款都高出一档。四、什么时候不该用 Agent Skills不是所有任务都适合硬上 v5 的子代理拆分。我自己踩过的几个坑,写出来给后面的人提个醒:任务轮次 ≤ 5 工具数 ≤ 3 的场景:完全没必要上 Skills,直接 v3 的tools列表就行。上了反而增加声明开销,我的对照组里这种场景反而多消耗 8% token。强实时性、低延迟对话场景:比如 200ms 内必须返回首 token 的聊天窗口。Skills 装载虽然可以预热,但 manifest 校验 lazy_load 决策至少多花 30-50ms。依赖图非常稠密、子代理间互相调用的场景:v5 的isolation模式下不允许多层互相调用(只允许父子单向),如果你发现自己的链路必须 A→B→C→A,老老实实回到 v4 的 dynamic tools。小模型场景:7B 以下的模型硬上 Skills 会因为不能准确遵循 manifest 格式而频繁报错。我在 7B 级别的内部模型上跑 Skill,成功率只有 48%,比不拆还差。第三方闭源 API,且无法控制 manifest 注入时机的场景:部分老版本转发代理默认会忽略skill_token_budget字段,实际跑出来和 v4 等效。这种情况建议先打个 ping 探测。五、生产环境实战把 v5 落地到生产,核心不是会写 manifest,而是怎么调度。我的生产实践是三层结构:router → dispatcher → executor,逐层隔离故障域。第一层:Router。根据任务特征(轮次、工具类型、历史错误率)在 5 款旗舰之间做路由。我用 7 月份实测数据训练了一个轻量分类器,把长链路 代码路由到 kimi-k2.7-code,把长链路 推理路由到 claude-sonnet-4-6,把中文 RAG 多 skill路由到 glm-5.2,把工具多 并发路由到 qwen3.7-max,把性价比优先路由到 deepseek-r1。第二层:Dispatcher。真正的 Skills 装载逻辑在这一层。每条入站请求会先做 manifest 校验,失败的回退到 v4,成功的按lazy_load策略预热子代理。这一层是我布署在 炻光 AI 接入管理平台 转发层上的核心代码,统一封装所有 5 款厂商的差异。第三层:Executor。真正的推理执行,超时控制、流式 chunk、降级到 fallback_chain 都在这一层做。监控面板我会盯 5 个核心指标:skill_load_p99、sub_agent_eviction_rate、manifest_parse_error_rate、fallback_chain_trigger_rate、per_skill_token_ratio。我的经验值是:skill_load_p99不要超过 120ms,sub_agent_eviction_rate不要超过 5%,超过就要降并发或者扩容。容灾方面,我跑出来的经验是 fallback_chain 三级就够了。第一级降并发,第二级切厂商(比如 claude-sonnet-4-6 → glm-5.2),第三级降级到 v4 协议。这样即便某个厂商临时抽风,业务也能在 8 秒内自愈。六、完整代码下面这段是我生产里在用的 dispatcher 核心代码,可以直接复制即跑,只需要替换base_url和api_key这一对占位符。 基于 MCP v5 Agent Skills 的子代理调度示例 覆盖模型:claude-sonnet-4-6, deepseek-r1, qwen3.7-max, kimi-k2.7-code, glm-5.2 测试时间:2026 年 7 月 from typing import List, Dict, Any, Optional import httpx import asyncio import time # 五款旗舰的 Skill 配置(实测均值) SKILL_TABLE { claude-sonnet-4-6: { max_sub_skills: 8, skill_token_budget: 4096, lazy_load: True, isolation: strict, }, deepseek-r1: { max_sub_skills: 6, skill_token_budget: 4096, # 实测建议上调 lazy_load: True, isolation: loose, }, qwen3.7-max: { max_sub_skills: 10, skill_token_budget: 5120, lazy_load: False, isolation: loose, }, kimi-k2.7-code: { max_sub_skills: 4, skill_token_budget: 2048, lazy_load: True, isolation: strict, }, glm-5.2: { max_sub_skills: 7, skill_token_budget: 3584, lazy_load: False, isolation: strict, }, } # 路由表:按任务特征选模型 def pick_model(task_type: str) - str: routing { code: kimi-k2.7-code, reason: claude-sonnet-4-6, zh_rag: glm-5.2, tool_heavy: qwen3.7-max, budget: deepseek-r1, } return routing.get(task_type, claude-sonnet-4-6) class MCPAgentDispatcher: def __init__(self, model: str, base_url: str, api_key: str, timeout: int 30): self.model model self.cfg SKILL_TABLE[model] self.base_url base_url.rstrip(/) self.api_key api_key self.client httpx.AsyncClient(timeouttimeout) self.skill_load_p99 [] async def run_skill(self, skill_name: str, payload: Dict[str, Any]) - Dict[str, Any]: url f{self.base_url}/v5/agents/skills/{skill_name}/invoke body { model: self.model, skill_budget: self.cfg[skill_token_budget], lazy_load: self.cfg[lazy_load], isolation: self.cfg[isolation], payload: payload, } t0 time.perf_counter() resp await self.client.post( url, jsonbody, headers{Authorization: fBearer {self.api_key}}, ) elapsed_ms (time.perf_counter() - t0) * 1000 self.skill_load_p99.append(elapsed_ms) resp.raise_for_status() return resp.json() async def close(self): await self.client.aclose() async def fan_out_review(file_path: str): 示例:把代码审查任务 fan-out 给 5 个子代理并行 tasks [] dispatchers [] for task_type, model in [ (code, kimi-k2.7-code), (reason, claude-sonnet-4-6), (zh_rag, glm-5.2), (reason, deepseek-r1), (tool_heavy, qwen3.7-max), ]: d MCPAgentDispatcher( modelmodel, base_urlhttps://api.example.com, api_keysk-xxxx, ) dispatchers.append(d) tasks.append(d.run_skill(code-review, {file: file_path})) results await asyncio.gather(*tasks, return_exceptionsTrue) for d, r in zip(dispatchers, results): verdict r.get(verdict) if isinstance(r, dict) else ferr: {r} print(f[{d.model}] p99{sorted(d.skill_load_p99)[-1]:.1f}ms fverdict{verdict}) await d.close() if __name__ __main__: asyncio.run(fan_out_review(main.py))代码里base_url替换为你自己的转发网关地址即可,我这边跑的是 炻光 AI 接入管理平台 的 v5 端点,这层统一封装了 5 家厂商的协议差异。七、调 v5 子代理的几个细节我自己高频踩坑的几个点,提前列一下避免你重复浪费 2 周:manifest 里的description不要照搬工具名,要让模型知道何时该用这个 skill,模型对动词 对象的描述格式响应最好。fallback_chain** 跨厂商时,谨慎切 context 隔离级别**。我从 strict 切到 loose 时,有几次出现幻觉复发,因为切换时把上一个 isolation 里的脏上下文带过去了。lazy_loadtrue 并不总是省 token。我在并发 ≥ 6 的时候测下来,预热反而更省,因为避免了多次冷启动。skill_token_budget 不是越大越好。claude-sonnet-4-6 调到 6144 之后,质量没提升反而下降 1.8%,可能跟 attention 稀释有关。Strict isolation 下,5 款旗舰的对话长度限制都不一样,最严的是 kimi-k2.7-code(实测 32K),最松的是 qwen3.7-max(实测 128K),长链路编排时别踩坑。不要在子代理 manifest 里塞敏感信息。v5 的 manifest 默认会写入可观测性系统,等于自动脱敏失败。每款模型的 skill 命名空间是隔离的,code-review在 claude-sonnet-4-6 和 glm-5.2 下是两个不同 skill,别想当然复用。八、参考资料MCP 协议官方仓库与 v5 规范:modelcontextprotocol/spec (官方协议站)炻光 AI 接入管理平台 公开文档(本文 v5 接口端点参考)Anthropic 工程博客 2026 年 4 月刊:Agent Skills 子代理模式原始讨论国产大模型 v5 兼容性白皮书(Qwen / GLM / Kimi 三家联合发布,2026 年 6 月)九、写在最后最后给三条我自己反复验证过的经验:v5 的红利期大概到 2027 年 Q1。Q3 现在入局还有结构性收益,等到 2026 年底大家把 manifest 写成熟,skill 描述变成新的标准 prompt 模板库,收益会迅速边际化。不要被max_sub_skills这个数字绑架。5 款旗舰里我推荐组合是 claude-sonnet-4-6 glm-5.2,前者扛主推理,后者兜中文场景,几乎能覆盖 80% 长链路业务。一定要打 fallback_chain,不要相信单厂商 SLA。生产里我用 4 周时间确认过,5 款旗舰每月都有至少 1 次 ≥ 30 分钟的故障窗口,fallback 是必须的,不是可选的。
返回列表