
文章目录
- [第十九章 Codex 的 Prompt 设计模式](#第十九章 Codex 的 Prompt 设计模式)
- [19.1 Prompt 不需要固定公式](#19.1 Prompt 不需要固定公式)
-
- [19.1.1 一个视觉算法示例](#19.1.1 一个视觉算法示例)
- [19.2 四类实用模式](#19.2 四类实用模式)
- [19.3 一次性任务:把结果和证据说清楚](#19.3 一次性任务:把结果和证据说清楚)
-
- [19.3.1 推荐结构](#19.3.1 推荐结构)
- [19.3.2 目标检测案例](#19.3.2 目标检测案例)
- [19.3.3 分类案例](#19.3.3 分类案例)
- [19.3.4 闭环结构](#19.3.4 闭环结构)
- [19.4 可复用技能:把稳定方法移出临时 Prompt](#19.4 可复用技能:把稳定方法移出临时 Prompt)
-
- [19.4.1 何时值得写成 Skill](#19.4.1 何时值得写成 Skill)
- [19.4.2 视觉数据集质检 Skill](#19.4.2 视觉数据集质检 Skill)
- [19.4.3 调用时仍需提供本次上下文](#19.4.3 调用时仍需提供本次上下文)
- [19.5 定时任务:先验证 Prompt,再交给调度器](#19.5 定时任务:先验证 Prompt,再交给调度器)
-
- [19.5.1 Skill 与 Scheduled Task 的分工](#19.5.1 Skill 与 Scheduled Task 的分工)
- [19.5.2 模型评测周报示例](#19.5.2 模型评测周报示例)
- [19.5.3 运行环境边界](#19.5.3 运行环境边界)
- [19.6 长任务 Playbook:用目标和门槛推进](#19.6 长任务 Playbook:用目标和门槛推进)
-
- [19.6.1 分割模型优化案例](#19.6.1 分割模型优化案例)
- [19.6.2 人工决策点](#19.6.2 人工决策点)
- [19.6.3 状态必须落盘](#19.6.3 状态必须落盘)
- [19.7 脚本和 CI:用 `codex exec` 运行 Prompt](#19.7 脚本和 CI:用
codex exec运行 Prompt) - [19.8 让 Prompt 更可靠的工程原则](#19.8 让 Prompt 更可靠的工程原则)
-
- [19.8.1 结果优先,而非步骤堆砌](#19.8.1 结果优先,而非步骤堆砌)
- [19.8.2 只给相关上下文](#19.8.2 只给相关上下文)
- [19.8.3 把边界写成可执行规则](#19.8.3 把边界写成可执行规则)
- [19.8.4 用证据定义完成](#19.8.4 用证据定义完成)
- [19.8.5 为重复运行设计幂等性](#19.8.5 为重复运行设计幂等性)
- [19.8.6 保持可观测性](#19.8.6 保持可观测性)
- [19.9 常见陷阱](#19.9 常见陷阱)
- [19.10 本章小结](#19.10 本章小结)
- 参考资料
第十九章 Codex 的 Prompt 设计模式
摘要:好的提示(Prompt)不是咒语,而是清楚说明结果、相关上下文、关键边界和完成标准。本章归纳四类实用模式:一次性任务、可复用技能、定时任务和长任务 Playbook,并用目标检测、分类和分割案例说明如何选择。
版本说明:本文依据 2026 年 8 月可查的 OpenAI 官方文档整理。下文的"四类模式"是便于工程实践的归纳,不是 Codex 官方定义的四种产品模式。

19.1 Prompt 不需要固定公式
OpenAI 官方建议先说清想要的结果。简单任务用一句话即可;任务较大或风险较高时,再补充真正有用的部分:
- 目标(Goal):最终要得到什么结果;
- 上下文(Context):哪些文件、错误、数据或资料会影响结果;
- 输出(Output):结果应采用什么格式;
- 边界(Boundaries):什么不能改、不能做或需要先确认;
- 完成标准(Done When):哪些测试、指标或审查可以证明完成。
这些是可选构件,不是每次都要填写的表格。过程本身不重要时,应描述结果并给 Codex 留出调查空间;只有在顺序、风险或合规要求重要时,才固定执行步骤。
#mermaid-svg-OPt3ehUWYG4R2m3D{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-OPt3ehUWYG4R2m3D .error-icon{fill:#552222;}#mermaid-svg-OPt3ehUWYG4R2m3D .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-OPt3ehUWYG4R2m3D .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-OPt3ehUWYG4R2m3D .marker{fill:#333333;stroke:#333333;}#mermaid-svg-OPt3ehUWYG4R2m3D .marker.cross{stroke:#333333;}#mermaid-svg-OPt3ehUWYG4R2m3D svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-OPt3ehUWYG4R2m3D p{margin:0;}#mermaid-svg-OPt3ehUWYG4R2m3D .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster-label text{fill:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster-label span{color:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster-label span p{background-color:transparent;}#mermaid-svg-OPt3ehUWYG4R2m3D .label text,#mermaid-svg-OPt3ehUWYG4R2m3D span{fill:#333;color:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D .node rect,#mermaid-svg-OPt3ehUWYG4R2m3D .node circle,#mermaid-svg-OPt3ehUWYG4R2m3D .node ellipse,#mermaid-svg-OPt3ehUWYG4R2m3D .node polygon,#mermaid-svg-OPt3ehUWYG4R2m3D .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-OPt3ehUWYG4R2m3D .rough-node .label text,#mermaid-svg-OPt3ehUWYG4R2m3D .node .label text,#mermaid-svg-OPt3ehUWYG4R2m3D .image-shape .label,#mermaid-svg-OPt3ehUWYG4R2m3D .icon-shape .label{text-anchor:middle;}#mermaid-svg-OPt3ehUWYG4R2m3D .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-OPt3ehUWYG4R2m3D .rough-node .label,#mermaid-svg-OPt3ehUWYG4R2m3D .node .label,#mermaid-svg-OPt3ehUWYG4R2m3D .image-shape .label,#mermaid-svg-OPt3ehUWYG4R2m3D .icon-shape .label{text-align:center;}#mermaid-svg-OPt3ehUWYG4R2m3D .node.clickable{cursor:pointer;}#mermaid-svg-OPt3ehUWYG4R2m3D .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-OPt3ehUWYG4R2m3D .arrowheadPath{fill:#333333;}#mermaid-svg-OPt3ehUWYG4R2m3D .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-OPt3ehUWYG4R2m3D .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-OPt3ehUWYG4R2m3D .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OPt3ehUWYG4R2m3D .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-OPt3ehUWYG4R2m3D .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OPt3ehUWYG4R2m3D .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster text{fill:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D .cluster span{color:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-OPt3ehUWYG4R2m3D .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-OPt3ehUWYG4R2m3D rect.text{fill:none;stroke-width:0;}#mermaid-svg-OPt3ehUWYG4R2m3D .icon-shape,#mermaid-svg-OPt3ehUWYG4R2m3D .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-OPt3ehUWYG4R2m3D .icon-shape p,#mermaid-svg-OPt3ehUWYG4R2m3D .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-OPt3ehUWYG4R2m3D .icon-shape .label rect,#mermaid-svg-OPt3ehUWYG4R2m3D .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-OPt3ehUWYG4R2m3D .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-OPt3ehUWYG4R2m3D .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-OPt3ehUWYG4R2m3D :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-OPt3ehUWYG4R2m3D .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-OPt3ehUWYG4R2m3D .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-OPt3ehUWYG4R2m3D .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-OPt3ehUWYG4R2m3D .test>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-OPt3ehUWYG4R2m3D .test span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-OPt3ehUWYG4R2m3D .test tspan{fill:#14532b!important;} 目标
要得到什么
任务 Prompt
上下文
哪些信息会影响结果
输出
如何交付
边界
什么不能改变
完成标准
如何证明完成
执行、验证与报告
图 19-1:复杂任务的 Prompt 构件。 重点是提供会改变决策的信息,而不是机械堆满五个栏目。

19.1.1 一个视觉算法示例
模糊提示:
text
帮我优化一下 YOLO。
可执行提示:
text
目标:修复 evaluate.py 中 COCO 类别索引偏移,避免预测类别与标注类别错位。
上下文:检查 datasets/coco.yaml、evaluate.py 和 tests/test_category_map.py。
边界:只修改类别映射;保持模型权重、输入尺寸、NMS 阈值和评测集不变。
完成标准:单元测试通过;再用固定的 100 张图片做冒烟评测;报告修改文件、命令、指标和未解决风险。
第二种写法没有规定 Codex 每一条搜索命令,却明确了变量和验收条件。这样既保留推理空间,也减少"顺手重构"或改变实验条件的风险。

19.2 四类实用模式
本文把常见工作归纳为四类。这是使用方式的选择,不代表四种互斥的 Codex 功能。
| 模式 | 适用情况 | 主要载体 |
|---|---|---|
| 一次性任务(Task Prompt) | 边界清楚、完成后即可结束 | 当前聊天中的 Prompt |
| 可复用技能(Skill) | 方法稳定,需要多次复用 | 含 SKILL.md 的 Skill |
| 定时任务(Scheduled Task) | 已验证流程需要按计划重复运行 | ChatGPT 的 Scheduled |
| 长任务(Goal / Playbook) | 多阶段、有门槛、需要持续推进 | /plan、/goal、产物与人工决策 |
#mermaid-svg-cup4EmtOVOKJ1gfK{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-cup4EmtOVOKJ1gfK .error-icon{fill:#552222;}#mermaid-svg-cup4EmtOVOKJ1gfK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-cup4EmtOVOKJ1gfK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-cup4EmtOVOKJ1gfK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-cup4EmtOVOKJ1gfK .marker.cross{stroke:#333333;}#mermaid-svg-cup4EmtOVOKJ1gfK svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-cup4EmtOVOKJ1gfK p{margin:0;}#mermaid-svg-cup4EmtOVOKJ1gfK .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster-label text{fill:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster-label span{color:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster-label span p{background-color:transparent;}#mermaid-svg-cup4EmtOVOKJ1gfK .label text,#mermaid-svg-cup4EmtOVOKJ1gfK span{fill:#333;color:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK .node rect,#mermaid-svg-cup4EmtOVOKJ1gfK .node circle,#mermaid-svg-cup4EmtOVOKJ1gfK .node ellipse,#mermaid-svg-cup4EmtOVOKJ1gfK .node polygon,#mermaid-svg-cup4EmtOVOKJ1gfK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-cup4EmtOVOKJ1gfK .rough-node .label text,#mermaid-svg-cup4EmtOVOKJ1gfK .node .label text,#mermaid-svg-cup4EmtOVOKJ1gfK .image-shape .label,#mermaid-svg-cup4EmtOVOKJ1gfK .icon-shape .label{text-anchor:middle;}#mermaid-svg-cup4EmtOVOKJ1gfK .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-cup4EmtOVOKJ1gfK .rough-node .label,#mermaid-svg-cup4EmtOVOKJ1gfK .node .label,#mermaid-svg-cup4EmtOVOKJ1gfK .image-shape .label,#mermaid-svg-cup4EmtOVOKJ1gfK .icon-shape .label{text-align:center;}#mermaid-svg-cup4EmtOVOKJ1gfK .node.clickable{cursor:pointer;}#mermaid-svg-cup4EmtOVOKJ1gfK .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-cup4EmtOVOKJ1gfK .arrowheadPath{fill:#333333;}#mermaid-svg-cup4EmtOVOKJ1gfK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-cup4EmtOVOKJ1gfK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-cup4EmtOVOKJ1gfK .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cup4EmtOVOKJ1gfK .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-cup4EmtOVOKJ1gfK .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cup4EmtOVOKJ1gfK .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster text{fill:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK .cluster span{color:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-cup4EmtOVOKJ1gfK .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-cup4EmtOVOKJ1gfK rect.text{fill:none;stroke-width:0;}#mermaid-svg-cup4EmtOVOKJ1gfK .icon-shape,#mermaid-svg-cup4EmtOVOKJ1gfK .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-cup4EmtOVOKJ1gfK .icon-shape p,#mermaid-svg-cup4EmtOVOKJ1gfK .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-cup4EmtOVOKJ1gfK .icon-shape .label rect,#mermaid-svg-cup4EmtOVOKJ1gfK .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-cup4EmtOVOKJ1gfK .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-cup4EmtOVOKJ1gfK .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-cup4EmtOVOKJ1gfK :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-cup4EmtOVOKJ1gfK .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-cup4EmtOVOKJ1gfK .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-cup4EmtOVOKJ1gfK .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-cup4EmtOVOKJ1gfK .test>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-cup4EmtOVOKJ1gfK .test span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-cup4EmtOVOKJ1gfK .test tspan{fill:#14532b!important;} 否
否
是
是
否
是
收到工程需求
是否需要重复执行?
是否多阶段或完成条件复杂?
一次性任务
长任务 Playbook
执行时间是否需要自动触发?
可复用技能
先把方法固化为技能
再配置定时任务
图 19-2:模式选择。 一条稳定的定时流程通常同时包含"技能定义方法"和"定时任务定义触发时间"。
19.3 一次性任务:把结果和证据说清楚
一次性任务适合修复 Bug、实现局部功能、解释代码或完成一次评测。它不要求"单轮对话结束",而是要求目标单一、边界明确。
19.3.1 推荐结构
text
目标:要修改或产出什么。
上下文:相关路径、错误、参考实现和环境。
边界:必须保持不变的内容,以及禁止操作。
完成标准:测试、测量、审查条件和交付物。
输出格式只有在影响使用时才需要单独指定,例如"生成 JSON 供下游读取"或"写成一页评测报告"。
19.3.2 目标检测案例
text
修复 src/postprocess.py 中多类别 NMS 的类别偏移问题。
先复现 tests/test_multiclass_nms.py 的失败,再定位根因并做最小修改。
不要修改置信度阈值、IoU 阈值、输入框格式和公开函数签名。
完成后运行目标测试和现有后处理测试;报告根因、修改文件、测试命令及结果。
这段提示把"复现失败"放在修改之前,是因为复现本身就是证据。若测试无法复现,Codex 应先报告环境或前提差异,而不是猜测性改代码。
19.3.3 分类案例
text
检查分类验证集准确率突然下降的问题。
比较当前提交与基线提交的数据预处理、类别顺序和 checkpoint 加载逻辑。
只做诊断,不修改代码;把已确认事实、待验证假设和下一步实验分开报告。
"只做诊断"是关键边界。它防止 Codex 在证据不足时同时修改数据、模型和评测脚本。
19.3.4 闭环结构
#mermaid-svg-9oppO7eaOyIR0i1n{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-9oppO7eaOyIR0i1n .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-9oppO7eaOyIR0i1n .error-icon{fill:#552222;}#mermaid-svg-9oppO7eaOyIR0i1n .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-9oppO7eaOyIR0i1n .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-9oppO7eaOyIR0i1n .marker{fill:#333333;stroke:#333333;}#mermaid-svg-9oppO7eaOyIR0i1n .marker.cross{stroke:#333333;}#mermaid-svg-9oppO7eaOyIR0i1n svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-9oppO7eaOyIR0i1n p{margin:0;}#mermaid-svg-9oppO7eaOyIR0i1n .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-9oppO7eaOyIR0i1n .cluster-label text{fill:#333;}#mermaid-svg-9oppO7eaOyIR0i1n .cluster-label span{color:#333;}#mermaid-svg-9oppO7eaOyIR0i1n .cluster-label span p{background-color:transparent;}#mermaid-svg-9oppO7eaOyIR0i1n .label text,#mermaid-svg-9oppO7eaOyIR0i1n span{fill:#333;color:#333;}#mermaid-svg-9oppO7eaOyIR0i1n .node rect,#mermaid-svg-9oppO7eaOyIR0i1n .node circle,#mermaid-svg-9oppO7eaOyIR0i1n .node ellipse,#mermaid-svg-9oppO7eaOyIR0i1n .node polygon,#mermaid-svg-9oppO7eaOyIR0i1n .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-9oppO7eaOyIR0i1n .rough-node .label text,#mermaid-svg-9oppO7eaOyIR0i1n .node .label text,#mermaid-svg-9oppO7eaOyIR0i1n .image-shape .label,#mermaid-svg-9oppO7eaOyIR0i1n .icon-shape .label{text-anchor:middle;}#mermaid-svg-9oppO7eaOyIR0i1n .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-9oppO7eaOyIR0i1n .rough-node .label,#mermaid-svg-9oppO7eaOyIR0i1n .node .label,#mermaid-svg-9oppO7eaOyIR0i1n .image-shape .label,#mermaid-svg-9oppO7eaOyIR0i1n .icon-shape .label{text-align:center;}#mermaid-svg-9oppO7eaOyIR0i1n .node.clickable{cursor:pointer;}#mermaid-svg-9oppO7eaOyIR0i1n .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-9oppO7eaOyIR0i1n .arrowheadPath{fill:#333333;}#mermaid-svg-9oppO7eaOyIR0i1n .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-9oppO7eaOyIR0i1n .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-9oppO7eaOyIR0i1n .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9oppO7eaOyIR0i1n .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-9oppO7eaOyIR0i1n .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9oppO7eaOyIR0i1n .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-9oppO7eaOyIR0i1n .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-9oppO7eaOyIR0i1n .cluster text{fill:#333;}#mermaid-svg-9oppO7eaOyIR0i1n .cluster span{color:#333;}#mermaid-svg-9oppO7eaOyIR0i1n div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-9oppO7eaOyIR0i1n .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-9oppO7eaOyIR0i1n rect.text{fill:none;stroke-width:0;}#mermaid-svg-9oppO7eaOyIR0i1n .icon-shape,#mermaid-svg-9oppO7eaOyIR0i1n .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-9oppO7eaOyIR0i1n .icon-shape p,#mermaid-svg-9oppO7eaOyIR0i1n .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-9oppO7eaOyIR0i1n .icon-shape .label rect,#mermaid-svg-9oppO7eaOyIR0i1n .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-9oppO7eaOyIR0i1n .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-9oppO7eaOyIR0i1n .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-9oppO7eaOyIR0i1n :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-9oppO7eaOyIR0i1n .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-9oppO7eaOyIR0i1n .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-9oppO7eaOyIR0i1n .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-9oppO7eaOyIR0i1n .test>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-9oppO7eaOyIR0i1n .test span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-9oppO7eaOyIR0i1n .test tspan{fill:#14532b!important;}#mermaid-svg-9oppO7eaOyIR0i1n .art>*{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-9oppO7eaOyIR0i1n .art span{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-9oppO7eaOyIR0i1n .art tspan{fill:#0f172a!important;} 否
是
读取相关文件与规则
复现或建立基线
定位根因
做最小修改
运行约定验证
满足完成标准?
报告证据与剩余风险

19.4 可复用技能:把稳定方法移出临时 Prompt
技能(Skill)把任务说明、参考资料和可选脚本封装为可复用工作流。它适合"方法相同、输入变化"的任务,例如数据集质检、评测报告生成和返回标注清洗。
19.4.1 何时值得写成 Skill
- 同一流程已经成功执行多次;
- 输入路径或参数变化,但步骤和验收规则基本稳定;
- 团队需要统一做法;
- 仅靠一句"像上次一样处理"容易遗漏步骤;
- 工作流需要附带脚本、模板或参考资料。
若流程仍需要频繁转向,先在普通聊天中迭代;稳定后再固化。过早写成 Skill,会把尚未验证的假设包装成标准流程。
19.4.2 视觉数据集质检 Skill
一个数据集质检 Skill 可以规定:
- 读取数据清单,不直接扫描无关磁盘;
- 检查图片损坏、缺失标签和孤立标签;
- 对检测任务核对类别 ID 范围与空标签;
- 对分类任务核对目录名与类别表;
- 对分割任务核对掩码尺寸、离散取值与忽略标签;
- 先生成只读报告,得到授权后才修复数据;
- 输出机器可读统计和人工可读摘要。
#mermaid-svg-46gj9WnXAy9o09ia{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-46gj9WnXAy9o09ia .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-46gj9WnXAy9o09ia .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-46gj9WnXAy9o09ia .error-icon{fill:#552222;}#mermaid-svg-46gj9WnXAy9o09ia .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-46gj9WnXAy9o09ia .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-46gj9WnXAy9o09ia .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-46gj9WnXAy9o09ia .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-46gj9WnXAy9o09ia .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-46gj9WnXAy9o09ia .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-46gj9WnXAy9o09ia .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-46gj9WnXAy9o09ia .marker{fill:#333333;stroke:#333333;}#mermaid-svg-46gj9WnXAy9o09ia .marker.cross{stroke:#333333;}#mermaid-svg-46gj9WnXAy9o09ia svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-46gj9WnXAy9o09ia p{margin:0;}#mermaid-svg-46gj9WnXAy9o09ia .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-46gj9WnXAy9o09ia .cluster-label text{fill:#333;}#mermaid-svg-46gj9WnXAy9o09ia .cluster-label span{color:#333;}#mermaid-svg-46gj9WnXAy9o09ia .cluster-label span p{background-color:transparent;}#mermaid-svg-46gj9WnXAy9o09ia .label text,#mermaid-svg-46gj9WnXAy9o09ia span{fill:#333;color:#333;}#mermaid-svg-46gj9WnXAy9o09ia .node rect,#mermaid-svg-46gj9WnXAy9o09ia .node circle,#mermaid-svg-46gj9WnXAy9o09ia .node ellipse,#mermaid-svg-46gj9WnXAy9o09ia .node polygon,#mermaid-svg-46gj9WnXAy9o09ia .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-46gj9WnXAy9o09ia .rough-node .label text,#mermaid-svg-46gj9WnXAy9o09ia .node .label text,#mermaid-svg-46gj9WnXAy9o09ia .image-shape .label,#mermaid-svg-46gj9WnXAy9o09ia .icon-shape .label{text-anchor:middle;}#mermaid-svg-46gj9WnXAy9o09ia .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-46gj9WnXAy9o09ia .rough-node .label,#mermaid-svg-46gj9WnXAy9o09ia .node .label,#mermaid-svg-46gj9WnXAy9o09ia .image-shape .label,#mermaid-svg-46gj9WnXAy9o09ia .icon-shape .label{text-align:center;}#mermaid-svg-46gj9WnXAy9o09ia .node.clickable{cursor:pointer;}#mermaid-svg-46gj9WnXAy9o09ia .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-46gj9WnXAy9o09ia .arrowheadPath{fill:#333333;}#mermaid-svg-46gj9WnXAy9o09ia .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-46gj9WnXAy9o09ia .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-46gj9WnXAy9o09ia .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-46gj9WnXAy9o09ia .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-46gj9WnXAy9o09ia .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-46gj9WnXAy9o09ia .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-46gj9WnXAy9o09ia .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-46gj9WnXAy9o09ia .cluster text{fill:#333;}#mermaid-svg-46gj9WnXAy9o09ia .cluster span{color:#333;}#mermaid-svg-46gj9WnXAy9o09ia div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-46gj9WnXAy9o09ia .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-46gj9WnXAy9o09ia rect.text{fill:none;stroke-width:0;}#mermaid-svg-46gj9WnXAy9o09ia .icon-shape,#mermaid-svg-46gj9WnXAy9o09ia .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-46gj9WnXAy9o09ia .icon-shape p,#mermaid-svg-46gj9WnXAy9o09ia .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-46gj9WnXAy9o09ia .icon-shape .label rect,#mermaid-svg-46gj9WnXAy9o09ia .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-46gj9WnXAy9o09ia .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-46gj9WnXAy9o09ia .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-46gj9WnXAy9o09ia :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-46gj9WnXAy9o09ia .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-46gj9WnXAy9o09ia .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-46gj9WnXAy9o09ia .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-46gj9WnXAy9o09ia .art>*{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-46gj9WnXAy9o09ia .art span{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-46gj9WnXAy9o09ia .art tspan{fill:#0f172a!important;} 变化的输入
数据路径与任务类型
Skill
稳定步骤与验收规则
参考资料
类别表与格式约定
可选脚本
扫描与校验
本次运行结果
统计、异常与建议
图 19-3:Skill 固定方法,Prompt 提供本次输入。 Skill 不是单纯的长 Prompt;它可以包含 SKILL.md、脚本、参考资料和模板。
19.4.3 调用时仍需提供本次上下文
即使 Skill 已经定义方法,本次 Prompt 仍应给出输入和边界:
text
调用 dataset-audit 技能检查 Z:\datasets\coco_subset。
任务类型是目标检测,只读检查,不修复文件。
把报告写到 reports\coco_subset_audit.md,并列出阻塞训练的问题。
在 Codex CLI 或 IDE 中,可以显式选择 Skill,也可以让 Codex 依据 Skill 描述自动匹配。对高风险或必须采用固定流程的任务,显式调用更容易审计。

19.5 定时任务:先验证 Prompt,再交给调度器
定时任务(Scheduled Task)用于让 ChatGPT 按计划在后台运行工作。它是 ChatGPT 网页端和桌面端的产品能力;Codex CLI 与 IDE 扩展不提供 Scheduled 管理界面,但可以先帮助编写和测试 Prompt、Skill 或脚本。
19.5.1 Skill 与 Scheduled Task 的分工
- Skill 定义怎么做:步骤、检查项、工具和输出格式;
- Scheduled Task 定义何时做:周期、运行位置和每次运行的上下文。
#mermaid-svg-LzB33xDC9F2TeTmE{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-LzB33xDC9F2TeTmE .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-LzB33xDC9F2TeTmE .error-icon{fill:#552222;}#mermaid-svg-LzB33xDC9F2TeTmE .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-LzB33xDC9F2TeTmE .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-LzB33xDC9F2TeTmE .marker{fill:#333333;stroke:#333333;}#mermaid-svg-LzB33xDC9F2TeTmE .marker.cross{stroke:#333333;}#mermaid-svg-LzB33xDC9F2TeTmE svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-LzB33xDC9F2TeTmE p{margin:0;}#mermaid-svg-LzB33xDC9F2TeTmE .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-LzB33xDC9F2TeTmE .cluster-label text{fill:#333;}#mermaid-svg-LzB33xDC9F2TeTmE .cluster-label span{color:#333;}#mermaid-svg-LzB33xDC9F2TeTmE .cluster-label span p{background-color:transparent;}#mermaid-svg-LzB33xDC9F2TeTmE .label text,#mermaid-svg-LzB33xDC9F2TeTmE span{fill:#333;color:#333;}#mermaid-svg-LzB33xDC9F2TeTmE .node rect,#mermaid-svg-LzB33xDC9F2TeTmE .node circle,#mermaid-svg-LzB33xDC9F2TeTmE .node ellipse,#mermaid-svg-LzB33xDC9F2TeTmE .node polygon,#mermaid-svg-LzB33xDC9F2TeTmE .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-LzB33xDC9F2TeTmE .rough-node .label text,#mermaid-svg-LzB33xDC9F2TeTmE .node .label text,#mermaid-svg-LzB33xDC9F2TeTmE .image-shape .label,#mermaid-svg-LzB33xDC9F2TeTmE .icon-shape .label{text-anchor:middle;}#mermaid-svg-LzB33xDC9F2TeTmE .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-LzB33xDC9F2TeTmE .rough-node .label,#mermaid-svg-LzB33xDC9F2TeTmE .node .label,#mermaid-svg-LzB33xDC9F2TeTmE .image-shape .label,#mermaid-svg-LzB33xDC9F2TeTmE .icon-shape .label{text-align:center;}#mermaid-svg-LzB33xDC9F2TeTmE .node.clickable{cursor:pointer;}#mermaid-svg-LzB33xDC9F2TeTmE .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-LzB33xDC9F2TeTmE .arrowheadPath{fill:#333333;}#mermaid-svg-LzB33xDC9F2TeTmE .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-LzB33xDC9F2TeTmE .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-LzB33xDC9F2TeTmE .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LzB33xDC9F2TeTmE .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-LzB33xDC9F2TeTmE .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LzB33xDC9F2TeTmE .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-LzB33xDC9F2TeTmE .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-LzB33xDC9F2TeTmE .cluster text{fill:#333;}#mermaid-svg-LzB33xDC9F2TeTmE .cluster span{color:#333;}#mermaid-svg-LzB33xDC9F2TeTmE div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-LzB33xDC9F2TeTmE .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-LzB33xDC9F2TeTmE rect.text{fill:none;stroke-width:0;}#mermaid-svg-LzB33xDC9F2TeTmE .icon-shape,#mermaid-svg-LzB33xDC9F2TeTmE .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-LzB33xDC9F2TeTmE .icon-shape p,#mermaid-svg-LzB33xDC9F2TeTmE .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-LzB33xDC9F2TeTmE .icon-shape .label rect,#mermaid-svg-LzB33xDC9F2TeTmE .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-LzB33xDC9F2TeTmE .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-LzB33xDC9F2TeTmE .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-LzB33xDC9F2TeTmE :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-LzB33xDC9F2TeTmE .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-LzB33xDC9F2TeTmE .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-LzB33xDC9F2TeTmE .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-LzB33xDC9F2TeTmE .test>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-LzB33xDC9F2TeTmE .test span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-LzB33xDC9F2TeTmE .test tspan{fill:#14532b!important;} 否
是
已手动验证的 Prompt 或 Skill
配置 Scheduled Task
选择周期与运行环境
后台运行
在 Scheduled 中检查结果
结果稳定且可审查?
继续运行并定期复核
图 19-4:定时任务应从手动验证过的流程开始。 官方建议先在普通聊天中测试 Prompt,并检查最初几次运行后再调整范围、工具或周期。
19.5.2 模型评测周报示例
text
每次运行时,读取项目中最近一周新增的正式评测结果。
只汇总具有完整配置、数据清单和正式结果文件的实验;局部日志和中间 checkpoint 不算完成。
按目标检测、分类和分割分组,说明每个方向的问题、变量、证据和结论。
如果没有新结果,明确写"本周期无新增正式结果",不要复述旧报告。
输出一份 Markdown 周报,不修改模型、数据或训练进程。
这个 Prompt 具备定时运行所需的三个条件:每次运行的时间范围明确、完成证据明确、无新增内容时的行为明确。
19.5.3 运行环境边界
- 本地项目任务需要电脑开机、桌面应用运行,且项目路径可访问;
- Git 仓库可以选择在本地目录或隔离工作树(Worktree)中运行;
- 本地模式可能修改正在编辑的文件,涉及写操作时优先考虑工作树;
- 网页端任务可以使用上传内容和连接工具,但不能直接访问电脑上的任意本地目录;
- 无人值守运行应采用满足任务所需的最小权限,并在初期人工检查输出。
独立的 Scheduled Task 每次可以从保存的 Prompt 开始新聊天;聊天内的定时任务则可以回到原聊天并继续使用已有上下文。选择哪种形式,取决于各次运行是否需要相互继承上下文。

19.6 长任务 Playbook:用目标和门槛推进
Playbook 是本文采用的工程组织方式,不是 Codex 的独立产品功能。它适合迁移、系统性调试或多阶段实验:路径可能变化,但阶段目标、决策门和停止条件必须清楚。
对于结果尚不明确的任务,可以先使用 /plan 梳理约束和方案;结果与完成标准明确后,再用 /goal 启动目标模式(Goal Mode)。目标应包含结果、约束和验证,而不是只写"持续优化"。
19.6.1 分割模型优化案例
目标:在不改变训练集和部署输入尺寸的前提下,定位小目标漏分割的主要原因,并验证一个候选修改。
#mermaid-svg-WfbvHa1wUOEVyM68{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WfbvHa1wUOEVyM68 .error-icon{fill:#552222;}#mermaid-svg-WfbvHa1wUOEVyM68 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WfbvHa1wUOEVyM68 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WfbvHa1wUOEVyM68 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WfbvHa1wUOEVyM68 .marker.cross{stroke:#333333;}#mermaid-svg-WfbvHa1wUOEVyM68 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WfbvHa1wUOEVyM68 p{margin:0;}#mermaid-svg-WfbvHa1wUOEVyM68 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster-label text{fill:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster-label span{color:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster-label span p{background-color:transparent;}#mermaid-svg-WfbvHa1wUOEVyM68 .label text,#mermaid-svg-WfbvHa1wUOEVyM68 span{fill:#333;color:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 .node rect,#mermaid-svg-WfbvHa1wUOEVyM68 .node circle,#mermaid-svg-WfbvHa1wUOEVyM68 .node ellipse,#mermaid-svg-WfbvHa1wUOEVyM68 .node polygon,#mermaid-svg-WfbvHa1wUOEVyM68 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WfbvHa1wUOEVyM68 .rough-node .label text,#mermaid-svg-WfbvHa1wUOEVyM68 .node .label text,#mermaid-svg-WfbvHa1wUOEVyM68 .image-shape .label,#mermaid-svg-WfbvHa1wUOEVyM68 .icon-shape .label{text-anchor:middle;}#mermaid-svg-WfbvHa1wUOEVyM68 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WfbvHa1wUOEVyM68 .rough-node .label,#mermaid-svg-WfbvHa1wUOEVyM68 .node .label,#mermaid-svg-WfbvHa1wUOEVyM68 .image-shape .label,#mermaid-svg-WfbvHa1wUOEVyM68 .icon-shape .label{text-align:center;}#mermaid-svg-WfbvHa1wUOEVyM68 .node.clickable{cursor:pointer;}#mermaid-svg-WfbvHa1wUOEVyM68 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WfbvHa1wUOEVyM68 .arrowheadPath{fill:#333333;}#mermaid-svg-WfbvHa1wUOEVyM68 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WfbvHa1wUOEVyM68 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WfbvHa1wUOEVyM68 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WfbvHa1wUOEVyM68 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WfbvHa1wUOEVyM68 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WfbvHa1wUOEVyM68 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster text{fill:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 .cluster span{color:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WfbvHa1wUOEVyM68 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WfbvHa1wUOEVyM68 rect.text{fill:none;stroke-width:0;}#mermaid-svg-WfbvHa1wUOEVyM68 .icon-shape,#mermaid-svg-WfbvHa1wUOEVyM68 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WfbvHa1wUOEVyM68 .icon-shape p,#mermaid-svg-WfbvHa1wUOEVyM68 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WfbvHa1wUOEVyM68 .icon-shape .label rect,#mermaid-svg-WfbvHa1wUOEVyM68 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WfbvHa1wUOEVyM68 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WfbvHa1wUOEVyM68 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WfbvHa1wUOEVyM68 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-WfbvHa1wUOEVyM68 .stage>*{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .stage span{fill:#dbeafe!important;stroke:#2563eb!important;color:#1e3a8a!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .stage tspan{fill:#1e3a8a!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .test>*{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .test span{fill:#dcfce7!important;stroke:#16a34a!important;color:#14532b!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .test tspan{fill:#14532b!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .pain>*{fill:#fee2e2!important;stroke:#dc2626!important;color:#7f1d1d!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .pain span{fill:#fee2e2!important;stroke:#dc2626!important;color:#7f1d1d!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .pain tspan{fill:#7f1d1d!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .art>*{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .art span{fill:#f1f5f9!important;stroke:#64748b!important;color:#0f172a!important;}#mermaid-svg-WfbvHa1wUOEVyM68 .art tspan{fill:#0f172a!important;} 标签或预处理
模型或损失
否
是
阶段 1
固定基线与数据清单
阶段 2
分析失败样本
证据更支持哪类问题?
先修复数据链并重跑基线
选择一个候选变量
阶段 3
小规模筛选实验
通过预设门槛?
记录否定结果并停止该方向
阶段 4
完整训练与正式评测
校验配置、指标与正式产物
图 19-5:Playbook 固定门槛,不固定所有推理细节。 每个实验只改变一个变量;未通过筛选门槛时记录结论,而不是继续扩大实验。
19.6.2 人工决策点
人在回路(Human in the Loop)适合以下节点:
- 删除、迁移或批量覆盖数据之前;
- 修改训练集、标签规范或指标口径之前;
- 高成本完整训练开始之前;
- 需要在多个有争议方向中选择一个之前;
- 验证发现原始目标无法成立时。
不要把"遇到任何小问题都询问"写进 Prompt,这会让流程频繁中断。应明确哪些风险允许 Codex 自行处理,哪些变化必须得到授权。
19.6.3 状态必须落盘
长任务不应只依赖聊天历史。至少保存:
- 父版本和唯一变量;
- 数据清单与配置;
- 已运行命令和日志路径;
- 阶段结论与下一步;
- 正式结果及其校验状态。
目标模式不会扩大沙箱权限,也不会把进程退出自动解释为完成。完成应由测试、指标和正式产物共同证明。

19.7 脚本和 CI:用 codex exec 运行 Prompt
非交互模式(Non-interactive Mode)使用 codex exec,适合脚本、CI、预合并检查和定时作业。它与 Scheduled 管理界面是两套入口:前者由你自己的脚本或调度器触发,后者由 ChatGPT 的 Scheduled 管理。
powershell
codex exec --sandbox workspace-write "检查本次 diff 是否破坏 COCO 类别映射;运行相关测试并报告证据"
自动化时应注意:
- 默认只读沙箱不足以编辑文件;需要写入时显式选择
workspace-write; - 只在受控环境中使用更宽权限;
- 需要事件流时使用
--json; - 下游需要固定字段时使用
--output-schema; - Prompt 和环境都应先人工测试,再接入流水线。
机器可读输出不能替代结果校验。下游还应检查进程退出状态、必需字段和正式产物是否存在。

19.8 让 Prompt 更可靠的工程原则
19.8.1 结果优先,而非步骤堆砌
先描述结果。只有当流程顺序会影响安全、可比性或合规性时,才规定步骤。例如视觉实验需要"先固定基线,再改变一个变量",这一顺序必须写明;具体使用哪条搜索命令通常不必指定。
19.8.2 只给相关上下文
指定关键文件、错误片段、基线结果和数据版本。不要把整个仓库、完整训练日志或所有历史讨论都塞入 Prompt。上下文越多不一定越好,无关信息会稀释真正的约束。
19.8.3 把边界写成可执行规则
差的边界:"小心一点。"
好的边界:"只读检查;不要删除、移动或覆盖数据。若发现标签格式不一致,只报告数量和样例路径。"
19.8.4 用证据定义完成
验证(Verification)应回答"凭什么说完成"。例如:
- 目标检测:单元测试、固定子集冒烟评测、完整 COCO 指标;
- 分类:类别顺序检查、混淆矩阵、固定验证集准确率;
- 分割:掩码取值检查、忽略标签处理、按类别 IoU 与可视化样例;
- 文档修改:链接、代码块、Mermaid 和格式检查。
19.8.5 为重复运行设计幂等性
幂等性(Idempotency)指重复执行不会因重复副作用而破坏状态。对自动化 Prompt,可以要求:
- 已存在且校验通过的报告不重复生成;
- 写文件前比较内容,避免无意义改动;
- 使用运行 ID 或输入清单区分不同批次;
- 发现同一任务仍在运行时只报告状态,不再次启动。
19.8.6 保持可观测性
可观测性(Observability)不是"打印更多日志",而是让人能判断正在做什么、使用了什么输入、结果是否可信。报告至少应包含修改文件、验证命令、关键结果和剩余风险。

19.9 常见陷阱
- 把实践归纳写成官方功能:Task、Skill、Scheduled Task 和 Playbook 的产品地位不同,不能混称为 Codex 原生四模式。
- 一开始就规定所有步骤:过度约束会阻止 Codex 根据证据调整调查路径。
- 目标只有活动,没有结果:"持续优化模型"无法判断完成;应给出可验证的结果和停止条件。
- 一次改变多个实验变量:指标变化后无法归因。检测、分类和分割实验都应固定父版本与数据契约。
- 把 Skill 当定时器:Skill 定义工作方法;Scheduled Task 或外部调度器决定何时运行。
- 未经测试就无人值守运行:先手动运行,再审查最初几次自动结果。
- 只看最终文字,不检查产物:自动化应同时校验退出状态、结果结构和正式文件。
- 把高权限写进 Prompt 当作便利:权限由沙箱和审批策略控制,应遵循最小权限原则。

19.10 本章小结
Codex Prompt 设计可以归纳为六句话:
- 简单任务直接说结果,复杂任务再补充结构。
- 目标、上下文、输出、边界和完成标准按需使用。
- 一次性问题用清晰任务,稳定方法写成 Skill。
- 先手动验证,再交给 Scheduled Task 或
codex exec。 - 长任务用目标、阶段门槛和正式产物保持连续性。
- 用测试和证据定义完成,不依赖模型的口头结论。
对 AI 视觉算法工程师而言,最关键的不是写出很长的 Prompt,而是固定数据、变量、指标和验收契约,让 Codex 知道什么可以探索,什么必须保持不变,以及什么证据才算完成。

参考资料
- OpenAI Docs:Prompting
- OpenAI Docs:Long-running work
- OpenAI Docs:Build skills
- OpenAI Docs:Scheduled tasks
- OpenAI Docs:Non-interactive mode
- OpenAI Docs:Sandboxing
