技能链与自动化工作流:构建 AI 流水线

到现在为止,我们的 Skill 都是“单次触发”的:用户提问 -> 调用 Skill -> 返回结果。

但在现实世界中,解决一个问题往往需要多个步骤。例如“修复 CI 报错”可能包含:查看日志 -> 分析错误 -> 修改代码 -> 提交 -> 重新运行。

本章将介绍 技能链(Skill Chaining) 的概念,教你如何设计能够协同工作的 Skill 组合,构建强大的自动化工作流。

1. 什么是技能链 (Skill Chaining)?

Q: AI 能不能自己连续调用好几个 Skill?还是说我得一次次下命令?

A: 现代 AI 模型(特别是像 Claude 3.5 Sonnet 这样强大的模型)具备 Chain of Thought (思维链) 能力。

当你提供了一组工具(Skills)后,AI 会根据任务目标,自动规划执行路径。

示例场景:用户说“帮我把这个功能上线”。
AI 的思考过程

  1. 我需要先检查代码风格 -> 调用 lint-checker
  2. 如果有错误 -> 调用 auto-fixer
  3. 代码没问题了 -> 调用 git-commit-assistant
  4. 最后推送到远程 -> 调用 git-push

这一系列连续的调用就是技能链。作为开发者,你不需要编写“链条”本身的逻辑,你只需要提供环节(Skills),并让 AI 知道它们之间如何配合。


2. 实战:构建 CI/CD 故障诊断工作流

Q: 我们来做一个复杂的例子,自动诊断 CI 失败的原因。

A: 我们需要拆解任务,创建(或复用)三个独立的 Skill。

Skill 1: ci-log-fetcher (获取日志)

  • 功能:从 CI 系统(如 GitHub Actions)拉取最新的失败日志。
  • Usage: gh run view --log-failed

Skill 2: error-analyzer (错误分析)

  • 功能:提取日志中的关键报错堆栈。
  • Usage: python analyze_log.py "{log_content}"

Skill 3: code-search (代码定位)

  • 功能:根据报错信息搜索相关代码文件。
  • Usage: grep -r "{error_keyword}" .

工作流演示

  1. 用户:“CI 又挂了,帮我看看。”
  2. AI
    • (调用 ci-log-fetcher) -> 获得 500行日志。
    • (思考) 日志太长,我需要分析关键错误。
    • (调用 error-analyzer) -> 发现 "NullPointerException in user_service.py line 42"。
    • (思考) 我需要看看那行代码是什么。
    • (调用 code-search 或直接读取文件) -> 读取 user_service.py
    • 最终回复:“CI 失败是因为 user_service.py 第42行空指针,建议加一个非空判断。”

3. 设计原则:原子化与正交性

Q: 我是该写一个超级大的 fix-everything Skill,还是写很多小 Skill?

A: 绝对是很多小 Skill

遵循 UNIX 哲学

  • **原子化 (Atomic)**:每个 Skill 只做一件事,并且做好。
  • **正交性 (Orthogonal)**:Skill 之间功能不重叠。

为什么?

  • 灵活:小 Skill 可以被 AI 自由组合。log-fetcher 既可以用于修 Bug,也可以用于统计构建时间。
  • 容错:如果大 Skill 中间一步挂了,整个任务就失败了。小 Skill 链条中,AI 可以根据中间结果动态调整策略(比如 Log 没拉到,它可能会尝试另一个命令)。

4. 引导 AI 进行链式调用

Q: 有时候 AI 比较笨,只调用了第一个就停了,怎么办?

A: 你可以通过 System PromptSkill Description 来“暗示”或“强迫”它继续。

技巧 1:在 Description 中引用其他 Skill
ci-log-fetcherSKILL.md 中写道:

“获取日志后,建议立即使用 error-analyzer 技能进行分析,而不是直接展示原始日志。”

技巧 2:在 Output 中包含提示
修改脚本的输出:

print("日志获取成功。建议下一步:分析错误堆栈。")

AI 看到这个输出,更有可能顺着提示往下走。


5. 状态共享与上下文传递

Q: Skill A 的输出怎么传给 Skill B?

A:

  1. 通过对话上下文:Skill A 打印到 stdout -> AI 读取 -> AI 将内容作为参数传给 Skill B。这是最自然的方式。
  2. 通过临时文件
    • Skill A: echo "data" > /tmp/data.json
    • Skill B: 读取 /tmp/data.json
    • 适用场景:数据量非常大(如完整日志),不适合全部塞进对话上下文(Token 限制)。

总结

技能链是 Agent Skills 的终极形态。通过将简单的工具组合起来,我们实际上是在构建一个自治的智能体

  • 原子化设计是基础。
  • AI 的规划能力是核心。
  • 引导与提示是润滑剂。

在下一章,我们将讨论在开发这些复杂系统时不可避免的问题——调试与优化。当你的 Skill 越来越多,如何保证它们准确触发且运行高效?


参考资源:

« 上一篇 上下文感知与文件操作:让 Skill 读懂你的代码 下一篇 » 提示工程与技能调试指南:打造高可用 Skill