微信扫码
添加专属顾问
我要投稿
AgentScope 最新发布的 Skills 支持功能,解决了多能力 Agent 在有限上下文中的高效管理难题,让 AI 像经验丰富的客服一样灵活调用知识。核心内容:1. 现有三种上下文加载方案的局限性分析2. Skill 机制如何实现渐进式知识披露3. 类比电商客服场景的生动说明
背景:多能力 Agent 的挑战
在大语言模型驱动的 Agent 系统中,存在一个核心矛盾:我们希望 Agent 拥有尽可能多的能力,但在任何时刻它只会用到其中一小部分, 同时 Agent 的上下文空间是有限的。
以一个客服系统为例:我们希望它能同时处理订单查询、退款申请、产品推荐、技术支持等多个领域的问题,但在任何一次对话中,用户通常只会涉及其中一两个领域。但是又要支持Agent同时具有这些能力如何在有限的上下文中高效管理这些能力?
三种常见上下文加载方案
方案 1:全量加载
方案 2:多 Agent 架构
方案 3:RAG(检索增强生成)
问题的本质
这三种方案的困境本质上源于同一个问题:缺乏灵活的上下文加载机制。它们在三个维度上都存在不足:
用一个类比来说明:想象你是一位电商平台的全能客服,需要处理订单、退款、技术故障、投诉等各类问题。
我们需要的是:让 Agent 像一个经验丰富的客服一样,脑子里有个清晰的"目录"——平时只记住"退款问题看《退款处理手册》、技术问题看《故障排查指南》"(元数据),遇到退款咨询时快速调出完整的退款流程和话术(按需加载),碰到罕见的特殊情况再去查阅详细的政策文档(资源按需)。这就是 Skill 机制要解决的问题:让 Agent 知道有哪些知识,需要时才调用,调用时保持完整。
Skill 机制:渐进式披露
核心思想:让 Agent 先知道"有什么能力",需要时再学习"如何使用",而不是一开始就把所有知识装进上下文。
核心定义
Skill(技能) 是一个独立的、可复用的知识和能力单元,包含三个核心组成部分:
渐进式披露(Progressive Disclosure) 是一种上下文管理策略,将知识加载分为三个层次:
Skill 的结构规范
Skill 以文件系统的目录结构组织,核心是 SKILL.md 文件:
skill-name/├── SKILL.md # 必需:包含元数据和指令├── references/ # 可选:详细参考文档│ └── api-doc.md├── scripts/ # 可选:可执行脚本│ └── process.py└── assets/ # 可选:模板和资源└── template.html
SKILL.md 的最小结构:
---name: skill-namedescription: 何时使用此 Skill 的描述---# Skill 指令内容...
渐进式披露的工作机制
以订单处理场景为例,说明三层加载的过程:
第 1 层:元数据加载(启动时)
Agent 启动时,上下文中仅包含所有 Skill 的元数据:
# 上下文占用:~100 tokens/Skillskills:- name: order_processingdescription: 处理订单查询、修改、取消操作- name: payment_processingdescription: 处理支付、退款操作- name: product_recommendationdescription: 产品推荐和库存查询# ... 共 10 个 Skill
上下文成本:10 个 Skill × 100 tokens = 1k tokens
此时 Agent 知道"有哪些能力可用",但不知道"如何执行这些能力"。这种设计支持注册任意数量的 Skill,因为每个 Skill 只占用约 100 tokens 的元数据空间。
第 2 层:指令加载(触发时)
当用户询问"订单 123456 什么时候到?",Agent 识别需要 order_processing Skill,加载其完整指令:
# 新增上下文:~2k tokens## 订单处理标准流程### 查询订单1. 调用 queryOrder(orderId) 获取订单详情2. 判断订单状态:- 待支付 → 提供支付链接- 已发货 → 返回物流信息- 已完成 → 询问是否需要售后### 修改地址前置条件:订单状态为「待发货」步骤:1. 验证订单状态2....### 可用资源- references/error-codes.md:错误码对照表- scripts/validate.py:订单号校验脚本
上下文成本:1k(元数据)+ 2k(指令)= 3k tokens
加载的是完整的 SOP 文档,保持了逻辑连贯性,不会像 RAG 那样出现碎片化。同时只加载当前任务相关的 Skill,相比全量加载节省 85% 的上下文空间(3k vs 20k)。
第 3 层:资源加载(按需时)
执行过程中遇到错误码 E1001,Agent 加载错误码说明:
# 新增上下文:~1k tokens## 错误码对照表- E1001: 订单不存在,请检查订单号- E1002: 订单状态不允许修改- E1003: 地址格式不正确...
或执行脚本(不占用上下文):
Agent 调用 scripts/validate.py脚本执行,仅返回结果result = validate_order_id("123456")返回: {"valid": true, "order_type": "standard"}
上下文成本:
资源文件按需加载,避免预先加载所有参考文档。脚本执行提供确定性操作,不依赖 LLM 生成代码,且执行结果不占用上下文空间。理论上可以支持无限数量的资源文件(通过文件系统存储)。
AgentScope-Java 中的 Skill 机制实现
详细文档: https://java.agentscope.io/zh/task/agent-skill.html
存储层抽象:解耦 Skill 与文件系统
原生 Skill 机制基于文件系统,Agent 通过文件系统 Tool 直接访问磁盘文件,难以在云端、容器等环境中灵活部署。
我们将 Skill 进行了进一步的抽象,使其的发现和内容加载不再依赖于文件系统, 只是将文件系统作为一个而是 LLM 通过 Tool 来发现和加载 Skill 的内容和资源。同时为了兼容已有的 Skill 生态与资源,Skill 的组织形式依旧按照文件系统的结构来组织它的内容和资源。
创建Skill对象
对于结构是如下的Skill, 我们可以创建一个Skill对象:
skill-name/├── SKILL.md # 必需:包含元数据和指令├── references/ # 可选:详细参考文档│ └── api-doc.md├── scripts/ # 可选:可执行脚本│ └── process.py
AgentSkill skill = AgentSkill.builder().name("data_analysis").description("Use when analyzing data...").skillContent("# Data Analysis\n...").addResource("references/api-doc.md", "# API ...").addResource("scripts/process.py", "def process(data): ...").build();
AgentScope-Java 提供了 Repository 抽象层,使能从外部系统中批量创建Skill。
// 从文件系统加载 SkillAgentSkillRepository fileRepo = new FileSystemSkillRepository(Path.of("./skills"));AgentSkill skill = fileRepo.getSkill("data_analysis");skillBox.registerSkill(skill);// 保存 Skill 到文件系统fileRepo.save(List.of(skill), false);// 未来的扩展:从数据库、远程 API 等加载// AgentSkillRepository dbRepo = new DatabaseSkillRepository(dataSource);
基于SystemPrompt的一级披露
Toolkit toolkit = new Toolkit();SkillBox skillBox = new SkillBox(toolkit);skillBox.registerSkill(skill);ReActAgent agent = ReActAgent.builder().name("Assistant").model(model).skillBox(skillBox).toolkit(toolkit).build();
将Skill注册到SkillBox中, 将SkillBox注册到ReActAgent使技能生效。
在对话时, 对于持有了SkillBox的Agent, 会在SystemPrompt中注入Skill的提示词模板(告知模型什么时候使用Skill, 怎么加载Skill)和Skill的元数据, 用于一级暴露。
<available_skills><skill><name>data_analysis</name><description>Use when analyzing data...</description><skill-id>data_analysis</skill-id></skill></available_skills>
基于Tool的二级披露和三级披露
在对话时, LLM判断要使用Skill, 将通过自动注册好的load_skill_through_path Tool来加载Skill的指令和资源, 用于二级披露和三级披露
load_skill_through_path(skillId="data_analysis", path="SKILL.md")load_skill_through_path(skillId="data_analysis", path="references/api-doc.md")load_skill_through_path(skillId="data_analysis", path="scripts/process.py")
Tool 的渐进式披露
AgentScope-Java 将 Tool(Mcp/Function Call) 也作为 Skill 的一种资源,实现 Tool 的渐进式披露。在agent代码中将skill和Tool绑定. 当Skill 未激活时绑定的 Tool 不会出现在 Agent 的工具列表中,Skill 激活后 Tool 自动激活, 在接下来的对话中对 Agent 可见。
// 注册 Skill 并绑定 ToolskillBox.registration().skill(dataSkill) // 注册 Skill.tool(new DataAnalysisTool()) // 绑定 Tool(仅 Skill 激活时可用).apply();
代码执行能力
在 AgentScope-Java 中,Skill 的所有资源(包括脚本文件)都存储在内存中。这带来了分发便捷性,但也意味着脚本无法直接执行——操作系统需要文件系统路径来运行代码。
解决方案是使用 SkillBox.codeExecution() 启用代码执行能力,将脚本资源输出到工作目录:
// 自定义 Shell 命令白名单和审批回调ShellCommandTool customShell = new ShellCommandTool(null, // baseDir 会被自动设置为 workDirSet.of("python3", "node", "npm"), // 命令白名单command -> askUserApproval(command) // 可选的命令审批回调);skillBox.codeExecution().workDir("/path/to/workdir") // 指定工作目录.includeFolders("scripts/", "assets/").includeExtensions(".py", ".js", ".sh").withShell(customShell).withRead().withWrite().enable();
配合 Docker 沙箱实现安全执行:将 workDir 指向 Docker 容器挂载的卷目录,Skill 脚本会被写入该目录,随后在隔离的沙箱环境中执行。这种方式既保留了 Skill 打包分发的便捷性,又通过容器隔离确保了代码执行的安全性。
总结:Skill 是及时雨,但不是万金油
为什么说是"及时雨"
Skill 机制为拓展单个 Agent 能力提供了一种简单而强大的方式,让我们在不引入架构复杂度的前提下,构建具备多领域知识的智能 Agent:
适合使用 Skill 的场景:
与其他技术组合使用:
为什么说"不是万金油"
Skill 机制有其固有的局限性,并非所有场景都适用:
机制层面的局限:
不适合使用 Skill 的场景:
未来,我们将在 Skill 的完整生命周期管理和便捷分发机制上持续优化和探索,进一步降低 Skill 的创建、共享和复用成本。
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2026-02-04
Skills使用体验
2026-02-04
从“回答者”进化为“研究员”:全面解析 Deep Research
2026-02-04
刚刚,Xcode 史诗级更新:原生集成 Claude Agent SDK,苹果开发直接起飞!
2026-02-04
国产 Cowork 它来了!MCP、Skills和Expert Agents都支持,全部免费体验!
2026-02-04
混元研究博客上线姚顺雨团队最新成果:从 Context 探索语言模型的范式转变
2026-02-04
通俗讲解大模型短期记忆 vs 长期记忆
2026-02-04
谁动了我的电脑?谁应该抱怨?
2026-02-03
从 CLI 到桌面:Codex 把 coding agent 变成“任务指挥台”
2026-01-24
2026-01-10
2025-11-19
2025-11-13
2026-01-26
2026-01-01
2025-12-09
2025-11-12
2026-01-09
2025-12-21
2026-02-04
2026-02-03
2026-02-03
2026-02-02
2026-02-02
2026-02-02
2026-01-31
2026-01-30