Codex 的常见问题
Codex 的一个常见问题是倾向于使用定义模糊的术语来设计或实现功能。根据我的经验,这个问题在 Claude 中稍少一些,但在 Codex 中,5.5 版本存在这个问题,5.6 版本依然存在。以下是对此问题的应对措施。
例如,一份研究报告的某个部分有一个标题叫"压缩点"。阅读正文时,这个术语在三个含义之间摇摆不定:"对话历史达到设定数量时"、"开始自动摘要的阈值"以及"摘要实际开始的时刻"。行文流畅,看起来像是技术解释。然而,一旦一个术语同时作为起始条件、数值和事件,解释的对象就变得不明确。结果,研究结论不幸地被引向了错误的方向。
受这次失败的启发,我创建了一个名为 semantic-generation 的技能。虽然这个名字听起来像是一种文本生成技术,但实际上我改变的是在撰写文本之前对词语的定义。
问题的结构与影响
存在一个问题,即日语术语"压缩点"本身含义不清,但当 Codex 被指出这一点时,它首先试图将其修复为解释不足的问题,然后是标题表达的问题。它没有立即意识到自己混淆了起始条件和执行事件。
在同一会话中,类似的事情发生了。由于原因尚不清楚,计划是进行测试,从结果中隔离原因,然后选择应对措施。Codex 将这个过程总结为"将观察结果汇总到一个统一的地方"。
汇总的目标不是观察结果本身,而是从测试中获得的数值或记录。此外,汇总数值并非目的,而是隔离原因的手段。
通过将其概括为一个简短的短语,以下顺序消失了:
- 原因尚不清楚。
- 进行测试。
- 从结果中隔离原因。
- 隔离后选择应对措施。
"将观察结果汇总到一个统一的地方"看起来合理。正因为它看起来合理,它掩盖了未组织好的部分,并成为后续设计的前提。
原始术语的更正列表无法阻止它
考虑改进时,有人建议记录更正后的词语与对应含义,并带入下一个会话。
我想阻止的不是"再次使用之前用错的词"。而是在目标不明确时先放置一个词,并基于这个词进行思考。即使你列出错误词汇表,下次又会出现一个新的生造词。
因此,我没有采用更正列表,而是改变了策略,在每个会话开始时,在创建原始术语之前,先创建候选词列表。
应对措施) 在设计前强制创建候选词列表
我决定让 AI 创建一个自定义术语对应表,然后在加载该文件后进行设计。
对应表包含以下七列:
- 来源
- 目的
- 具体对象
- 角色
- 上下文
- 候选词
- 初始定义
列的顺序很重要。候选词在最右边,只有在填写了具体对象和角色后才能填写。
如果候选词在最左边,人们可能会先写出"压缩点"这个词,然后稍后创建符合该词的解释。这只会在我想要阻止的生成顺序内重现。
角色也按行放置。如果你想用同一个词处理起始条件和事件,就拆分行。然后,在"用一个词完成"的压力下,正在处理两个对象的事实就变得可见了。
通过这样做,生成式 AI 本身可以在词语变得模糊时注意到,并且我能够积极禁止在词语仍模糊时使用它们。
总结
生成式 AI 不擅长让空白保持空白。即使目标或目的尚未确定,只要放置一个看似合理的词,它就能继续生成文本。这种流畅性在设计上可能很危险。
semantic-generation 不是寻找好词的技能。它是一个让 AI 在尝试使用原始术语时暂停片刻,选择合适词语的技能。
目标是什么?是条件、状态还是事件?出于什么目的处理它,之后会发生什么?
只有为那些已经写好的行,我们最终才在末尾赋予一个名称。乍一看,这似乎绕了弯路,但总比从"压缩点"这样一个词重建整个设计要短。
semantic-generation 技能
1---2name: semantic-generation3description: |4 一种生成流程,在撰写目标文档(设计材料、基于需求的设计、研究报告、原因隔离计划、应对措施计划、命名、推理顺序总结)之前,首先提交一个对应表(指称表)作为独立的交付物,以在词语之前固定指称对象和角色。5 触发条件:撰写设计材料、创建设计文档、撰写研究报告、撰写应对措施计划、命名、决定状态名/条件名/类型名/方法名、总结推理顺序、指称表、对应表。6 不触发条件:引用用户原始文本、简单的机械性编辑、重用现有名称、固定输出、闲聊、仅使用已建立术语即可撰写的短句。7---89# semantic-generation — 在词语之前固定目标的流程1011如果在目标不明确时先放置一个词(通常是现场生造的词),并基于该词进行思考,那么与指称对象的偏差将传播到日语语句、设计语句和代码标识符中,而无法得到纠正。此技能强制规定"先独立提交对应表,然后将正文作为其副本撰写"的序列。12纪律标准由 [[referent-before-label]] 规则持有。1314## 应用标准1516当以下任一情况适用时使用。如果无法判断,则视为适用。17181. 撰写设计材料、基于需求的设计、研究报告、原因隔离计划或应对措施计划。192. 命名(公共规范、状态名、条件名、事件名、值或记录的类型名、方法名、布尔名)。203. 尝试将用户给出的推理顺序总结为简短的工作标签。2122## 正常流程2324### 1. 首先将对应表保存为独立的交付物(两阶段提交)2526在撰写正文任何一个字之前,将对应表保存为一个独立的文件。2728- 保存位置:工作目录下的 `referent-table-<slug>.md`(如果交付物在 `output/` 下,则放在同一目录)。29- 保存后记录 sha256(例如,`shasum -a 256 <path>`)。该记录成为"对应表是在正文之前创建的"证据。仅将表格放在已完成文档的开头并不证明生成顺序。3031### 2. 对应表的格式(禁止更改列顺序)3233| 来源 | 目的 | 具体对象 | 角色 | 上下文 | 候选词 | 初始定义 |3435- **候选词固定在最右边。在填写具体对象和角色之前,保持候选词列为空。** 这是为了通过格式使"先决定词,后附加目标"的顺序变得不可能。36- 从封闭选项中选择角色:`起始条件 / 状态 / 事件 / 值 / 记录 / 目的 / 手段`。如果同一个词指代多个角色,则拆分行。37- 在"上下文"中,使用原文中的词语写出用户给出的推理顺序(例如,测试 → 隔离 → 应对措施)。不要与角色列混合。38- 表格通常限制在 1–6 行。如果超过,在含义变化的边界处拆分表格。39- 完成后,确认即使隐藏候选词列,仅凭"具体对象"列也能清楚理解其含义。4041### 3. 填写候选词4243- 优先使用用户术语和已建立术语。44- 当放置其他新词时,在"初始定义"列中写入"X 指的是…"。不要引入无法写出定义的词;直接在正文中使用具体对象的描述。4546### 4. 将正文作为对应表的副本撰写4748- 仅使用对应表中列出的词作为正文的核心词汇。49- 在日语语句、设计元素和代码标识符三层之间保持相同的对应关系(例如,"历史记录量达到 250K" = 起始条件 → 条件名 / "自动摘要开始" = 事件 → 事件名/方法名 / "自动摘要进行中" = 状态 → 状态名。不同的角色应有不同的名称)。50- 不要将工作标签(省略目的、目标和判断的抽象名词短语)用于框架或标题。如果想使用,尝试在表格中写出该短语的指称对象;如果做不到,请用具体的语句撰写。5152## 出现问题时的初步行动5354- 如果意识到在尚未提交对应表的情况下开始撰写正文,不要稍后添加表格来继续。丢弃正文,重新独立提交对应表,然后重新生成正文。55- 如果被指出表格中某一行不正确(指称对象或角色混淆),不要添加解释;重写相关行,然后重新生成正文的相应部分。56- 在无法加载此技能的环境中,在开始正文之前,将一个至少包含 6 列(来源、目的、具体对象、角色、上下文、候选词)的表格作为独立文件保存。5758## 备注5960- 不要在本技能正文中包含用于验证的测试输入或预期答案(以保持验证的独立性。测试在单独目录的 fixtures 中管理)。61- 目标不是与错误术语列表进行匹配。匹配目标是"文档自身声明的对应表"。
referent-before-label 规则
1# 在词语之前固定指称对象23<!-- codex-runtime-summary -->4- 重要:对于目标文档(设计语句、研究报告、应对措施计划、命名、推理顺序总结),在独立提交对应表后撰写正文。禁止在未提交对应表的情况下提交正文。如果开始撰写时没有表格,请丢弃正文并从对应表重新开始。5- 重要:不要将工作标签(将未组织的工作包裹在抽象名词中的短语)用于框架或标题。不要引入无法写出初始定义的新词或生造词;将目标分解为具体的描述。6- 重要:在开始目标文档时触发 semantic-generation 技能。即使无法使用该技能,也要首先将至少包含 6 列(来源、目的、具体对象、角色、上下文、候选词)的对应表作为独立的交付物保存。7<!-- /codex-runtime-summary -->89如果在目标不明确时先放置一个词(通常是现场生造的词),并基于该词进行思考,那么与指称对象的偏差将传播到设计语句、状态名、条件名、方法名和类型名中(如 TASK-52 中的"压缩点"和"将观察结果汇总到一个统一的地方"示例)。此规则旨在阻止此生成过程本身。与错误术语列表进行匹配(词语狩猎)不是应对措施,因为生造词无法枚举。词语波动的标准由 [[terminology]] 持有,而此规则持有"在放置词语之前的流程"。1011## 适用范围(目标文档)1213仅适用于属于以下任一情况的任务。如果无法判断,则适用。14151. 撰写设计材料、基于需求的设计、研究报告、原因隔离计划或应对措施计划。162. 命名(公共规范、状态名、条件名、事件名、值或记录的类型名、方法名、布尔名)。173. 尝试将用户给出的推理顺序总结为简短的工作标签。1819不适用于引用用户原始文本、简单的机械性编辑、重用现有名称、固定输出、闲聊或仅使用已建立术语即可撰写的短句。2021## 持续应用(3 项禁止)2223- 重要:在目标文档中,不要在没有独立提交对应表(指称表)的情况下提交正文。对应表必须首先保存在一个与正文分开的单独文件或单独轮次中,然后撰写正文(仅将表格放在已完成文档的开头并不能证明它是"先制作的")。24- 重要:不要将工作标签用于框架、标题或结论。工作标签是指将未组织的工作包裹在抽象名词中,不包含目的、目标或判断的短语(例如,"总结观察结果")。如果想使用,尝试在对应表中写出该短语所指代的目标;如果做不到,则丢弃该短语并用具体的语句撰写。25- 重要:当引入除用户术语或已建立术语之外的新词时,在首次出现时写入定义语句"X 指的是…"。不要引入无法写出定义语句的词;直接用语句写出目标。2627## 正常流程28291. 确定是否属于目标文档(如有疑问,视为适用)。302. 触发 [[semantic-generation]] 技能,并首先将对应表保存为独立的交付物。313. 仅使用对应表中列出的词作为核心词汇撰写正文,在日语语句、设计元素和代码标识符之间保持相同的对应关系。3233## 出现问题时的初步行动3435- 如果意识到在为目标文档撰写正文时未提交对应表,不要稍后添加表格来继续。丢弃正文,重新独立提交对应表,然后重新生成正文。36- 在技能不可用的环境中,在开始正文之前,将一个至少包含 6 列(来源、目的、具体对象、角色、上下文、候选词)的对应表作为独立文件保存在工作目录中。





