【Codex】Part 19 — Codex Prompt Design Patterns

文章目录

  • [第十九章 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 可以规定:

  1. 读取数据清单,不直接扫描无关磁盘;
  2. 检查图片损坏、缺失标签和孤立标签;
  3. 对检测任务核对类别 ID 范围与空标签;
  4. 对分类任务核对目录名与类别表;
  5. 对分割任务核对掩码尺寸、离散取值与忽略标签;
  6. 先生成只读报告,得到授权后才修复数据;
  7. 输出机器可读统计和人工可读摘要

#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 常见陷阱

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

19.10 本章小结

Codex Prompt 设计可以归纳为六句话:

  1. 简单任务直接说结果,复杂任务再补充结构。
  2. 目标、上下文、输出、边界和完成标准按需使用。
  3. 一次性问题用清晰任务,稳定方法写成 Skill。
  4. 先手动验证,再交给 Scheduled Task 或 codex exec
  5. 长任务用目标、阶段门槛和正式产物保持连续性。
  6. 用测试和证据定义完成,不依赖模型的口头结论。

对 AI 视觉算法工程师而言,最关键的不是写出很长的 Prompt,而是固定数据、变量、指标和验收契约,让 Codex 知道什么可以探索,什么必须保持不变,以及什么证据才算完成。


参考资料


上一章第十八章 Codex 的上下文生命周期管理

相关推荐
AI人工智能+电脑小能手1 小时前
大白话说Java设计模式-38-迭代器模式(业务实战篇)
java·设计模式·迭代器模式·stream·遍历封装·集合通用·分页遍历
qyyyyy5704 小时前
芯片 Application Note PDF 怎么读?参考电路、BOM 和调试波形翻译实战
嵌入式硬件·设计模式·机器翻译·web application
半兽先生4 小时前
生产级 Agent 如何防止 Prompt 注入?构建多层纵深防御体系
prompt
边吃番茄边敲代码5 小时前
企业智能助手Agent 安全测试,包含Prompt Injection 和越权工具调用
人工智能·python·功能测试·ai·单元测试·prompt·模块测试
程序员贺加贝6 小时前
列表导出不够用-SaaS-ERP-单据详情导出的-Provider-模板与文档型-Excel-设计
java·后端·设计模式·架构·excel
catino1 天前
Prompt详解
人工智能·prompt
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-34-命令模式(业务实战篇)
java·spring·设计模式·命令模式·异步任务·撤销重做·事务封装
小白说大模型1 天前
Codex 实战:用 AI 写运维脚本
大数据·运维·网络·人工智能·机器学习·prompt
用户202252215061 天前
字节发布"豆包工作",我从AI PM角度看到的不是功能,是上下文
设计模式