最近在构建一系列AI Agent 系统的过程中,我频繁接触到几个核心概念:STEERINGMCPSKILLSAgent HooksSPECS。它们分别代表了 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,可能需要:

  1. 调用“获取用户信息”工具
  2. 调用“验证邮箱”工具
  3. 调用“创建 CRM 账号”工具
  4. 调用“发送欢迎邮件”工具

代码写在哪?

// 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 开发,建议在你的开发工具上按这个顺序上手:

  1. 先用 MCP 连接几个工具,感受 Agent 如何调用外部能力
  2. 再写一个简单的 SKILLS,体验如何组合工具完成任务
  3. 然后用 STEERING 控制 Agent 的行为边界
  4. 接着用 Hooks 添加日志、权限等横切关注点
  5. 最后用 SPECS 规范整个项目,让团队可以协作开发

希望这篇文章能帮你理清这五个概念,并在实际项目中用起来。欢迎在评论区分享你的实践经验和困惑!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐