如何实现Agent长时间执行任务(一):Zhukong Skill,Ralph Loop与oh-my-codex
zhukong-skill
如何让Agent能持续长时间的运行,是我从去年11月份到现在一直在探索的方向。
为了将自己从繁琐的验收工作中解放出来,我尝试了各种方法,最初始解决方案是:zhukong-skill
其设计哲学非常简单:开发者打开codex,codex当前的会话对话角色为“主控”,开发者提功能实现需求、执行路线以及验收条件,主控会调度subagent去执行,并根据subagent的执行结果进行验收,如果符合验收条件则最终汇报给开发者,如不符合验收条件,则会继续让subagent进行返工,直至完成为止。
为了防止整个subagent实现功能的过程变成一个黑盒,我写了gxd-subagent-shim,将每一步,每一轮subagent与主控的决策记录了下来,方便人工快速review,了解整个实现过程。
最终,我将上述的工作流封装成了一个skill:zhukong-skill。
只要你在prompt中提到“使用主控模式”,该skill会自动触发。
zhukong的不足
就像我之前在bilibili视频里提到过的,很多探索、研究类的任务,不适合让主控来完成,因为你无法预设一个明确的执行路线与验收标准,此时的human-in-loop是不可避免的,需要开发者在AI的辅助下,不断地与AI进行“对线”,才能完成任务,并且在此过程中获得知识面的提升。
此外,该skill的效果非常依赖于模型本身,以我个人经验,codex搭配该skill可以发挥最大效果,而其它cli/模型则略逊一筹。(即使是我吹爆的codex,偶尔也会偷偷“降智”,提前反馈任务失败。)
ralph loop
其实,在我探索出来“主控模式”之前,也曾尝试过ralph loop的设计思想,即通过claude code的hook功能,在agent返回prompt之后继续向claude code发出类似于“继续”的固定prompt,但效果并不理想。
与zhukong-skill面临的问题一样,如果你在prompt里没有明确的执行路线与明确的验收标准的话,最终得到的只是一坨看起来似乎还不错的垃圾。
整个过程可以生动、形象比喻为:你坐着一个无人驾驶的汽车,但汽车的自动寻路功能很差,如果你只是不断地重复“去xxx”,汽车可能会在原地打转,或者开到一个完全错误的地方。
zhukong-skill结合ralph loop
直到我在通过Pro模型去优化代码架构时,我突然灵机一动,将zhukong-skill与ralph loop结合起来,具体的工作流如下:
1、新开一个codex对话,讲清楚整个长任务的背景、目标、工作流,其中最好明确告诉它,进行的是多轮迭代任务,当前是第X轮。
2、分析出codex给了回复之后,要让它怎么做,是要进入下一轮迭代,还是对当前结果进行返工,将这部分的prompt固定下来。
3、手工跑通一遍,确保流程没问题,并且将下一步的prompt固定下来(next_prompt)后,就可以进入到“自动化”阶段了。
4、自动化阶段,可以通过以下一句话shell来进行迭代
1 | next_prompt="xxx" for i in {1...100}; do echo "当前是第$i轮"; codex --dangerously-bypass-approvals-and-sandbox exec resume <session_id> "$next_prompt"; sleep 10; done |
通过一个简单的shell循环,就可以实现持续让AI Agent不断迭代干同一件事情。
为什么需要使用“主控模式”?
很多情况下,这种长时间运行的持续性迭代任务我都会安排在睡觉前,如果不通过“主控模式”将整个迭代的决策、运行命令、模型如何思考等这些要素记录下来,第二天验收的时候会很痛苦,相当于整个过程完全被“黑盒化”了。
oh-my-codex
这种简陋的方式我使用了很久,直到我发现了oh-my-codex项目。
它自带$ralph功能:持续做某件事情,直到完成为止;同时也自带$ralplan功能:持续做计划、优化,直到所有的角色通过为止。
于是乎,在安装了oh-my-codex后,日常的zhukong-skill与ralph loop的结合体就变成了:$ralph 请你使用主控模式完成xxx功能,要求:1,yyy;2;zzz;3...,保持task_id不变,每一次新请求/返工都是一个step。
oh-my-codex优点
自带各种状态管理、内部的plan文档、wiki文档等,有记忆功能。
oh-my-codex不足
1、项目是强依赖于tmux,我在mac下自带的terminal里执行时,很多的hook都会报错
2、会侵入式地修改codex的system prompt,可能会导致一些意想不到的问题
3、记忆系统有时会捣乱,明明我已经prompt让它提交代码,但它依然不遵守指令,而是返回当前项目情况。