AI 深度技能之-Prompt 提示词优化(三)- 进化Agent Skills

8 阅读6分钟

从 Prompt 转向 Agent Skills,本质上是从“手写指令”进化到“模块化能力封装”。这不仅是一次技术升级,更是一种开发范式的转变:让你从为每个任务编写一次性提示词,转变为构建可复用、可组合、可进化的 AI 能力单元。

下面我会从动机、核心差异、迁移步骤、实战案例、常见挑战五个方面,帮你系统性地完成这个转变。


一、为什么要从 Prompt 转向 Agent Skills?

问题Prompt 方式Agent Skills 方式
复用性每次新任务都要重写或复制粘贴 Prompt一次编写,多次调用
稳定性结果随模型版本、温度参数波动大工作流固化,输出更一致
复杂性长 Prompt 容易超出上下文、逻辑混乱分步骤封装,底层细节隐藏
可调试难以定位是哪段指令导致错误可单独测试每个 Skill
组合能力多任务需人工串联Skills 可被 Agent 自主编排调用

一句话:当你需要重复执行类似任务、或者任务涉及多步骤逻辑时,Agent Skills 是必经之路。


二、核心差异:Prompt vs Agent Skills

维度PromptAgent Skills
形态文本字符串结构化目录 + SKILL.md + 可选脚本/资源
执行方式每次调用时完整送入 LLMAgent 根据意图按需加载
上下文占用每次请求都占用大量 token渐进式披露,仅加载所需部分
确定性动作只能描述,无法精确执行可调用脚本、API、本地命令
状态管理无,每次独立可在 Skill 内部维护状态
开发门槛低,会写自然语言即可中等,需理解目录结构及工具调用

关键认知转变:Prompt 是“教 LLM 怎么做”,Agent Skills 是“给 LLM 配一套专业工具+说明书”。


三、迁移四步法:从 Prompt 到 Agent Skills

第 1 步:盘点现有 Prompt,识别可封装单元

把你日常使用的 Prompt 拿出来,按以下标准判断是否适合封装为 Skill:

  • 重复频率高:每周用超过 3 次
  • 步骤明确:有清晰的输入→处理→输出流程
  • 需要确定性操作:如文件读写、API 调用、数据库查询
  • 跨模型稳定性要求高:不希望因模型变化而波动

示例:一个用于“总结周报并发送邮件”的 Prompt → 适合封装。

第 2 步:设计 Skill 的输入/输出契约

每个 Skill 应明确:

  • 输入:用户需提供什么信息?(如:周报原始数据文件)
  • 输出:返回什么格式的结果?(如:邮件正文 + 发送状态)
  • 依赖:需要哪些外部工具/API?(如:邮件服务器、LLM 模型)

第 3 步:编写 SKILL.md,将 Prompt 结构化

原始 Prompt(仅示例):

你是一个周报助手。请根据以下数据生成一份周报,然后发送给老板@example.com。周报要包含:完成事项、下周计划、风险点。数据:...

转变为 Skill 的 SKILL.md

---
name: weekly-report-mailer
description: 根据提供的原始数据生成周报,并通过邮件发送给指定收件人。
---

# 周报生成与发送流程

## 输入要求
用户需提供:
- 原始数据(可为文本、表格或文件路径)
- 收件人邮箱(可选,默认老板@example.com)

## 执行步骤

1. **数据解析**:读取用户提供的数据,提取以下字段:
   - 完成事项(本周主要产出)
   - 下周计划(最多3项)
   - 风险点(如有,列出并标注等级)

2. **周报生成**:使用以下模板生成邮件正文:

主题:周报 - {当前日期}

各位好,

以下是本周工作摘要: 完成事项: {列表}

下周计划: {列表}

风险点: {列表}

祝好, AI周报助手


3. **发送邮件**:调用 `scripts/send_mail.py` 脚本,参数:
- 收件人: {提取的邮箱}
- 主题: 周报 - {日期}
- 正文: {上一步生成的文本}
- 附件: 可选,用户提供的原始数据文件

4. **返回结果**:告知用户邮件发送成功或失败。

## 注意
- 若数据中缺少某项,则对应部分写“无”。
- 发送前**必须**请求用户确认收件人和正文。

第 4 步:添加脚本与资源(如果需要确定性执行)

对于邮件发送这类需要确定性操作的任务,不能只靠 LLM 描述,要编写真实脚本。

scripts/send_mail.py 示例:

import smtplib
import sys
from email.message import EmailMessage

def send_mail(to, subject, body, attachment_path=None):
    msg = EmailMessage()
    msg.set_content(body)
    msg['Subject'] = subject
    msg['To'] = to
    # ... 配置 SMTP
    with smtplib.SMTP('smtp.example.com', 587) as server:
        server.starttls()
        server.login('user', 'pass')
        server.send_message(msg)
    return True

if __name__ == "__main__":
    # 从命令行参数接收
    to = sys.argv[1]
    subject = sys.argv[2]
    body = sys.argv[3]
    send_mail(to, subject, body)

然后在 SKILL.md 中通过 Bash 工具调用该脚本。


四、实战对比:同一任务两种实现方式

任务:从 PDF 中提取所有表格,转成 CSV 并发送到 Slack。

Prompt 方式(脆弱、一次性)

你是一个 PDF 处理专家。请帮我打开 this_is_a_pdf.pdf,找到里面的所有表格,然后转换成 CSV 格式,最后通过 webhook 发送到 Slack 频道 #data。
  • 问题:LLM 无法直接“打开 PDF”,无法“发送到 Slack”,依赖模型幻觉。

Agent Skills 方式(稳定、可复用)

目录结构

pdf-table-exporter/
├── SKILL.md
├── scripts/
│   ├── extract_tables.py   # 调用 pdfplumber 提取表格
│   └── slack_sender.py     # 通过 webhook 发送
└── references/
    └── slack_api.md        # webhook 文档供 AI 参考

SKILL.md 核心内容

---
name: pdf-table-exporter
description: 从PDF提取所有表格并发送到Slack。
---

# 执行流程

1. 使用 `scripts/extract_tables.py --input {file_path}` 提取表格,输出到临时 CSV 文件。
2. 读取每个 CSV 文件内容。
3. 调用 `scripts/slack_sender.py --webhook {url} --file {csv_path}` 发送。
4. 清理临时文件,返回发送状态。

用户只需说:“用 pdf-table-exporter 处理这个文件并发送到 #data”,Agent 自动按步骤执行。


五、常见挑战与应对

挑战解决方案
Skill 粒度如何把握?单一职责:一个 Skill 只解决一类问题。若描述超过 500 行,考虑拆分。
旧 Prompt 太多,全部迁移成本高优先迁移高频、关键任务;低频任务可保留 Prompt 临时调用。
AI 自动调用 Skill 的准确率不高description 中明确触发词;使用 allowed-tools 限制权限,防止误用。
Skill 执行失败如何回滚?设计幂等操作;在 Skill 内加入状态检查和确认步骤(人机回环)。
跨平台 Skill 格式不统一目前主流是 Anthropic 的 SKILL.md 规范,已被 OpenClaw、Cursor、Copilot 等支持。尽量遵循该标准。

六、总结:从 Prompt 到 Skills 的思维迁移

旧思维新思维
“写一段话让 AI 理解”“设计一个可执行的能力模块”
依赖模型自身的“聪明程度”依赖明确的流程和脚本
每个任务从零开始组合现有 Skills 解决新问题
输出质量不可控通过脚本固化确定性部分,LLM 仅负责意图识别和生成
难以调试可单独测试每个 Skill 和脚本

建议:从你最头疼的、反复写 Prompt 的任务开始,把它改造成第一个 Skill。尝到“一次编写,终身使用”的甜头后,你自然会主动将更多 Prompt 迁移到 Skills 体系。