从库存和五条硬约束生成可对账餐单
让一周餐单、库存扣减和采购清单互相校验;不让偏好覆盖过敏约束,也不把安排写成医疗建议。
先知道终点
- 做完你会得到
- 一份餐单、采购表和 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。只修改受影响餐次和采购,保留其他天。
提示:
- 先更新库存快照;
- 重新检查周一与周三用量;
- 优先替换周三步骤,不必重写整周;
- 更新约束矩阵。
完成后用 rubric 对账,再查看参考答案。
先用三天证明它能对账
不要一开始安排整周。选三天、五种库存和两条硬约束,手工核对每次扣减与采购新增。
硬约束冲突时停下来交给家庭决定。餐单能被算清,才有资格继续谈创意和丰富。
完成检查
- 硬约束与偏好优先级明确
- 未知配料保持 blocked
- 菜单、库存、采购和 prep 名称一致
- 至少一种食材经过手算守恒
- 五条硬约束均有 pass/fail/blocked
- 没有自动下单或输出医疗结论
参考与校准来源
本文是官方资料的中文转译与教学重组,不是逐字翻译;产品能力、命令、默认值与安全边界以下列官方原文为准。