用 TinyAgent 从零实现 Skill 机制
作者:程序员马丁
Ragent AI —— 从 0 到 1 纯手工打造企业级 Agentic RAG,拒绝 Demo 玩具!AI 时代,助你拿个offer。
上一篇梳理了 Skill 的通用规范和行业框架实现——SKILL.md 是什么格式、渐进式披露怎么工作、Spring AI 和 LangChain4j 分别怎么做。这一篇把概念落地:用 TinyAgent 从零实现 activate_skill 模式,包括 SKILL.md 解析、技能专属工具隔离、DynamicToolProvider 动态注入,以及完整的 Demo 演示。
TinyAgent 对齐了行业主流的执行模式——LLM 调用 activate_skill(name) 加载技能指令到主上下文,同时解锁技能专属工具,然后在主循环中按指令调用业务工具。整个过程只有一个 LLM、一个对话上下文,没有子 Agent。
本项目中具体代码已上传 GitHub TinyAgent,大家 Clone 项目后,将代码分支切换到 1.11.x,默认主分支是最新代码。运行前复制
.env.example为.env,把自己的 API Key 填进去,默认阿里云百炼平台;.env已加入.gitignore,切分支时不会丢。
TinyAgent 怎么用 Skill
TinyAgent 对齐了行业主流的 activate_skill 模式——LLM 调用 activate_skill(name) 加载技能指令到主上下文,同时解锁技能专属工具,然后在主循环中按指令调用业务工具。在标准格式之上,TinyAgent 只新增了一个 tools 字段,做了一处简化。
1. 为什么需要 tools 字段
上一篇讲到 LangChain4j 有技能作用域工具(Skill-Scoped Tools)——绑定在 Skill 上的工具,激活前对 LLM 不可见,激活后才动态暴露。TinyAgent 也实现了这个机制,原因是:如果所有工具都可见,LLM 会跳过 activate_skill 直接调用业务工具,技能指令永远不会进入上下文。
打个比方,如果 LLM 从一开始就能看到 applyRefund,用户要求退掉订单 88231 时,LLM 很可能直接调 applyRefund——毕竟功能名称和描述就摆在眼前,何必多走一步激活技能?但这样一来,先查订单 → 验证状态 → 再退款的标准流程就被跳过了,技能指令永远不会被读取。
这就是鸡生蛋问题:LLM 不会调 activate_skill,因为它已经看到了想要的工具;技能指令不进上下文,因为 LLM 没调 activate_skill。

解决方案很直接——在 Skill 定义中声明专属工具,启动时从 LLM 可见列表中排除,激活后才动态注入:
queryOrder、applyRefund