用一个业务案例,摸透Code Buddy的Skill原理

0 阅读10分钟

凭借龙虾(OpenClaw)的爆火出圈,让 Skill 概念被大家所熟知,作为一款基于 Skill 理念构建的通用 Agent,OpenClaw 几乎可以说是这一范式最具代表性的实践之一。

但追根溯源,Skill 最早来自 Anthropic 去年推出的 Agent Skills 规范,其核心目标,除了解决通用大模型在垂直场景中“知道但不会做”的问题,更是将能力从提示词中抽离出来,进行结构化封装,并通过“渐进式披露”的机制,让 Agent 能够按需加载和调用,从而在不撑爆上下文窗口的前提下稳定执行复杂任务。

AI Coding 领域工具也纷纷跟进,快速适配了 Agent Skills 这一规范,刚好最近我开发的主力工具就是 Code Buddy,索性就借这个机会做一次深入拆解,看看它是如何落地这套机制的。

案例业务背景+环境准备

笔者基于一个虚构但贴近企业实际的场景--企业职工数据分析,假设企业职工综合分析包企业职工增减员、工资变化、社保三方面,每一方面的分析又都要先获取数据,然后进行加工计算,最后分析后得出结论。

基于上述场景,笔者将每种分析设计为一个独立的Skill,每个Skill都有各自特殊的流程,然后通过Code Buddy来驱动这些Skill的加载与执行,分析Code Buddy实现Agent Skill的流程及原理。

  • Skill 1:企业职工增减员分析技能

name:employee-change-analysis

description:本技能用于分析企业职工数量变化趋势。根据输入的企业信息(纳税人识别号、名称),调用MCP服务获取近3年的职工数量(当年及前两年),进行纵向对比分析,判断企业长期人员变化趋势。

触发词包括:企业职工分析、职工增减分析、员工数量变化、增员减员分析、职工变化趋势、人员流动分析、企业用工分析、职工对比分析、人数变化判断、企业人员趋势。

  • Skill 2:企业职工工资变化分析技能

name:employee-wage-analysis

description:本技能用于分析企业职工工资变化趋势。根据输入的企业信息(纳税人识别号、名称),调用MCP服务获取近3年的职工工资数据(当年及前两年同期),进行同比分析,判断企业是涨薪、稳定还是降薪。触发词包括:企业职工分析、工资分析、工资变化、涨薪降薪分析、薪资对比分析、职工薪资变化、工资趋势分析、企业薪酬分析、薪资水平评估、企业薪酬长期趋势。

  • Skill 3:企业职工社保分析技能

name:employee-social-insurance-analysis

description:本技能用于分析企业职工社保缴纳情况。根据输入的企业信息(纳税人识别号、名称),先调用 MCP 服务获取企业员工某个月的社保数据,再将数据传给【企业职工社保分析】Agent 进行深入分析,最后生成明确的合规性结论。触发词包括:社保分析、企业社保、社保缴纳、社保合规、社保检查、社保缴纳情况、职工社保分析、社保缴纳分析、社保是否正常、社保缴纳状态。

  • Skill 4:企业职工综合分析技能

name:enterprise-fiscal-analysis

description:本技能用于对企业进行全面的职工综合分析,整合人员、社保、工资三个维度的分析结果,生成统一的企业职工情况健康度评估报告。触发词包括:企业财税分析、财税综合分析、企业健康度评估、财税全景分析、企业经营分析、企业用工分析、企业综合分析、财税三维分析、人员社保工资分析、企业用工成本分析、职工全景分析、财税报告。

Coding Agent:Code Buddy IDE/CLI

大模型:Auto(GLM/Kimi/MinMax/DeepSeek)

MCP服务:三个本地服务(获取职工数量、获取职工工资、获取职工社保),模拟远程接口调用。

{
  "mcpServers": {
    "get_employee_count": {
      "url": "http://127.0.0.1:8002"
    },
    "get_employee_wage": {
      "url": "http://127.0.0.1:8003"
    },
    "get_employee_social_insurance": {
      "url": "http://127.0.0.1:8004"
    }
  }
}

SubAgent:企业职工社保分析,简单的描述了下需要分析企业的社保缴纳情况。

案例Skill形态+验证范围说明

以 Skill2(企业职工工资变化分析技能)为例,该技能结构:

SKILL.md一共包含了这些内容:

核心的工作流程:

接下来笔者基于上述Skill的设计,组合几种场景来分别验证下在Code Buddy中,Skill的匹配逻辑、Skill如何触发调用MCP服务、如何触发调用SubAgent、如何触发调用其他Skill以及Skill中脚本调用的安全性。

验证1 - Skill匹配逻辑

提问:“帮我进行企业职工分析”

结果:大家应该都知道Agent是通过Skill的description去进行匹配的,笔者特意在Skill1(企业职工增减员分析技能)和Skill2(企业职工工资变化分析技能)中都加上了触发词【企业职工分析】,但Code Buddy只匹配到了Skill1,Skill2并没有匹配到。

提问:“帮我进行企业职工数量、职工工资分析”

结果:Skill1和Skill2都被匹配到。

Code Buddy官方文档中描述的AI选择Skill的逻辑是这样的,但当技能的触发词重叠时,还是需要通过更精准的提示词来触发到自己想要的Skill。

验证2 - Skill中如何触发调用MCP服务

提问:“帮我进行企业职工人员分析 企业名称:keyu科技有限公司,纳税人识别号:91310000710XXXXXP”

结果:Code Buddy匹配到Skill1(企业职工增减员分析技能),并根据Skill的描述逻辑,调用MCP服务获取职工近3年的数量,然后进行分析形成报告。

所以在Code Buddy中,Skill可以触发调用MCP服务,只需在Skill.md中加入MCP调用的描述信息,Agent就能匹配到并进行调用,例如Skill1中的描述:

验证3 - Skill中如何触发调用SubAgent

提问:“帮我进行企业职工社保分析 企业名称:keyu科技有限公司,纳税人识别号:91310000710XXXXXP”

结果:Code Buddy匹配到Skill3(企业职工社保分析技能),并根据逻辑先调用MCP服务获取数据,再调用SubAgent(企业职工社保分析),最后形成结论信息。

所以在Code Buddy中,Skill可以触发调用SubAgent。

Skill3中Agent调用的描述是AI帮忙写的,这里写的是Python的task函数,感觉确有其事,但其实在官网中并没有这个函数的任何说明😅,官方只有以下的说明,所以笔者认为Code Buddy还是通过中文描述匹配到SubAgent,然后在Coding Agent内部发起了SubAgent的调用,但具体怎么调用的,用户不得而知。

验证4 - Skill中如何触发调用Skill

提问:“帮我进行企业综合分析 企业名称:keyu科技有限公司,纳税人识别号:91310000710XXXXXP”

结果:Code Buddy匹配到Skill4(企业财税综合分析技能),然后根据业务逻辑调用另外3个技能(Skill1、Skill2、Skill3)进行分析,这里3个技能的MCP服务是并行调用的,最后分别进行分析后形成了一份汇总的结论。

所以在Code Buddy中,Skill中可以触发调用其他Skill。

同理SubAgent的调用,虽然AI在调用说明中写的是use_skill的调用方式,但其实官方文档中根本查不到,所以笔者认为skill中触发调用其他skill的逻辑还是通过AI的理解来让Coding Agent发起的。

验证5 - Skill中执行脚本的安全性

前置说明:因为Code Buddy IDE没有看到安全相关的配置,但在Code Buddy CLI下看到有安全相关的说明,于是场景5是通过Code Buddy Code跑的,根据官方说明~/.bashrc文件是不可改的。

笔者就基于这点进行验证,在Skill1中加入了一段验证沙箱的脚本。

  • 未开启沙箱环境执行

提问:“帮我进行企业职工人员分析,注意使用到技能中的脚本进行计算分析,企业名称:keyu科技有限公司,纳税人识别号:91310000710XXXXXP”

结果:在执行日志中看到 ~/.bashrc 可写,并且模型提示是否还要继续执行。

  • 开启沙箱环境再次执行

提问:“帮我进行企业综合分析 企业名称:keyu科技有限公司,纳税人识别号:91310000710XXXXXP”

结果:在执行日志中看到 ~/.bashrc 不可写,沙箱环境验证通过,继续执行后续的业务逻辑。

Code Buddy中Bash沙箱是通过 sandbox-runtime 的开源项目实现的,项目地址:https://github.com/anthropic-experimental/sandbox-runtime,沙箱运行时可作为开源 npm 包用于你自己的智能体项目。当然关于Code Buddy安全方面的设计内容还是比较多的,在这就不再多展开,感兴趣的可以去翻下官方文档。

Code Buddy中Skill的实现原理猜想

经过前面多个场景的验证,再结合任务执行时的日志,笔者对Code Buddy 中 Skill 的实现逻辑有了大概的猜想,这里画了张执行流程图,稍微有点复杂,可以看着流程说明理解下。

用户输入 Prompt 后,Agent 首先调用 LLM 进行推理,LLM 输出包含 skill 名称和参数的 tool_call;随后 Tool Router 接收该调用并查询 Skill Registry,若发现对应 Skill 未加载,则立即调用 Skill Loader 动态加载。

接着进入 Skill 执行阶段(ReAct Loop),LLM 根据 Skill 中的工作流说明进行任务规划,拆解步骤并明确每一步要调用的工具或子能力,形成执行计划。

对于需要调用工具和子能力的任务,Router 将分发到对应的执行器(本地函数执行、MCP 远程调用或子 Agent 调用);每一步的执行结果都会回传给 LLM,由 LLM 思考并决定下一步执行的任务。

上述循环重复进行,直到当前 Skill 的工作流全部执行完成。

Skill 执行完毕后返回结果,并将结果回传给 LLM;LLM 根据结果决定是继续调用下一个 Skill(进入下一轮循环),还是输出最终结果。

因为Code Buddy是闭源的,上述流程如有不对之处,强烈欢迎Code Buddy的开发者来批评指正!!🫡


本系列说明:在本系列中,我们将通过实践不同 AI Agent(如 Code Buddy、OpenClaw、OpenCode、Hermes Agent 等)中 Skill 的实现机制,并结合具体实战案例的完整过程,深入剖析 Skill 的底层原理。

—End—

本文作者:keyu17

本文原载:公众号“木昆子记录AI”