深入浅出:STEERING、MCP、SKILLS、Agent Hooks 与 SPECS——AI Agent 开发的五大核心范式
最近在构建一系列AI Agent 系统的过程中,我频繁接触到几个核心概念:STEERING、MCP、SKILLS、Agent Hooks 和 SPECS。它们分别代表了 Agent 开发中不同维度的设计思想。
但在学习过程中我发现一个常见困惑:这些概念到底对应什么文件?代码写在哪?是配置还是代码? 今天这篇文章,我尝试从“落地”的角度,把这五个概念讲清楚。
写在前面:为什么需要这些概念?
在 AI Agent 从概念验证走向生产落地的过程中,我逐渐意识到一个问题:单纯的 Prompt 工程已经无法支撑复杂业务场景。
你需要:
- 让 Agent 知道该做什么、不该做什么
- 让 Agent 能调用各种外部工具
- 让 Agent 能完成复杂的多步骤任务
- 让 Agent 的行为可观测、可干预
- 让团队能协作开发、规范测试
这五个概念,正是从不同角度回答了同一个问题:如何让 Agent 既强大又可靠?
先看一张图:这五个概念在项目里长什么样?
my-agent-project/
├── .cursor/
│ └── mcp.json # 👈 MCP 配置:告诉编辑器有哪些工具可用
├── specs/
│ └── agent.spec.yaml # 👈 SPECS:Agent 的“产品需求文档”
├── skills/
│ └── customer_onboarding.skill.ts # 👈 SKILL:Agent 的“能力模块”
├── hooks/
│ └── auth_hooks.ts # 👈 Agent Hooks:运行时“拦截器”
├── steering/
│ └── default.yaml # 👈 STEERING:行为控制的“方向盘”
└── src/
└── agent_runtime.py # 👈 运行时框架,读取所有配置并运行
简单来说:
- SPECS、SKILL、MCP 配置 → 你在编辑器里写的代码/配置文件
- STEERING、Agent Hooks → Agent 运行时执行的动态逻辑
一、SPECS:Agent 的“产品需求文档”
SPECS 是一个 YAML/JSON 文件,用来定义 Agent 的“接口契约”。你可以把它理解为 Agent 的产品需求文档——只不过它是机器可读的。
代码写在哪?
# specs/agent.spec.yaml
agent:
name: "客服助手"
version: "1.0.0"
# 定义 Agent 有什么能力
capabilities:
- name: "创建工单"
input: ["问题描述", "用户ID"]
output: ["工单号"]
# 定义用户说什么话时触发什么能力
intents:
- examples: ["系统报错了", "有bug", "功能不能用"]
handler: "创建工单"
# 定义对话流程
conversation_flows:
- name: "报bug流程"
steps:
- 问: "请描述您遇到的问题"
- 等用户回答
- 调用: "创建工单"
- 回复: "工单已创建,编号是{工单号}"
谁在用?
| 角色 | 怎么用 |
|---|---|
| 产品经理 | 写 SPECS,定义 Agent 应该做什么 |
| 工程师 | 按 SPECS 实现代码 |
| QA | 按 SPECS 写测试用例 |
| AI 编辑器 | 读取 SPECS,提供代码补全 |
关键价值
SPECS 让 Agent 开发从“黑盒”变成“白盒”。有了 SPECS,你可以:
- 版本管理(v1.0 → v2.0)
- 自动生成测试
- 多人协作不打架
二、MCP(Model Context Protocol):Agent 的“USB 接口”
MCP 是 Anthropic 提出的一个标准化协议,用来连接 AI 模型与外部工具、数据源。你可以把它理解为 Agent 世界的 USB 接口——任何符合 MCP 协议的工具都可以即插即用。
代码写在哪?
MCP 分为两部分:配置 和 实现。
配置(告诉系统有哪些工具可用):
// .cursor/mcp.json 或项目根目录的 mcp.json
{
"mcpServers": {
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/workspace"]
},
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_TOKEN": "your_token"
}
}
}
}
在哪用?
- 在编辑器中:Cursor/VS Code 读取 mcp.json,让你在聊天时就能调用工具
- 在 Agent 运行时:Agent 框架通过 MCP Client 连接这些 Server,调用工具
关键价值
MCP 解决了“工具碎片化”问题。过去,每个 Agent 框架都要为每个工具写适配代码;现在,只要工具遵循 MCP 协议,就能被任何支持 MCP 的 Agent 使用。
三、SKILLS:Agent 的“能力模块”
SKILLS 是一个可复用的能力单元。如果说 MCP 定义了“如何调用一个工具”,那 SKILLS 定义了“如何用一组工具完成一个任务”。
比如:“新客户注册”这个 SKILLS,可能需要:
- 调用“获取用户信息”工具
- 调用“验证邮箱”工具
- 调用“创建 CRM 账号”工具
- 调用“发送欢迎邮件”工具
代码写在哪?
// skills/customer_onboarding.skill.ts
export const customerOnboardingSkill: Skill = {
name: "新客户引导",
description: "处理新客户注册流程",
// 什么情况下触发这个 SKILL
triggers: [
{ keywords: ["新客户", "注册", "开通账号"] }
],
// 具体的执行步骤(你写的代码)
workflow: async (context) => {
// 步骤1:收集信息
const userInfo = await askUser([
"姓名", "公司", "邮箱"
]);
// 步骤2:验证邮箱
const isValid = await callMCPTool("verify_email", {
email: userInfo.email
});
if (!isValid) {
return { error: "邮箱无效" };
}
// 步骤3:创建账号
const account = await callAPI("/api/crm/create", userInfo);
// 步骤4:发送欢迎邮件
await callMCPTool("send_email", {
to: userInfo.email,
template: "welcome"
});
return { success: true, accountId: account.id };
}
};
SKILLS vs 普通 Prompt
| 维度 | 普通 Prompt | SKILLS |
|---|---|---|
| 写法 | 自然语言描述 | 代码实现 |
| 确定性 | 依赖模型理解 | 明确的执行流程 |
| 可测试性 | 难以测试 | 可以单元测试 |
| 复用 | 每次重新写 | 一次定义,到处用 |
关键价值
SKILLS 把“复杂任务”变成“可复用的积木”。你可以像搭积木一样组合 SKILLS,构建更强大的 Agent。
四、STEERING:控制 Agent 的“方向盘”
STEERING 是 Agent 的运行时行为控制机制。它不是写在文件里的静态配置,而是 Agent 在运行时根据上下文动态调整的策略。
代码写在哪?
STEERING 通常有两部分:静态配置(默认行为)和 动态逻辑(运行时调整)。
静态配置:
# steering/default.yaml
steering:
goal: "帮助用户完成客户信息录入"
boundaries:
# Agent 不能做的事
disallowed: ["删除数据", "修改历史"]
# Agent 只能用这些 API
allowed_apis: ["crm_query", "customer_create"]
preferences:
tone: "专业且友好"
priority: "准确性 > 速度"
动态逻辑(运行时):
# src/steering_logic.py
class SteeringController:
def __init__(self, config):
self.config = config
async def get_steering(self, context):
# 根据用户类型动态调整
if context.user_type == "vip":
return {
"priority": "速度优先", # VIP 用户要快
"tone": "亲切"
}
else:
return {
"priority": "准确性优先", # 普通用户要准确
"tone": "专业"
}
关键价值
没有 STEERING 的 Agent 就像没有方向盘的汽车——它能跑,但你可能不知道它会跑去哪里。STEERING 让你在运行时对 Agent 保持控制。
五、Agent Hooks:Agent 的“生命周期拦截器”
Agent Hooks 是在 Agent 执行生命周期的关键节点插入的自定义逻辑。这个概念借鉴了 React Hooks 和 Webhook 的思想。
代码写在哪?
# hooks/auth_hooks.py
# 这个函数会在用户输入进入 Agent 前执行
async def pre_process_hook(input, context):
# 过滤敏感词
input = filter_sensitive_words(input)
# 注入用户信息
context.user_profile = await get_user_profile(context.user_id)
return input
# 这个函数会在调用工具前执行
async def pre_action_hook(action, params, context):
# 权限校验
if not has_permission(context.user, action.name):
raise Exception("没有权限")
return params
# 这个函数会在工具执行后执行
async def post_action_hook(result, action, context):
# 记录日志
await audit_log.write({
"user": context.user_id,
"action": action.name,
"result": result
})
return result
注册 Hooks
# src/agent_runtime.py
agent = Agent(
pre_process_hook=pre_process_hook, # 注册你的钩子函数
pre_action_hook=pre_action_hook,
post_action_hook=post_action_hook
)
生命周期示意图

关键价值
Hooks 让你可以在不修改 Agent 核心代码的情况下,注入业务逻辑。权限、缓存、审计这些横切关注点,都可以通过 Hooks 优雅地实现。
六、一张图总结:这五个概念的关系

七、总结:一句话记住每个概念
| 概念 | 一句话总结 | 在项目里的样子 |
|---|---|---|
| SPECS | Agent 的产品需求文档 | specs/agent.spec.yaml |
| STEERING | Agent 的方向盘(运行时控制) | steering/*.yaml + 动态逻辑 |
| SKILLS | 可复用的能力积木 | skills/*.skill.ts 代码文件 |
| Agent Hooks | 生命周期的拦截器 | hooks/*.py 回调函数 |
| MCP | Agent 的 USB 接口 | mcp.json 配置 + Server 实现 |
写在最后
这五个概念不是孤立的,它们共同构成了企业级 Agent 开发的工程化基础。
如果你是刚接触 Agent 开发,建议在你的开发工具上按这个顺序上手:
- 先用 MCP 连接几个工具,感受 Agent 如何调用外部能力
- 再写一个简单的 SKILLS,体验如何组合工具完成任务
- 然后用 STEERING 控制 Agent 的行为边界
- 接着用 Hooks 添加日志、权限等横切关注点
- 最后用 SPECS 规范整个项目,让团队可以协作开发
希望这篇文章能帮你理清这五个概念,并在实际项目中用起来。欢迎在评论区分享你的实践经验和困惑!
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)