一篇写给开发者的深度博客,涵盖 SKILL.md 架构原理、实战构建方法、生态工具全景,以及从 LangChain 到 Agentica 的框架选型思考
如果你用过 Claude Code,或者任何现代 AI 编码代理,你一定遇到过这样的场景——
你打开一个新对话,开始跟 AI 说:"我们的数据库用的是老式 WHERE 连接,不用 ANSI JOIN,字段名是斯洛文尼亚语,业务术语你不认识……"然后花了十分钟解释背景,AI 才勉强进入状态。第二天,重新开一个对话,再来一遍。
这不是 AI 不够聪明,而是它没有"记住你的工作环境"的机制。
Agent Skills(代理技能)就是为了解决这个问题而生的。它让你把这些背景知识、工作流程、代码模板打包成一个模块化的 SKILL.md 文件,AI 在需要的时候自动加载,不需要你每次重复解释。
这篇文章会从原理讲到实战,从 Anthropic 官方的 Claude Skills 讲到 LangChain、OpenSkills、Agentica 等整个生态,帮你建立一套完整的认知框架,并且真正能用起来。
1.1 一个直觉性的比喻
在软件开发里,我们有"库"(Library)这个概念——你不需要每次都从零写排序算法,直接 import 一个现成的就好。
Agent Skills 做的事情类似,只不过它打包的不是代码逻辑,而是AI 的行为模式和专业知识。
你可以把一个 Skill 理解成:
- 一份给 AI 看的"操作手册"
- 一套特定场景下的"行为规范"
- 一个可以随时插拔的"专业模块"
当你告诉 AI “帮我处理这个 PDF 文件”,它会自动去找有没有一个叫 pdf-tools 的技能,加载里面的指令和代码示例,然后按照你预先定义好的方式来处理,而不是每次都即兴发挥。
1.2 技术定义:SKILL.md 是什么
从技术角度看,一个 Agent Skill 的核心是一个 SKILL.md 文件——一个带有 YAML 前置元数据的 Markdown 文件。
它的最简形式长这样:
— name: pdf-tools description: Extract text from PDFs using pdfplumber. Use when working with PDF files. —
# PDF Tools
import pdfplumber
with pdfplumber.open("file.pdf") as pdf:
text = pdf.pages[0].extract_text() print(text)
就这些。这已经是一个完整可用的技能了。
YAML 头部的 name 和 description 是必填字段,其余都是可选的。Markdown 正文可以放任何你想让 AI 知道的内容:代码示例、操作步骤、注意事项、业务术语表……
1.3 渐进式披露:技能架构的核心设计思想
理解 Agent Skills 的关键,是理解"渐进式披露"(Progressive Disclosure)这个概念。
AI 的上下文窗口是有限的。如果你把所有知识都塞进一个对话,很快就会超出限制,而且大量无关内容会干扰 AI 的判断。
渐进式披露的思路是:按需加载,而不是全量加载。
具体来说,技能的加载分三个层次:
第一层:元数据(始终加载)
只有 name 和 description,几十个字符。AI 在每次对话开始时都会读取所有技能的元数据,用来判断"这个任务需要用哪个技能"。
第二层:SKILL.md 正文(按需加载)
当 AI 判断某个技能与当前任务相关时,才会加载完整的 SKILL.md 内容。这里包含主要的指令、代码示例和操作流程。
第三层:引用文件(按需加载)
如果 SKILL.md 里引用了其他文件(比如 AUTH.md、REFERENCE.md),AI 只有在真正需要那部分内容时才会去读取。
这个设计非常优雅。它让你可以构建非常丰富的技能包,而不用担心撑爆上下文窗口。
用一个更形象的比喻:SKILL.md 就像一本书的目录,你不需要把整本书背下来,只需要知道"第三章讲认证,第五章讲错误处理",需要的时候翻到对应章节就好。
1.4 技能 vs. MCP:别搞混了
很多人会把 Agent Skills 和 MCP(Model Context Protocol)混淆,这里简单区分一下。
MCP 是一个通信协议,解决的是"AI 如何调用外部工具和服务"的问题。它更像是一个 API 接口规范,让 AI 能够实时调用数据库、文件系统、外部 API 等。
Agent Skills 是一个知识打包格式,解决的是"AI 如何携带专业知识和行为规范"的问题。它更像是一个配置文件或操作手册,告诉 AI 在特定场景下应该怎么做。
两者并不互斥,实际上可以很好地配合使用:MCP 提供工具调用能力,Skills 提供使用这些工具的**实践和业务知识。
2.1 最简单的起点
不要被"技能"这个词吓到。你的第一个技能可以非常简单。
先创建一个目录结构:
~/.claude/skills/my-first-skill/ └── SKILL.md
然后写一个最基础的 SKILL.md:
— name: my-coding-style description: Personal coding style guide. Use when writing Python code for this project. —
# My Coding Style
- 使用 4 空格缩进 - 函数名用 snake_case - 类名用 PascalCase - 所有函数必须有 docstring - 优先使用 f-string 而不是 .format()
就这样,你已经有了一个技能。当你让 AI 帮你写 Python 代码时,它会自动遵循这些规范,不需要你每次重复说明。
2.2 写好 description 是最重要的事
很多人在构建技能时把大量精力放在正文内容上,却忽视了 description 字段——而这恰恰是最关键的部分。
AI 是通过 description 来决定"这个技能是否与当前任务相关"的。如果描述写得太模糊,AI 就不知道什么时候该用它;如果描述太宽泛,AI 可能在不该用的时候也加载它,浪费上下文。
一个好的 description 应该包含三个要素:
- 它能做什么(功能描述)
- 什么时候用它(触发条件)
- 关键词(帮助 AI 匹配用户意图)
来看几个对比:
❌ 太模糊,没用:
description: Helps with files description: Does database stuff description: Utility functions
✅ 清晰有效:
description: Extract text from PDFs using pdfplumber. Use when working with PDF files, forms, or document extraction.
description: Connect to Oracle database, extract PL/SQL packages with old-style SQL syntax. Use for Oracle database operations or PL/SQL code extraction.
description: Analyze Excel spreadsheets, create pivot tables. Use when working with .xlsx files or tabular data.
注意最后一点:用第三人称写作。写"Extract text from PDFs"而不是"I can extract text"或"You can use this to extract text"。Claude 的系统提示用的是第三人称,混用人称会造成混淆。
2.3 正文内容的写作原则
SKILL.md 的正文是给 AI 看的,不是给人看的。这意味着你要用 AI 最容易理解的方式来组织内容。
核心原则:简洁优先
AI 已经知道 PDF 是什么,知道 Python 的基本语法,知道什么是 REST API。你不需要解释这些基础知识,直接给代码、给步骤、给规范就好。
❌ 浪费上下文的写法:
Extract PDF text
PDF stands for Portable Document Format. It's a file format developed by Adobe in 1992 for presenting documents. PDFs can contain text, images, forms, and more. To extract text from a PDF, you'll need to use a specialized library. There are many options available in Python, such as PyPDF2, pdfplumber, and PyMuPDF. We recommend pdfplumber because it's actively maintained…
✅ 高效的写法:
Extract PDF text
import pdfplumber with pdfplumber.open("file.pdf") as pdf:
text = pdf.pages[0].extract_text()
Claude 已经知道 PDF 是什么了。把代码贴出来,继续下一步。
目标:主 SKILL.md 文件保持在 500 行以内。 如果内容更多,用引用文件来扩展(后面会讲)。
2.4 用渐进式披露扩展技能
当你的技能内容越来越多,单个 SKILL.md 文件会变得臃肿。这时候就需要用到渐进式披露的文件引用机制。
目录结构变成这样:
~/.claude/skills/api-client/ ├── SKILL.md # 主文件,包含快速入门和文件引用 ├── AUTH.md # 认证相关详细文档 ├── LIMITS.md # 速率限制说明 ├── ERRORS.md # 错误处理指南 └── EXAMPLES.md # 完整示例集合
SKILL.md 的写法:
# API Client
Quick Start
[基础代码示例]
Advanced Topics
需要认证?见 AUTH.md 遇到速率限制?见 LIMITS.md 错误处理?见 ERRORS.md
这样,Claude 只有在用户问到认证相关问题时才会去读 AUTH.md,其他时候不会加载,节省了大量上下文。
有一个重要的注意事项:保持引用层级只有一层深。
❌ 不要这样:
SKILL.md → advanced.md → details.md → actual_info.md
✅ 应该这样:
SKILL.md → auth.md, limits.md, errors.md, examples.md
嵌套太深的话,Claude 有时候只会部分读取文件,导致信息丢失。保持扁平结构,从 SKILL.md 直接引用所有子文件。
如果某个引用文件超过 100 行,在文件顶部加一个目录:
# API Reference
Contents
Authentication
[…]
这帮助 Claude 在只读取部分文件时也能快速定位需要的内容。
2.5 添加可执行脚本
对于更复杂的技能,你可以在技能目录里放实际可执行的代码文件。
~/.claude/skills/db-toolkit/ ├── SKILL.md ├── reference.md ├── usage-examples.md ├── sql-syntax-guide.md ├── troubleshooting.md └── scripts/
└── oracle_toolkit_standalone.py
在 SKILL.md 里引用这个脚本:
Setup
The toolkit script is at scripts/oracle_toolkit_standalone.py.
from pathlib import Path import sys
skill_dir = Path.home() / '.claude' / 'skills' / 'db-toolkit' sys.path.insert(0, str(skill_dir / 'scripts'))
from oracle_toolkit_standalone import OracleToolkit
关键点是:把所有依赖都内嵌在技能包里,不要依赖外部路径。这样技能可以在任何环境下工作,不会因为路径问题失效。
2.6 打包你的技能
技能完成后,需要按照正确的目录结构打包成 ZIP 文件才能上传。
✅ 正确结构:
我的技能.zip └── 我的技能/
├── SKILL.md └── 资源/
❌ 错误结构:
我的技能.zip └──(文件直接位于 ZIP 根目录)
注意:ZIP 文件里必须有一个顶层目录,不能把文件直接放在 ZIP 根目录下。
2.7 测试你的技能
上传前的自检清单:
- SKILL.md 的 description 是否清晰准确?
- 描述是否准确反映了 Claude 应该在什么时候使用这个技能?
- 所有引用的文件是否都存在于正确的位置?
- 用几个示例提示测试一下,确保 Claude 能正确识别并调用它
上传后的验证步骤:
- 尝试几种不同的提示,应该能触发这个技能
- 查看 Claude 的思路,确认它正在加载技能
- 如果 Claude 在预期情况下没有使用技能,迭代更新 description
这个案例来自一位真实开发者的经历,他处理的是一个极其复杂的 Oracle 数据库:1048 个 PL/SQL 包,20913 个存储过程,所有业务术语用斯洛文尼亚语,SQL 语法是 1995 年风格(只用 WHERE 连接,不用 ANSI JOIN)。
每天他都要跟 Claude 重复解释这些背景,直到他构建了两个技能解决了这个问题。
3.1 为什么是两个技能而不是一个
最初的想法是把所有内容放进一个大技能。但他最终选择了分成两个:
db-toolkit:技术层面——如何连接数据库、提取代码、执行查询
business-domain:业务层面——表名的含义、业务流程、斯洛文尼亚语术语表
分开的理由很实际:这两类知识的变化频率不同。数据库操作方式几乎不变,但业务知识会随着业务发展持续更新。分开维护更方便,而且有时候只需要加载其中一个,节省上下文。
这个思路值得记住:按变化频率和使用场景来拆分技能,而不是按内容量来拆分。
3.2 db-toolkit 的完整结构
~/.claude/skills/db-toolkit/ ├── SKILL.md # 687行(超过推荐的500行,但有充分理由) ├── reference.md # 所有方法的API文档 ├── usage-examples.md # 10+个真实场景示例 ├── sql-syntax-guide.md # 老式SQL语法示例 ├── troubleshooting.md # 常见错误处理 └── scripts/
└── oracle_toolkit_standalone.py
SKILL.md 超过了推荐的 500 行,但作者认为值得——因为里面包含了用户可以直接复制使用的工作流程检查清单,这些内容不能拆分到其他文件里。
3.3 让技能真正好用的四个关键设计
设计一:复制粘贴检查清单
对于复杂的多步骤工作流,在技能里提供一个检查清单,让 Claude 在执行过程中逐项勾选:
Copy this checklist:
Task Progress:
- [ ] Connect to database
- [ ] Extract package body
- [ ] Validate extraction (check line count)
- [ ] Copy to working directory
- [ ] Make changes
- [ ] Run tests
这个设计非常实用。用户可以清楚地看到进度,Claude 也有了明确的执行框架,不容易遗漏步骤。
设计二:立即验证每个操作
每个操作完成后立刻验证结果,并提供具体的修复建议:
pkg = await toolkit.extract_source('MY_SCHEMA', 'PKG_EXAMPLE', 'PACKAGE BODY')
if not pkg['success']:
print("❌ Failed:", pkg['message']) print("🔄 Try these fixes:") print(" • Check package name spelling") print(" • Use 'PACKAGE BODY' not 'PACKAGE'") print(" • Verify schema owner is correct") return
# 验证提取质量 if pkg['line_count'] < 10:
print("⚠️ Suspiciously small extraction - double check")
不要等到最后才发现问题。每一步都验证,出错了立刻给出可操作的修复建议。
设计三:技能之间相互引用
db-toolkit 在需要业务上下文时提到 business-domain,business-domain 在需要数据库操作时提到 db-toolkit。Claude 会自动判断什么时候需要同时加载两个技能。
设计四:嵌入所有依赖
所有依赖的 Python 脚本都放在技能目录的 scripts/ 子目录里,通过相对路径引用:
from pathlib import Path skill_dir = Path.home() / '.claude' / 'skills' / 'db-toolkit' sys.path.insert(0, str(skill_dir / 'scripts')) from oracle_toolkit_standalone import OracleToolkit
这样技能在任何机器上都能工作,不依赖外部环境配置。
3.4 最终结果
经过几周的迭代优化:
- ✅ 100% 符合 Anthropic **实践
- ✅ 14 个测试中通过 12 个(85.7% 通过率)
- ✅ 每周节省大约 10 小时的重复解释时间
- ✅ 跨会话稳定工作
这个案例最有价值的地方不是技术细节,而是思路:把你的工作流程、业务知识、操作规范系统化地打包成技能,让 AI 真正融入你的工作环境,而不是每次都从零开始。
在构建了足够多的技能之后,一些通用的设计模式会浮现出来。这里整理了几个最实用的。
4.1 模板模式(Template Pattern)
当你需要 AI 输出固定格式时,直接在技能里定义模板:
Report Format
ALWAYS use this structure:
[Title]
Summary
[One paragraph]
Findings
- Finding 1
- Finding 2
Recommendations
[Actionable next steps]
这个模式适用于:周报、代码审查报告、技术文档、API 文档等任何需要统一格式的输出。
4.2 词汇表模式(Glossary Pattern)
当你的项目有大量专业术语或领域特定词汇时:
Domain Glossary
- skondi_spis: claim file (保险理赔文件)
- zavarovanec: insured person (被保险人)
- premija: premium (保费)
- škoda: damage/loss (损失/赔付)
Naming Conventions
- All table names use Slovenian terms
- Column names follow pattern: [entity]_[attribute]
- Procedure names use verb_noun format
这让 AI 在处理你的代码时能正确理解业务含义,而不是把斯洛文尼亚语当成乱码。
4.3 约束模式(Constraints Pattern)
当你的环境有特殊限制时,明确列出禁止事项:
Hard Rules - NEVER use ANSI JOIN syntax (INNER JOIN, LEFT JOIN, etc.)
- ALWAYS use WHERE clause joins: WHERE a.id = b.id
- NEVER use modern SQL features (CTEs, window functions)
- ALWAYS validate extraction line count > 100
- NEVER modify production tables directly
这比"请用老式 SQL 语法"这种模糊指令有效得多。
4.4 工作流模式(Workflow Pattern)
对于多步骤的复杂任务,提供明确的执行流程:
Standard Extraction Workflow
- Connect to database using toolkit
- Verify connection: check schema access
- Extract package: use PACKAGE BODY type
- Validate: line_count > 100, no error messages
- Save to working directory
- Create backup copy
- Make requested changes
- Run syntax validation
- Test in dev environment
- Report results with line count comparison
配合检查清单使用效果更好,让 AI 和用户都清楚当前进行到哪一步。
4.5 条件分支模式(Conditional Pattern)
当不同情况需要不同处理方式时:
File Type Handling
If .xlsx file: → Use openpyxl for reading → Preserve formatting when writing
If .csv file: → Use pandas with encoding='utf-8-sig' → Handle BOM characters
If .json file: → Validate structure first → Use indent=2 for output
Agent Skills 不只是 Claude 的专属功能,它已经发展成一个跨平台的生态标准。让我们看看整个生态的全貌。
5.1 支持技能的平台
根据目前的生态现状,以下平台都已经支持 Agent Skills:
Anthropic 官方
- Claude Code(claude.ai/code):Anthropic 的编码工具,技能支持的发源地,文档最完整
OpenAI 阵营
- OpenAI Codex:OpenAI 的 CLI 代理,已支持技能格式
Google 阵营
- Gemini CLI:终端中的 Gemini,带有技能支持
编辑器和 IDE
- Cursor:集成原生技能的 AI 编辑器
- VS Code:通过 GitHub Copilot 支持 Agent Skills
- GitHub Copilot:具有 Agent Skills 支持的代码助手
- Roo Code:VS Code 扩展,集成了技能
其他平台
- Mistral Vibe:Mistral 的 CLI 编码代理
- Manus:自主 AI 代理,支持代理技能
- OpenCode:AI 开发工具,内置技能支持
- Amp:AI 编码助手,支持 Agent Skills
这个列表说明了一件重要的事:SKILL.md 正在成为 AI 代理能力扩展的事实标准格式,就像 Dockerfile 之于容器化一样。
5.2 即用型技能库
你不需要从零构建所有技能,已经有大量现成的技能库可以直接使用:
官方技能库
- Anthropic 官方技能:最权威的参考,包含各类通用技能
- OpenAI 技能:OpenAI 官方维护
- 微软技能:专注于 Azure SDK 和 Microsoft AI Foundry
- Google Workspace 技能:Google 生产力工具集成
- Vercel 技能:Web 开发**实践
- Supabase 技能:Supabase 数据库操作
- Hugging Face 技能:ML/AI 相关技能
社区技能集合
- Agent-Skills-for-Context-Engineering:上下文工程专项
- AI-research-SKILLs:AI/ML 研究技能
- pm-skills:项目管理技能
技能市场
- agentskill.sh:44k+ 技能目录,双层安全扫描
- SkillsMP:发现和分享技能的市场
- Skillstore:精选技能市场
- skills.sh:技能目录和排行榜
5.3 开发者工具
围绕技能开发,已经出现了一批专门的工具:
SkillCheck(安全扫描器)
npm install @agentigy/skillcheck npx skillcheck .claude/skills/my-skill.md
SkillCheck 会扫描你的 SKILL.md 文件,检测以下安全问题:
- 硬编码密钥:API keys、tokens、passwords(CRITICAL 级别)
- 命令注入:不安全的 shell 命令执行(CRITICAL 级别)
- 权限提升:sudo、chmod 777 等危险操作(CRITICAL 级别)
- 路径遍历:
../序列、未验证的用户路径(HIGH 级别) - 信息泄露:SSH 密钥、数据库连接字符串等(HIGH 级别)
它还支持 SARIF 格式输出,可以集成到 GitHub Code Scanning:
npx skillcheck –format sarif . > results.sarif
OpenSkills(通用技能加载器)
OpenSkills 解决了一个很实际的问题:如果你同时使用 Claude Code 和其他 AI 代理,每个平台都有自己的技能加载方式,维护起来很麻烦。
OpenSkills 提供了一个统一的安装和加载接口:
# 安装 Anthropic 官方技能库 npx openskills install anthropics/skills
# 同步技能 npx openskills sync
# 从任意 GitHub 仓库安装 npx openskills install your-org/your-skills
# 从本地路径安装 npx openskills install ./local-skills/my-skill
它生成的
XML 格式与 Claude Code 完全兼容,任何能读取 AGENTS.md 的代理都可以使用。
对于多代理环境,可以使用 –universal 模式,把技能安装到 .agent/skills/ 而不是 .claude/skills/,避免与 Claude 的插件市场冲突:
npx openskills install anthropics/skills –universal
如果你在构建自己的 AI 代理框架,而不只是使用现成的工具,LangChain 提供了一个很好的参考实现。
6.1 LangChain 中的技能模式
在 LangChain 的架构里,技能被实现为一种特殊的工具(Tool),代理可以按需调用来加载专业化的提示和上下文。
from langchain.tools import tool from langchain.agents import create_agent
@tool def load_skill(skill_name: str) -> str:
"""Load a specialized skill prompt. Available skills: - write_sql: SQL query writing expert - review_legal_doc: Legal document reviewer Returns the skill's prompt and context. """ # 从文件或数据库加载技能内容 skill_content = load_from_storage(skill_name) return skill_content
agent = create_agent(
model="gpt-4.1", tools=[load_skill], system_prompt=( "You are a helpful assistant. " "You have access to specialized skills. " "Load the appropriate skill when needed." ),
)
6.2 技能模式的关键特征
LangChain 文档总结了技能模式的五个核心特征,这对理解整个设计思想很有帮助:
提示驱动的专业化:技能主要通过专业化的提示来定义,而不是通过代码逻辑。这让非技术人员也能创建和维护技能。
渐进式披露:技能根据上下文或用户需求按需激活,而不是全部预加载。
团队分布式开发:不同团队可以独立开发和维护各自的技能,不需要修改核心代理代码。
轻量级组合:技能比完整的子代理更简单,组合起来的开销更小。
引用感知:技能可以引用脚本、模板和其他资源,实现更复杂的功能。
6.3 什么时候用技能模式,什么时候用子代理
LangChain 的文档给出了一个很清晰的判断标准:
用技能模式,当你:
- 需要一个代理有多种可能的专业化方向
- 不需要在技能之间强制执行特定约束
- 不同团队需要独立开发能力
用子代理模式,当你:
- 需要真正的并行执行
- 不同任务需要完全隔离的上下文
- 需要严格的权限控制
常见的技能模式应用场景:编码助手(不同语言或任务的技能)、知识库(不同领域的技能)、创意助手(不同格式的技能)。
6.4 Deep Agents:技能模式的完整实现
LangChain 的 Deep Agents 框架是一个"开箱即用"的代理框架,内置了完整的技能支持:
from deepagents import create_deep_agent
agent = create_deep_agent() result = agent.invoke({
"messages": [{"role": "user", "content": "Research LangGraph and write a summary"}]
})
Deep Agents 内置了:
- 规划工具(
write_todos):任务分解和进度跟踪 - 文件系统工具(
read_file,write_file,edit_file,ls,glob,grep) - Shell 访问(
execute):执行命令(带沙箱) - 子代理(
task):委托工作,隔离上下文窗口 - 上下文管理:对话过长时自动摘要,大输出保存到文件
你也可以自定义:
from langchain.chat_models import init_chat_model
agent = create_deep_agent(
model=init_chat_model("openai:gpt-4o"), tools=[my_custom_tool], system_prompt="You are a research assistant.",
)
7.1 Agentica:把函数调用推向极致
Agentica 是一个 TypeScript 的 AI 函数调用框架,它的设计理念和 Agent Skills 有一个有趣的对比。
Agentica 的核心主张是:任何能写函数的人都能构建 AI 代理。
import { Agentica, assertHttpController } from "@agentica/core"; import OpenAI from "openai"; import typia from "typia";
import { MobileFileSystem } from "./services/MobileFileSystem";
const agent = new Agentica({ vendor: {
api: new OpenAI({ apiKey: "" }), model: "gpt-4o-mini",
}, controllers: [
// 来自 TypeScript 类的函数 typia.llm.controller<MobileFileSystem>( "filesystem", new MobileFileSystem(), ), // 来自 Swagger/OpenAPI 的函数 assertHttpController({ name: "shopping", model: "chatgpt", document: await fetch( "https://shopping-be.wrtn.ai/editor/swagger.json", ).then(r => r.json()), connection: { host: "https://shopping-be.wrtn.ai", headers: { Authorization: "Bearer " }, }, }),
], });
await agent.conversate("I wanna buy MacBook Pro");
Agentica 支持三种函数来源:TypeScript 类、Swagger/OpenAPI 文档、MCP 服务器。你把函数准备好,它就变成了 AI 代理。
7.2 Skills vs. Functions:两种不同的抽象层次
对比 Agent Skills 和 Agentica 的设计,可以看到两种不同的抽象思路:
Agent Skills(提示驱动):
- 核心是 Markdown 文档
- 面向知识和行为规范的打包
- 非技术人员也能创建
- 适合打包"怎么做"的知识
Agentica(函数驱动):
- 核心是 TypeScript 函数
- 面向具体能力的封装
- 需要编程能力
- 适合封装"能做什么"的功能
两者并不对立,而是互补的。在一个完整的 AI 代理系统里,你可能既需要 Skills 来提供业务知识和操作规范,也需要 Functions 来提供实际的执行能力。
7.3 IntentKit:云原生的代理团队
IntentKit 代表了另一个方向:不是增强单个代理,而是构建一个协作的代理团队。
IntentKit 的核心特性:
- 云原生:在云端运行,不需要本地资源
- 多代理协作:多个代理可以互相调用
- 自托管:完全控制你的代理基础设施
在 IntentKit 的架构里,技能的概念被扩展了——不只是单个代理的能力模块,而是整个代理团队的专业分工。
这个思路很有启发性:当任务足够复杂,单个代理加载多个技能可能不够,需要多个专业代理协同工作。
8.1 技能文件的安全风险
技能文件本质上是给 AI 执行的指令,这带来了一些独特的安全风险。
提示注入:如果技能内容来自不可信来源,攻击者可能通过精心构造的技能内容来操控 AI 的行为。
硬编码凭证:开发者可能不小心把 API 密钥、数据库密码等敏感信息写进技能文件。
危险命令:技能可能包含 sudo、rm -rf、chmod 777 等危险操作,在某些情况下可能造成系统损害。
路径遍历:如果技能里有文件操作,不安全的路径处理可能导致访问到不该访问的文件。
8.2 SkillCheck 的安全扫描规则
SkillCheck 工具提供了系统化的安全扫描,覆盖以下规则:
CRITICAL 级别
SECRET_EXPOSURE_001(硬编码密钥)
- 检测:AWS keys、API keys、JWT tokens、私钥、GitHub tokens
- 排除:占位符,如
your_api_key_here、${API_KEY}、XXXX - 对应 CWE-798
CMD_INJECTION_001(命令注入)
- 检测:不安全的
bash、eval()、exec()、os.system()与用户输入结合 - 上下文感知:当附近有验证代码时跳过
- 对应 CWE-78
PRIV_ESCALATION_001(权限提升)
- 检测:
sudo、setuid/setgid、chmod 777、su、pkexec、内核模块加载、Docker socket 访问 - 上下文感知:当附近有授权检查时跳过
- 对应 CWE-250
HIGH 级别
PATH_TRAVERSAL_001(路径遍历)
- 检测:
../序列、带未验证用户路径的文件操作 - 上下文感知:当存在
path.resolve()或验证时跳过 - 对应 CWE-22
INFO_DISCLOSURE_001(信息泄露)
- 检测:SSH 密钥、AWS 凭证、
.env文件、/etc/passwd、数据库连接字符串 - 上下文感知:当有脱敏/过滤代码时跳过
- 对应 CWE-200
8.3 安全**实践
构建技能时的安全建议:
凭证管理:永远不要把真实的 API 密钥或密码写进技能文件。使用环境变量或密钥管理服务,在技能里只写占位符和读取方式:
Authentication
Load credentials from environment: api_key = os.environ.get('MY_API_KEY')
Never hardcode: api_key = "sk-abc123…"
命令执行:如果技能需要执行 shell 命令,明确限制可以执行的命令范围,并验证所有用户输入:
Allowed Commands
Only execute these pre-approved commands:
- git status, git log, git diff
- python -m pytest
- npm test
Never execute commands with user-provided arguments directly.
文件操作:限制文件访问范围,使用 path.resolve() 防止路径遍历:
import os from pathlib import Path
def safe_read(user_path: str, base_dir: str) -> str:
# 解析并验证路径 full_path = Path(base_dir).resolve() / user_path if not str(full_path).startswith(str(Path(base_dir).resolve())): raise ValueError("Path traversal detected") return full_path.read_text()
定期扫描:把 SkillCheck 集成到 CI/CD 流程里,每次提交都自动扫描:
# .github/workflows/skill-security.yml - name: Scan Skills run: npx skillcheck --fail-on HIGH ./skills
经过前面的深入探讨,这里把最重要的**实践整理成一个可以直接参考的清单。
9.1 技能设计原则
保持专注:一个技能解决一类问题。多个专注的小技能,比一个什么都包含的大技能效果更好。
判断标准:如果你的技能 description 里出现了"and"连接两个不同的功能,考虑拆分成两个技能。
描述要精准:description 是技能的"门面",AI 靠它决定是否加载技能。要具体说明功能、触发条件和关键词,用第三人称写作。
先简单后复杂:先用纯 Markdown 写基础指令,验证有效后再添加脚本和复杂逻辑。不要一开始就过度设计。
按变化频率拆分:技术实现和业务知识分开,快速变化的内容和稳定的内容分开。这样维护成本更低。
9.2 内容写作原则
简洁优先:AI 已经有大量基础知识,不需要你解释 PDF 是什么、Python 是什么。直接给代码、给步骤、给规范。
主文件控制在 500 行以内:超出的内容用引用文件扩展,保持主文件简洁。
引用层级保持一层:SKILL.md 直接引用所有子文件,不要嵌套引用。
长文件加目录:超过 100 行的引用文件,在顶部加目录,帮助 AI 快速定位。
9.3 技能结构原则
嵌入所有依赖:把脚本、配置文件等依赖放在技能目录里,通过相对路径引用,不依赖外部环境。
提供检查清单:对于复杂的多步骤工作流,提供可复制的检查清单,让执行过程可见可追踪。
立即验证:每个操作后立刻验证结果,出错时提供具体的修复建议,而不是等到最后才发现问题。
技能间相互引用:当两个技能经常配合使用时,在各自的文件里互相提及,让 AI 知道什么时候需要同时加载。
9.4 安全原则
不硬编码凭证:API 密钥、密码等敏感信息永远不写进技能文件,使用环境变量。
限制命令范围:如果技能需要执行命令,明确列出允许的命令,验证所有输入。
定期安全扫描:把 SkillCheck 集成到开发流程,自动检测安全问题。
来源可信:只使用来自可信来源的技能,从市场安装时注意查看安全评分。
10.1 标准化的趋势
从目前的生态发展来看,SKILL.md 正在朝着成为行业标准的方向演化。
Claude Code、OpenAI Codex、Gemini CLI、Cursor、VS Code、GitHub Copilot……越来越多的平台开始支持相同的技能格式。这种趋势一旦形成,会产生强大的网络效应:你为 Claude 构建的技能,可以直接在 Cursor 里用;Anthropic 发布的官方技能,可以通过 OpenSkills 安装到任何支持的平台。
这类似于 Docker 镜像的演化路径——从一个公司的内部格式,到整个行业的标准。
10.2 技能市场的成熟
目前已经有多个技能市场(agentskill.sh、SkillsMP、Skillstore),但还处于早期阶段。随着生态成熟,我们可能会看到:
- 专业技能的商业化:高质量的专业技能(如特定行业的业务知识包)可能会成为付费产品
- 企业级技能管理:企业内部的技能库管理、版本控制、权限管理工具
- 技能质量评分:类似 npm 包的下载量和评分系统,帮助用户选择高质量技能
- 自动化技能生成:从现有文档、代码库自动生成技能的工具
10.3 与 MCP 的深度整合
目前 Skills 和 MCP 是相对独立的两个系统,但它们的整合潜力很大。
想象一个场景:你有一个 Supabase 技能,里面包含了你的数据库 schema 知识和**实践;同时通过 MCP 连接到实际的 Supabase 实例。技能提供"怎么做"的知识,MCP 提供"能做什么"的能力,两者结合,AI 就能真正理解你的数据库并高效操作它。
这种"知识层 + 能力层"的架构,可能是未来 AI 代理的主流模式。
10.4 从工具到基础设施
最终,Agent Skills 可能不只是一个"给 AI 用的插件系统",而是成为企业知识管理的新基础设施。
传统的知识管理工具(Wiki、文档系统、操作手册)是给人看的。Agent Skills 是给 AI 看的,但本质上承载的是同样的东西:组织的知识、流程和规范。
当 AI 代理越来越深入地参与企业工作流程,如何让 AI 准确理解和遵循企业的知识体系,就变成了一个战略性问题。而 Skills 提供了一个标准化的答案。
读到这里,你已经有了构建 Agent Skills 所需的所有知识。
但知识不等于能力。最好的学习方式是动手做。
今天就可以开始的三件事:
第一,找一个你在工作中经常重复向 AI 解释的背景信息——可能是你的代码规范、你的项目架构、你的业务术语表——把它写成一个最简单的 SKILL.md 文件。不需要完美,先有一个能用的版本。
第二,安装 SkillCheck,扫描一下你的技能文件,确保没有安全问题。这是一个好习惯,从一开始就建立。
第三,去 Anthropic 官方技能库 看看已有的技能是怎么写的,借鉴好的设计模式,不需要从零发明。
Agent Skills 的核心价值不在于技术复杂度,而在于系统化地把你的工作知识转化为 AI 可以理解和使用的形式。这件事做好了,你和 AI 的协作效率会有质的提升。
从一个小技能开始,迭代,优化,扩展。这就是构建个人 AI 工作环境的正确姿势。
以下是本文涉及的主要资源,供深入学习:
官方文档
- 如何创建自定义技能 - Claude 帮助中心
- 在 Claude 中使用技能
- 技能 API 快速入门
- LangChain Skills 文档
学习资源
- 使用 Anthropic 进行智能体技能训练 - DeepLearning.AI
- Claude 技能构建完全指南 - Anthropic
- 为现实世界中的智能体配备智能体技能 - Anthropic Engineering
工具和框架
- SkillCheck 安全扫描器
- OpenSkills 通用加载器
- Deep Agents - LangChain
- Agentica - TypeScript 函数调用框架
- IntentKit - 云原生代理框架
技能库和市场
- Anthropic 官方技能库
- awesome-agent-skills 资源集合
- agentskill.sh 技能目录
转载自CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/u0/article/details/
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/282959.html