Codex /goal 使用的一个踩坑经验

首先 /goal 真的很好用, 下班之前设置一个 goal 之后就和朋友们出去 happy,第二天早上起来验收成果,爽YY。

问题描述 :exclamation_question_mark:

但是随着使用 goal 这个功能,我发了一个小坑:如果先让 codex 做某件事, 比如我们的操作序列是:

  • 告诉 codex "先下载所有的金融数据到临时目录下,再开始实现这个 spec plan”
  • 然后再设置 goal: “/goal 实现 spec plan new-feature-plan.md 中的所有子任务”

那么坑就来了:在经过 context compaction 之后 codex 有可能会再次去执行 “下载所有的金融数据到临时目录下”!
并且因为 goal 一般会执行很长时间,中间必定会经过很多次的 context compaction,所以这个下载操作会执行很多次 :joy:

这是因为 codex 的 context compaction 之后一定会把最后一个 user message 保留下来。所以经过 context compaction 之后,gpt 会傻傻地继续执行 last user message 中的意图,殊不知道 goal 已经驱动整个任务往前了一大截,last user message 中的意图早就完成了。

解决方法 :white_check_mark:

在 codex 本身有更好的办法解决这个问题之前 ,我的做法是:

原来的操作序列是:

  • 告诉 codex "先下载所有的金融数据到临时目录下,再开始实现这个 spec plan”
  • 然后再设置goal “/goal 实现 spec plan new-feature-plan.md 中的所有子任务”

修正之后的操作序列:

  • 告诉 codex "先下载所有的金融数据到临时目录下,再开始实现这个 spec plan”
  • 告诉 codex “实现 spec plan new-feature-plan.md 中的所有子任务”。也就是把 goal 中的提示词不带 “/goal”,直接发给 codex。 这是解决这个坑的关键步骤,目的是覆盖 last user message。
  • 然后再设置 goal “/goal 实现 spec plan new-feature-plan.md 中的所有子任务”

这样经过 context compaction 之后,codex 看到的 last user message 和 goal 是一致的,就能解决这个问题。

31 个赞

:joy: 这下终于理解为什么之前看到有位佬的设计,在 /goal 之前需要说hi

6 个赞

完了我是不是变蠢了,反复看了几次没看懂

1 个赞

没理解错的话,题主的意思是在设置goal命令前,最后一条命令目的是实现你的任务,而不是做构建任务的准备工作,因为压缩上下文后会重新读取最近的一条指令,这样gpt就会被误导,再次做一遍准备工作。

5 个赞

学到了,昨晚goal指定整理下文档然后实现,结果每轮都先整理文档 :smiling_face_with_tear:

2 个赞

看起来像是 codex 的默认策略是:
“用户使用 goal 时,自动把上一条用户消息也注入到 goal 上下文”

2 个赞

还没有体验过,额度消耗是消耗的五小时限额的额度吗,

1 个赞

是的 codex这里设计的很有毛病。如果跑goal的中途 发消息引导他的对话 他后续每次都会提到这个东西

1 个赞

goal命令现在看起来更像是一个官方hook,codex每次停下来的时候发送goal提示词,经过多轮压缩可能会导致发送中途你引用插入的对话和goal之前的最后一条对话,然后goal就跑歪了 开始干一些莫名其妙的操作,为了保持上下文干净并且不跑偏,现在我都是吧要做的时候写成task,然后开一个新的会话跑goal :distorted_face:

3 个赞