智能体技能 (Agent Skills)#
MS-Agent 技能模块采用知识驱动的设计理念来扩展 LLM 智能体能力。与构建独立执行管线不同,技能被视为操作知识(procedural knowledge)——描述"如何做某件事",由模型自主使用已有工具(代码执行、文件读写、网络搜索等)来完成执行。
架构#
┌─────────────┐ ┌──────────────┐ ┌───────────────────┐
│ 技能来源 │────▶│ SkillCatalog │────▶│PromptInjector │
│ 本地/MS/Git │ │ 加载、过滤、 │ │ always 技能: │
│ │ │ 缓存 │ │ 全文注入 │
└─────────────┘ └──────┬───────┘ │ 所有技能: │
│ │ 名称+描述索引 │
│ └───────────────────┘
▼
┌─────────────┐ ┌──────────────────┐
│SkillToolSet │────▶│ ToolManager │
│ skills_list │ │ 统一注册 │
│ skill_view │ │ (MCP + 内置 │
│ skill_manage│ │ + 技能工具) │
└─────────────┘ └────────┬─────────┘
│
▼
┌────────────────┐
│ LLM Agent │
│ step() 循环 │
└────────────────┘
技能工作流程#
System prompt 中包含所有已启用技能的轻量索引(名称 + 描述,每个约 30 token)。标记
always: true的技能全文注入。当模型遇到相关任务时,调用
skill_view(skill_id)加载完整指令。模型按照指令使用已有工具(
code_executor、web_search、file_system等)执行操作。所有结果通过标准
role: tool消息流转——无特殊路由,无短路逻辑。
三级渐进式披露#
级别 |
模型看到的内容 |
Token 开销 |
来源 |
|---|---|---|---|
L1 |
名称 + 一行描述 |
~30 token/技能 |
System prompt(自动) |
L2 |
完整 SKILL.md 正文 |
按需 |
|
L3 |
引用的脚本、模板、文档 |
按需 |
|
核心特性#
技能即知识:技能指导模型;执行使用已有工具。无独立管线,无需子进程隔离。
统一工具集成:技能工具(
skills_list、skill_view、skill_manage)通过标准ToolManager注册,与 MCP 和内置工具共享同一套调度。多源加载:通过
SkillCatalog从本地目录、ModelScope 仓库或 Git URL 加载技能。三层优先级:内置技能 < 用户主目录技能 < 工作目录技能。高优先级同名技能覆盖低优先级。
常驻技能:将关键技能标记为
always: true,其全文注入 system prompt。热重载:
SkillCatalog支持单个技能重载或全量刷新,变更通过工具调用即时可见。运行时自进化:启用
enable_manage: true后,模型可在对话中创建、编辑、删除技能。零开销关闭:不配置
skills:→ 不注册技能工具,不注入 prompt,无性能影响。
技能目录结构#
my-skill/
├── SKILL.md # 必需:入口文件
├── scripts/ # 可选:脚本文件
│ └── search.py
├── references/ # 可选:参考文档
│ └── api-docs.md
├── templates/ # 可选:模板文件
│ └── report.html
└── assets/ # 可选:静态资源
└── config.yaml
SKILL.md 格式#
---
name: paper-finder # 必需,hyphen-case,≤64 字符
description: "搜索并分析学术论文" # 必需,≤1024 字符
version: "1.0.0" # 可选
author: "team-name" # 可选
tags: [research, papers] # 可选,用于分类过滤
always: false # 可选,true → 全文注入 prompt
requires: # 可选,依赖声明
tools: [web_search, terminal]
env: [ARXIV_API_KEY]
---
# Paper Finder
## 使用场景
当用户要求查找或分析学术论文时使用此技能。
## 操作步骤
1. 使用 `web_search` 在 arXiv 上搜索论文
2. 使用 `code_executor` 解析搜索结果
3. 向用户总结分析结论
快速开始#
通过 LLMAgent 使用#
import asyncio
from omegaconf import DictConfig
from ms_agent.agent import LLMAgent
config = DictConfig({
'llm': {
'model': 'qwen-max',
'api_base': 'https://dashscope.aliyuncs.com/compatible-mode/v1',
},
'tools': {
'code_executor': {'implementation': 'python_env'},
},
'skills': {
'path': ['./skills'],
'auto_discover': True,
},
})
agent = LLMAgent(config, tag='skill-agent')
async def main():
result = await agent.run('搜索关于多模态 RAG 的最新论文')
print(result[-1].content)
asyncio.run(main())
编程式使用#
from ms_agent.skill import SkillCatalog, SkillPromptInjector, SkillToolSet
catalog = SkillCatalog()
catalog.load_from_config(skills_config)
injector = SkillPromptInjector(catalog)
prompt_section = injector.build_skill_prompt_section()
toolset = SkillToolSet(config, catalog, enable_manage=True)
配置#
# agent.yaml
skills:
# 来源路径(本地目录、ModelScope 仓库或混合使用)
path:
- ./skills
- ms-agent/research_skills
# 或使用结构化来源
sources:
- type: local
path: ./skills
- type: modelscope
repo_id: ms-agent/research_skills
revision: v1.0
auto_discover: true # 自动扫描 CWD/skills/ 目录
enable_manage: false # 启用 skill_manage 工具
# 过滤控制(三值语义)
# whitelist: null # null = 全部启用(默认)
# whitelist: [] # [] = 全部禁用
# whitelist: [paper-finder] # 仅启用指定技能
disabled: [] # 禁用指定技能
核心组件#
组件 |
描述 |
|---|---|
|
多源技能管理器:优先级覆盖、缓存、白名单/禁用过滤、热重载 |
|
构建 system prompt 技能段落(always 技能全文 + 摘要索引) |
|
|
|
底层磁盘解析器,解析 SKILL.md 目录(从 v1 保留) |
|
已解析技能的数据模型(从 v1 保留) |
与旧版本 (v1) 的对比#
维度 |
v1(AutoSkills 管线) |
v2(知识 + 工具) |
|---|---|---|
执行模型 |
独立管线:LLM 分析 → DAG → 子进程 |
标准 agent 循环——模型直接使用工具 |
调度方式 |
|
无特殊分支;技能即标准工具 |
上下文加载 |
4 级 LLM 驱动的渐进分析 |
3 级披露:prompt → |
工具共存 |
技能与 MCP 工具互斥 |
所有工具共存于同一循环 |
流式输出 |
技能模式下不支持 |
天然支持 |
外部依赖 |
FAISS, Docker, sentence-transformers |
无(纯 Python) |
已移除 |
— |
|
新增 |
— |
|