前言
最近在想一件事情,为什么在深入使用 AI Coding 这么长时间后,我还是不能把脑海里的产品给快速落地,哪怕只是一个雏形?
我想了想,行动力是一个主要的因素,那为什么我行动力不够快?
跟之前自己古法编程相比,如果拿出我白天工作的精力 + AI 来开发应用,还是比之前要快速得多,核心原因是因为我疲惫,精力在工作日被“严重消耗”,所以我需要用剩余时间进行充电回血,来保证第二天的精力。
那么这个问题就转化成了:如何在睡眠时间让 AI 继续消耗 token 帮我干活,实现自动化执行?
In loop / Agent loop V.S. Out of loop
回到标题,我这里提到了一个新的术语:Jobs。
相信现在经常使用 AI 开发的朋友们对 Skill 已经不陌生了,Skill 已经把各个工作流、工程师多年的经验等抽象成了几个 Markdown 文件,而且现在已基本形成生态,有了 Skills 市场,开发者如果遇到不熟悉的领域可以通过 Skill 来保证下限。
而 Skills 的触发方式无非就两种:
- Agent 决策调用(被动)
- 人工通过
/slash命令触发(主动)
这里有个问题:不够【自动化】。
你可能会有疑问:什么?Agent 不是可以智能触发 Skills 吗,怎么不够自动化了?
这里我们就要明确一下 In loop 或者说 Agent Loop 和 Out of loop 的区别:
虽然 Agent 可以随着上下文动态调用相关 Skill,但是生命周期终究没有逃过这个 Agent Loop,无论是长程任务还是一个简单任务,一旦 Loop 结束就没有再执行的可能。
所以要想实现自动化,那一定得跳出这个循环,向外求,Jobs 就是解决这个问题的方案,简单来说就是定时任务,但更重要的是,它是一个 Out of loop 的东西。
回到前面说的:我想 AI 在我睡眠回血的这段时间帮我开发应用,翻译成伪代码那就是:
我需要你每到 0 点就开始完成 xxx 项目的 TODO
这样我可以在白天灵光一现的时候记录 TODO,第二天早上醒来这个功能就被自动实现了。不依赖任何 Agent Loop 的执行,而是一个系统级的定时任务,到时间就会被唤起,按照你期望的方式有条不紊的进行!所以,我认为:
定时任务是实现自动化、自主进化的一个重要方式。
Jobs 定义
这里我对 Jobs 进行了简单的定义,大概格式和 Skills 类似:
---
name: <job-name>
cron: <cron-style-date>
condition: <Jobs 执行条件>
allowedSkills: [skill-1, skill-2]
---
大致流程图如下:
flowchart TD
A[开始] --> B[大模型加载Condition配置]
B --> C{当前时间是否符合Cron频率?}
C -->|否| D[等待下一个Cron周期]
D --> C
C -->|是| E{是否满足Condition条件?}
E -->|否| D
E -->|是| F[自动触发对应Action]
F --> G[执行结果反馈]
G --> D
ShowCase
始终执行
---
name: npm-global-dependencies-update
cron: 0 9 * * 1 # 每周一上午九点
---
执行 npm update -g 来更新全局依赖版本
条件执行
---
name: Claude-News-Collect
cron: 0 10 * * * # 每天
condition: ./scripts/is-claude-updated # 脚本负责返回 boolean 值
allowedSkills: [write-to-blog]
---
将 Claude 的新的更新进行总结,并通过 `write-to-blog` skill 记录到个人 Blog
生态
Jobs 不止可以游离在 Agent Loop 之外,还可以通过组合各种 skills 来实现具体的 Actions。Jobs 当然也可以和 Skill 一样,作为一个共享的产物,通过建立 Jobs Market 可以让任何需要相似工作流的人进行安装复用,从而形成生态。