Signal Desk
返回Codex 教程

把家庭杂事变成可检查的本地资料2 / 3

家庭路径 · 三次安全实验动手教程阅读约 10 分钟 · 实操约 32 分钟

从库存和五条硬约束生成可对账餐单

让一周餐单、库存扣减和采购清单互相校验;不让偏好覆盖过敏约束,也不把安排写成医疗建议。

先知道终点

做完你会得到
一份餐单、采购表和 prep 计划,数量与约束均可复核
开始前只需要
只使用虚构家庭约束;知道本教程不提供营养或医疗建议
最后留下这些证据
五条硬约束全部有检查结果;库存与采购数量可对账;未知食品信息没有被补猜

内容校准于 2026-07-30 · 第 30 / 38 节已发布课程

跟着材料做,不只阅读

本节练习资料

建议先做,再看答案

七天菜名都很好,冰箱却更满了

餐单看起来丰富,采购清单也很整齐。到周三才发现鸡蛋本来就有两盒,另一道菜又碰到了家里的过敏约束。

生成菜单很容易,维持约束才是难点。

好餐单不是七个菜名,而是一套能对账的系统。 这节课会让库存扣减、硬约束、偏好和采购清单互相检查,任何一项对不上都不能算完成。

好餐单不是七个菜名

一个可执行家庭餐单至少要同时满足:

  • 硬约束:禁用食材、人数、可用时间、设备;
  • 库存:已有多少、单位是什么、何时过期;
  • 产物一致:菜单用到的食材进入采购或来自库存;
  • 不确定性:未知配料和替代品不被猜测;
  • 人工决定:健康、医疗、儿童喂养与购买仍由家庭负责。

本节不评价营养充足性,只练习约束和数量一致性。

第一步:区分硬约束与偏好

打开 constraints.md:

硬约束
- 3 人;
- 不使用花生及含花生配料;
- 周一、周三做饭不超过 30 分钟;
- 只有一个炒锅和一个电饭煲;
- 周五不在家吃晚饭。

偏好
- 希望一周至少两次使用已有胡萝卜;
- 尽量让周二剩余食材可用于周三。

偏好不能覆盖硬约束。若无法同时满足偏好,应明确放弃哪项,而不是偷偷使用禁用食材或延长时间。

第二步:先验证库存表

让 Codex只读报告:

  • 行数、品名、数量、单位;
  • 数量为零或负数;
  • 同名不同单位;
  • 过期日在计划周之前的项目;
  • allergen_note 为空的加工食品。

预期

pantry.csv 中有一项单位不统一和一项配料未知的加工酱。未知配料不能自动判定“无花生”;把它标为不可用于计划,等待人工查看包装。

第三步:定义三个输出的数据契约

menu.csv:

day,meal,servings,active_minutes,ingredients,uses_leftovers,constraint_notes

shopping.csv:

ingredient,required_qty,pantry_qty,buy_qty,unit,used_by,needs_label_check

prep-plan.md:

提前准备:
当天步骤:
剩余食材去向:
不能确认的配料:
家庭最终确认:

三份产物共享食材名称和单位,否则无法对账。

第四步:先生成两天最小计划

不要一次生成整周。先做周一和周二:

只为周一、周二生成草案。
周一 active_minutes <= 30;周二可以为周三准备可复用食材。
只使用 pantry.csv 中配料状态已确认的库存。
报告每种食材的需求量、库存扣减和预计剩余。

检查点 1

人工核对:

  • 周一人数是否为 3;
  • active_minutes 是否只算主动操作时间,定义是否一致;
  • 胡萝卜使用量是否小于等于库存;
  • 加工酱是否因配料未知被排除;
  • 周二剩余是否有明确保存和周三用途。

两天通过后再扩展到全周。

第五步:生成全周并做数量守恒

目标
- 在已确认的两天基础上扩展全周餐单,并生成采购与准备计划。

边界
- 不提供医疗或个体营养结论;
- 不使用花生或配料未知的加工食品;
- 不自动下单;
- 数量或单位无法换算时标待确认。

完成前
- 周五不生成家庭晚餐;
- 周一、周三 active_minutes <= 30;
- 每项 buy_qty = max(required_qty - usable_pantry_qty, 0);
- 每种菜单食材在库存或采购中有来源;
- 列出未满足的偏好。

算术检查

对胡萝卜手算:

期初库存 900g
周一使用 300g
周三使用 350g
期末预计 250g
采购 0g

若菜单、库存或采购任何一个不同,先统一单位和名称,再重新计算,不要手改汇总数字。

第六步:约束矩阵

| 约束 | 对应计划 | 检查方法 | 结果 |
| --- | --- | --- | --- |
| 花生禁用 | 全部餐次 | 搜索食材与标签状态 | pass/blocked |
| 周一≤30m | 周一 | active_minutes | pass/fail |
| 周三≤30m | 周三 | active_minutes | pass/fail |
| 周五不在家 | 周五 | 不生成家庭晚餐 | pass/fail |
| 3人 | 所有餐次 | servings=3 | pass/fail |

“看起来满足”不算结果。未知配料应为 blocked,不是 pass。

第七步:故障与恢复

采购清单出现负数

原因通常是库存大于需求但公式未取 max。恢复:保留 required 和 pantry 原值,把 buy_qty 下限设 0,重新汇总。

菜单使用了不存在的食材

检查食材名称标准化;若确实新增,则进入采购表。不要从菜单删掉但仍保留准备步骤。

未知酱料被当成安全

恢复 needs_label_check=true,移出可用库存。只有家庭人工确认包装后才能改变状态。

第八步:迁移练习

条件改变:周三只有 15 分钟,胡萝卜实际只剩 400g。只修改受影响餐次和采购,保留其他天。

提示:

  1. 先更新库存快照;
  2. 重新检查周一与周三用量;
  3. 优先替换周三步骤,不必重写整周;
  4. 更新约束矩阵。

完成后用 rubric 对账,再查看参考答案。

先用三天证明它能对账

不要一开始安排整周。选三天、五种库存和两条硬约束,手工核对每次扣减与采购新增。

硬约束冲突时停下来交给家庭决定。餐单能被算清,才有资格继续谈创意和丰富。

完成检查

  • 硬约束与偏好优先级明确
  • 未知配料保持 blocked
  • 菜单、库存、采购和 prep 名称一致
  • 至少一种食材经过手算守恒
  • 五条硬约束均有 pass/fail/blocked
  • 没有自动下单或输出医疗结论

参考与校准来源

本文是官方资料的中文转译与教学重组,不是逐字翻译;产品能力、命令、默认值与安全边界以下列官方原文为准。