Agent Skills 从入门到工程化(一):什么是 Agent Skills?为什么 Agent 开发离不开 Skills?
前言
在学习 Agent 开发时,很多人会先关注大模型、Prompt、框架或者工作流:
- 用什么大模型?
- Prompt 怎么写?
- 用 LangChain、Dify、AutoGen 还是 OpenAI Agents SDK?
- Agent 怎么规划任务?
- 多 Agent 怎么协作?
这些当然重要,但如果真正进入 Agent 工程开发,就会发现一个更核心的问题:
Agent 不是只靠“会说话”完成任务,而是要靠“会调用能力”完成任务。
这里的“能力”,通常就可以抽象成 Skills。
一个 Agent 能不能稳定工作,不只取决于大模型本身有多强,还取决于它能调用哪些 Skills、这些 Skills 是否设计清楚、边界是否明确、输入输出是否规范、异常是否可控。
所以,理解 Agent Skills,是学习 Agent 开发非常重要的一步。
1. 从普通大模型到 Agent
普通大模型主要擅长生成文本。
比如用户问:
帮我总结一下这段话。
模型可以直接根据上下文生成回答。
但是如果用户问:
帮我查一下今天北京天气,然后根据天气建议我穿什么。
这时模型本身并不知道“今天北京天气”的实时数据。它需要调用外部能力,比如天气查询接口。
再比如用户问:
帮我搜索最近一周关于某个技术的新闻,并整理成一份摘要。
这时模型需要:
- 搜索网页;
- 读取网页内容;
- 筛选有效信息;
- 总结内容;
- 生成结构化结果。
这些能力都不是模型单靠内部参数就能稳定完成的,而是需要外部工具或能力模块支持。
这就是 Agent 和普通大模型应用的重要区别。
普通大模型更像是一个“回答者”,而 Agent 更像是一个“执行者”。
Agent 不仅要理解任务,还要判断应该调用哪些能力来完成任务。
这些可以被 Agent 调用的能力单元,就是我们要讨论的 Skills。
2. 什么是 Agent Skills?
可以先给出一个简单定义:
Agent Skill 是 Agent 可以调用的、面向具体任务封装好的能力单元。
它可以是一个函数,也可以是一个 API,也可以是一段工作流,还可以是一个外部服务。
常见的 Skills 包括:
- 搜索网页;
- 查询数据库;
- 读取文件;
- 解析 PDF;
- 调用天气 API;
- 调用地图 API;
- 执行代码;
- 发送邮件;
- 生成图片;
- 检索知识库;
- 调用企业内部系统;
- 生成结构化报告。
但是需要注意:
Skill 不等于随便写一个函数。
一个真正可用的 Skill,通常不只是执行逻辑本身,还应该包含:
- 这个 Skill 是做什么的;
- 什么时候应该调用;
- 什么时候不应该调用;
- 需要哪些输入参数;
- 返回什么格式的结果;
- 出错时怎么处理;
- 调用结果是否可信;
- 是否需要权限控制;
- 是否需要人工确认。
所以,Skill 更像是一个面向 Agent 的能力封装,而不是一个普通函数。
3. Skill 和 Tool 有什么区别?
在很多框架里,Tool 和 Skill 经常会被混用。
简单理解可以这样区分:
| 概念 | 侧重点 | 示例 |
|---|---|---|
| Function | 普通函数,强调代码执行 | search(query) |
| Tool | 可被模型调用的工具,强调调用接口 | 网页搜索工具 |
| Skill | 面向任务封装的能力,强调任务边界和使用规则 | 根据问题搜索资料,并返回摘要和来源 |
| Workflow | 多个步骤组成的固定流程 | 搜索 → 阅读 → 总结 → 输出报告 |
| Agent | 根据任务动态选择能力并执行 | 判断是否需要搜索、是否需要读取文件、是否需要生成结果 |
可以用一个例子理解。
如果我们有一个函数:
def search_api(query: str):
...
这是一个 Function。
如果把它注册给大模型,让模型可以调用它,这就是一个 Tool。
但如果我们进一步封装成:
Skill 名称:web_search_skill
功能:
根据用户问题搜索互联网信息,返回与问题相关的结果摘要、来源链接和发布时间。
适用场景:
用户询问最新信息、实时信息、新闻、价格、政策、产品版本等内容。
不适用场景:
用户只是要求改写、翻译、总结已提供文本时,不应调用该 Skill。
这就更接近一个 Skill。
因为它不只是一个底层调用接口,而是带有任务语义、使用边界和返回规范的能力模块。
4. 为什么 Agent 离不开 Skills?
4.1 Skills 扩展了 Agent 的能力边界
大模型本身有知识截止时间,也不能直接访问外部系统。
通过 Skills,Agent 可以获得更多能力:
- 通过搜索 Skill 获取实时信息;
- 通过数据库 Skill 查询业务数据;
- 通过文件解析 Skill 读取用户上传文档;
- 通过代码执行 Skill 进行计算和分析;
- 通过邮件 Skill 帮用户草拟或发送邮件;
- 通过 RAG Skill 检索企业知识库。
没有 Skills,Agent 很容易变成一个只能聊天的模型。
有了 Skills,Agent 才能真正进入“执行任务”的阶段。
4.2 Skills 让 Agent 的行为更可控
很多人以为 Agent 越自由越智能,但在实际工程里,Agent 不能完全自由发挥。
如果用户问:
帮我查一下这个订单状态。
Agent 不应该随便编一个订单状态,而应该调用订单查询 Skill。
如果用户问:
帮我删除这批数据。
Agent 不应该直接执行危险操作,而应该先进行权限检查和二次确认。
Skills 的存在,可以把 Agent 的能力限制在明确的边界内:
- 能做什么;
- 不能做什么;
- 需要什么参数;
- 哪些操作需要确认;
- 哪些操作必须拒绝;
- 哪些结果需要验证。
所以,Skills 不只是扩展能力,也是在约束能力。
4.3 Skills 让 Agent 更容易工程化
一个真正可上线的 Agent 系统,不能只看最终回答是否流畅,还要关注:
- 每次调用了什么 Skill;
- Skill 是否调用成功;
- 输入参数是否正确;
- 返回结果是否符合预期;
- 调用耗时是多少;
- 调用成本是多少;
- 错误原因是什么;
- 是否可以复现问题。
如果所有能力都写在一个大 Prompt 里,系统很难维护。
而如果把能力拆成一个个 Skills,就可以分别管理、测试、记录和优化。
例如:
用户问题
↓
Agent 判断任务类型
↓
选择合适的 Skill
↓
校验输入参数
↓
执行 Skill
↓
检查返回结果
↓
生成最终回答
这种结构比单纯依赖 Prompt 更稳定,也更适合工程落地。
5. 一个 Skill 应该包含哪些部分?
一个基础的 Skill 可以包含以下内容:
Skill
├── name:Skill 名称
├── description:功能描述
├── input_schema:输入参数结构
├── output_schema:输出结果结构
├── handler:实际执行逻辑
├── error_handler:异常处理逻辑
├── examples:调用示例
├── constraints:限制条件
└── metadata:版本、权限、分类等信息
下面是一个简单例子。
{
"name": "weather_query",
"description": "查询指定城市在指定日期的天气情况,适用于用户询问实时天气或天气预报的场景。",
"input_schema": {
"city": "string",
"date": "string"
},
"output_schema": {
"city": "string",
"date": "string",
"weather": "string",
"temperature": "string",
"suggestion": "string"
}
}
这个 Skill 的关键不只是能查天气,而是它告诉 Agent:
- 它叫什么;
- 它能做什么;
- 它需要什么参数;
- 它会返回什么;
- 它适合什么场景。
这样 Agent 才更容易正确调用它。
6. 为什么不能把所有能力都写进 Prompt?
很多初学者会尝试用一个很长的 Prompt 解决所有问题。
比如在 Prompt 里写:
如果用户问天气,你就回答天气。
如果用户问新闻,你就搜索新闻。
如果用户问代码,你就写代码。
如果用户问文件,你就读取文件。
这种方式在 Demo 里可能看起来可行,但在真实系统中会有很多问题。
6.1 Prompt 难以管理复杂能力
当任务越来越复杂,Prompt 会变得越来越长。
规则越多,模型越容易混乱。
6.2 Prompt 不能真正访问外部系统
Prompt 只能告诉模型“应该做什么”,但不能让模型真正查询数据库、调用 API 或读取文件。
真正的执行能力还是要靠 Skills。
6.3 Prompt 缺少强约束
Prompt 是软约束,模型可能遵守,也可能不遵守。
而 Skill 的参数校验、权限控制、异常处理是硬约束,更适合工程系统。
6.4 Prompt 不方便测试和复用
一个 Skill 可以单独测试:
输入参数是否正确?
返回结果是否稳定?
异常情况是否能处理?
耗时是否可接受?
但一个大 Prompt 很难做到细粒度测试。
所以,Prompt 可以指导 Agent 思考,但 Skills 才是 Agent 真正执行任务的基础。
7. 一个简单的 Skill 调用流程
一个 Agent 调用 Skill 的过程通常可以抽象成:
用户提出任务
↓
Agent 理解意图
↓
判断是否需要调用 Skill
↓
选择合适的 Skill
↓
生成 Skill 输入参数
↓
参数校验
↓
执行 Skill
↓
返回结构化结果
↓
Agent 基于结果生成最终回答
例如用户问:
明天上海会下雨吗?我需要带伞吗?
Agent 的处理流程可以是:
1. 判断这是天气相关问题;
2. 选择 weather_query Skill;
3. 提取参数:city=上海,date=明天;
4. 调用天气查询接口;
5. 获取天气结果;
6. 判断是否需要带伞;
7. 用自然语言回答用户。
这里真正查询天气的是 Skill,而不是模型自己猜。
8. 常见的 Skill 设计错误
8.1 Skill 名称太模糊
错误示例:
do_task
process
helper
query
这些名称太抽象,Agent 很难判断什么时候应该调用。
更好的名称:
web_search
weather_query
database_lookup
pdf_parser
email_sender
knowledge_retrieval
8.2 Description 写得太简单
错误示例:
这个工具用于搜索。
更好的写法:
当用户询问最新信息、新闻、价格、政策、产品版本、实时数据等内容时,使用该 Skill 搜索互联网信息。若用户只是要求改写、翻译或总结已提供文本,不应调用该 Skill。
好的 description 应该同时说明:
- 这个 Skill 能做什么;
- 适合什么场景;
- 不适合什么场景;
- 输入参数有什么要求;
- 返回结果是什么。
8.3 输入参数没有约束
错误示例:
{
"input": "string"
}
这会让所有信息都塞进一个字段里,后续很难校验。
更好的设计:
{
"query": "string",
"time_range": "string",
"max_results": "number"
}
结构化参数能让 Skill 更稳定,也更容易调试。
8.4 返回结果不可解析
错误示例:
查到了,结果还不错。
这种返回对 Agent 没有太大帮助。
更好的返回:
{
"status": "success",
"results": [
{
"title": "示例标题",
"summary": "示例摘要",
"source": "来源",
"published_at": "发布时间"
}
]
}
结构化输出可以让 Agent 更容易继续处理结果。
8.5 没有异常处理
真实系统中,Skill 经常会失败:
- 参数缺失;
- 网络超时;
- API 报错;
- 查询结果为空;
- 权限不足;
- 返回格式异常。
如果 Skill 没有异常处理,Agent 就可能继续基于错误结果生成回答。
一个更好的 Skill 应该返回明确状态:
{
"status": "failed",
"error_type": "timeout",
"message": "天气服务请求超时,请稍后重试。"
}
9. 学习 Agent Skills 应该关注什么?
如果是为了学习和面试,不建议一开始就陷入某个具体框架。
更建议先掌握这些通用能力:
-
Skill 抽象能力
能不能把一个复杂任务拆成几个清晰的能力单元。 -
输入输出设计能力
能不能设计清楚参数、返回值和结构化结果。 -
边界划分能力
能不能说明一个 Skill 做什么、不做什么。 -
异常处理能力
能不能处理失败、空结果、超时和错误参数。 -
Agent 调用控制能力
能不能降低乱调、漏调和误调工具的问题。 -
工程化能力
能不能做日志、监控、权限、评估和版本管理。
这些能力比单纯会用某个框架更重要。
框架会变,但这些设计思想不会很快过时。
10. 面试中怎么解释 Agent Skills?
如果面试官问:
你怎么理解 Agent Skills?
可以这样回答:
我理解的 Skill 是 Agent 可以调用的能力单元。它不是简单的函数,而是一个面向任务封装的模块,通常包括名称、描述、输入参数、输出格式、执行逻辑、异常处理和调用边界。
在 Agent 系统中,大模型主要负责理解用户意图、规划任务和选择能力;Skill 负责真正执行具体动作,比如搜索、查库、读文件、调用 API 等。
一个 Agent 是否稳定,很大程度上取决于 Skill 是否设计清楚。比如 description 是否明确、参数 schema 是否规范、返回结果是否结构化、失败时是否有兜底机制。这些都会影响 Agent 是否能正确调用工具,以及最终任务能不能完成。
如果想回答得更工程化,可以补充:
在工程实现中,我会把 Skills 注册到 Skill Registry 中,通过 Skill Router 根据任务类型选择候选 Skill。每个 Skill 都有输入校验、异常处理、调用日志和结果结构化返回。这样可以提升 Agent 的可控性、可观测性和可维护性。
11. 小结
Agent Skills 是 Agent 开发中非常核心的概念。
它解决的不是“模型会不会回答”的问题,而是“模型能不能调用合适的能力完成任务”的问题。
可以用一句话总结:
Prompt 决定 Agent 怎么思考,Skills 决定 Agent 能做什么。
一个优秀的 Agent 系统,不应该只依赖大模型自由发挥,而应该把外部能力拆成清晰、可控、可复用的 Skills。
学习 Agent Skills,重点不是记住某个框架的 API,而是理解这些问题:
- Skill 是什么?
- Skill 和 Tool 有什么区别?
- Skill 为什么能扩展 Agent 能力?
- Skill 应该怎么设计输入输出?
- Skill 怎么控制边界?
- Skill 调用失败怎么办?
- Skill 怎么工程化管理?
理解了这些,再去学习 LangChain、Dify、MCP、OpenAI Agents SDK 或其他 Agent 框架,就会更容易抓住本质。
下一篇预告
下一篇可以继续讨论:
Skill、Tool、Function、Workflow、Agent 有什么区别?
这一篇会重点解释 Agent 开发中最容易混淆的几个概念,并通过具体例子说明它们在工程系统中的不同定位。
更多推荐



所有评论(0)