配料表反向验证法 · 分析技能
把一款预包装食品的营养成分表,反推回它的配料表,检验"配料表降序排列下,能不能凑出标签上写的那些营养素"。能凑出来 → 合理;凑不出来且有营养素无论如何都达不到 → 可疑/虚标。这是做食品配料表/营养成分表解读、打假、辟谣内容时的硬证据工具。
> ⚠️ 重要免责声明:本技能的所有输出仅用于个人选购商品时的辅助参考,不能作为任何行政、法律、监管或维权判定证据。一款产品是否虚标、是否合规,最终必须以法定检验机构 / 监管部门的检测结果为准。
双解读框架(关键能力,非定论)
当验证发现某营养素"确定与标签标注不一致",且虚标方向与商家常规标注习惯相反、且偏离幅度过大时,本技能会同时给出两种解读,而不是简单判"营养表虚标"。所谓"反向偏离"指:在行业习惯里,好营养素(蛋白质、膳食纤维)通常被往高标、坏营养素(脂肪、钠、碳水化合物)通常被往低标;所以当出现以下任一类"反习惯方向"且幅度明显时即触发双解读——
- 蛋白质被标低、膳食纤维被标低(好营养素反而往低标,反常)
- 脂肪被标高、钠被标高、碳水被标高(坏营养素反而往高标,反常——脂肪一般也不会飙高,故"脂肪标高"同属反向偏离)
> 触发是通用的:以各营养素"理论可达区间 [下限, 上限]"为判据(标签 < 下限/1.33 或 标签 > 上限×1.33 即视为反常偏离),并非硬编码某三个项。只要某营养素确实反向偏离且幅度过大,就进入双解读。
- 解读一(配料表为真 → 营养表有问题):在相信配料表降序/成分的前提下,指出营养表哪些项无法被配料表解释。
- 解读二(营养表为真 → 配料表有问题):反过来相信营养表实测值,检查现有配料在降序硬约束下能否提供这些营养;若不能,提示配料表可能隐瞒了真实成分来源(如未标明的碳水主料)或虚报了首位占比。
- 两种解读均明确标注为非定论;最终需靠实测(色谱、淀粉检测、厂家投料记录)定性。本技能不替任何一方下"配料表造假"的定论。
用户使用步骤与拍摄要求
使用步骤(极简):
1. 在对话中挂载本技能(对话框「+」→「技能」→ 选「食品标签虚标检测」)。
2. 上传产品包装照片(见下方拍摄要求)。
3. 说一句简短指令,如"帮我验证这款标签"或"跑一下这个"。→ 技能自动调用 verify.py 计算并输出报告。
拍摄要求(务必满足,否则结果可能失真):
- 照片必须又全面又清晰:配料表、营养成分表都要有,文字清晰可辨、无反光无遮挡。
- 最好同时拍正面:能看到品牌名、产品完整名称,便于核对与溯源。
- 模糊、缺角、只拍一半的标签会导致 OCR 识别错误,结论随之偏移。
何时使用
- 用户发来一款预包装食品的配料表 + 营养成分表(图片或文字),问"这配料表是真的吗 / 数据对不对 / 是不是虚标"。
- 用户要做食品成分拆解、配料表解读、虚标鉴别类内容。
- 用户提到"反向验证""配料表能不能撑起营养成分表""净碳水/GB28050"。
- 用户发来产品包装照片(整体或特写),问"这标签合规吗 / 有没有违规 / 有没有问题 / 打不打折边球"。→ 走下方「包装照片合规审核」工作流。
核心规则(务必遵守)
GB 28050 净碳水规则:当营养成分表同时列出"碳水化合物"和"膳食纤维"时,标示的"碳水化合物"= 可用碳水(净碳水) = 总碳水 − 膳食纤维;糖醇类(赤藓糖醇、甘油等)可用碳水计 0。
→ 验证目标是让蛋白质、脂肪、可用碳水、膳食纤维、钠等已标示营养素同时对上标示值(含容差),不是单独看某项。这是强约束。
→ 未标示营养素不参与强约束验证:营养成分表没列膳食纤维/糖等项目时,不强行按 0 验证(GB 28050 允许≤0.5g/100g 标 0,且未列项目无强制约束),避免假阳性。
GB 7718-2011 降序豁免规则:配料应按加入量递减顺序排列,但加入量 ≤2% 的配料可豁免降序(条款 4.1.2.1.2)。
→ 反向验证时,标记为 le2pct 的配料不受降序约束、用量封顶 2%。这条是给产品的"合法不按降序"空间,不是用来放水的——不确定某配料是否 ≤2% 时保持默认强制降序,让结论偏严。
GB 7718-2011 复合配料展开规则:复合配料加入量 ≤25%(且已有国标/行标/地标)时可不展开原始配料;>25% 必须展开(条款 4.1.3.1.3)。
→ 配料表中未展开的复合调味料 = 不透明添加剂、用量 ≤25%,模型中按整体营养值反算、cap 取 ≤25%。若营养成分表列了"糖"且唯一含糖来源是这个未展开的复合调味料,应据"实际品尝到的甜味为主"把它按高碳水(含糖型)估算(用 inline 覆盖 carb 到 50~70g/100g),这是把味觉转化为合法输入,不是放水。
→ 括号列出具体子原料时必须展开:当复合配料括号内列明了具体子原料(如"碳低低预拌粉(硬质粗粒麦粉、小麦蛋白粉、…)""复配膨松剂(焦磷酸二氢二钠、碳酸氢钠、…)"),必须按这些真实子原料估算,禁止用"行业通用预拌粉/复合调料"的整体假设值(每家配方不同)。做法:查库/内联各子原料每100g系数,按一份合理的子原料配比加权得到该复合配料的整体系数,配比写在 assumptions 里;子原料比例未知时做低/中/高三版稳健性检查,确认结论不依赖该假设。
味觉/糖标联动:营养成分表列"糖"且数值可观 + 唯一含糖配料是未展开复合调味料 ⇒ 该调味料极可能甜味为主 ⇒ 用 inline 提高其 carb。这是本技能允许的"把实际品尝转化为模型输入"的正当途径。
工作流程
- 从照片提取数据:用户提供产品包装照片 → 读取产品名、配料表(按包装印刷的降序逐条)、营养成分表(每100g 的能量kJ/蛋白质g/脂肪g/碳水g/纤维g(未列可省略)/钠mg)、包装上明示的最低添加量(如"谷朊粉≥40%",可选)、备注(如"客服确认用脱脂亚麻籽粉",可选)。
- 原料匹配:把配料表文字与
scripts/ingredient_db.json中的原料匹配(支持中英文别名)。
- 匹配不上、或用户提供了更准确的数值 → 在输入里用inline覆盖该原料的每100g数值与行业上限cap,不要自行编造。 - 生成输入 JSON(格式见下),保存到本地。
- 技术版报告:运行
scripts/verify.py,得到分析报告 txt(自留底稿)。 - 粉丝交互版 HTML:运行
scripts/build_interactive.py,生成交互式 HTML(含顶部原始数据卡 + 综合判定 + 可拖动滑块区间探索器)。 - 交付:技术版 txt(自留)+ 交互版 HTML(直接发给粉丝/在对话中预览)。
> ⚠️ 面向粉丝的最终产物只要这一个可交互 HTML 页面即可。不要生成二维码 PNG、不要云端部署、不要长图海报。HTML 是自包含文件,手机/电脑直接打开即可。
输入 JSON 格式
{
"product": "产品名",
"label": {"energy": 472, "protein": 35.9, "fat": 1.4, "carb": 3.4, "fiber": 15.8, "sodium": 278},
// energy 可选(kJ);若营养成分表未列膳食纤维,可省略 fiber 或写 "fiber": null
"ingredients": [
{"name": "谷朊粉"},
{"name": "坚果", "min_claim": 30},
{"name": "某未知原料", "inline": {"protein":10,"fat":1,"carb":50,"fiber":10,"sodium":0,"cap":8}},
{"name": "碳酸氢钠(食品添加剂)", "le2pct": true}
],
"assumptions": ["本工具所有结果基于脱脂亚麻籽粉计算。若用普通亚麻籽粉(约35%脂肪),结论不成立"],
"options": {"descending": "weak", "decay_floor": 0.5, "tolerance": "default", "net_carb_rule": "net"}
}
字段说明:
- label.carb:营养成分表的"碳水化合物"值(当同时列膳食纤维时,按净碳水验证)。
- label.fiber:膳食纤维值;未标示时省略或填 null,不参与强约束验证。
- ingredients[].min_claim:包装明示的最低添加量(%)。
- ingredients[].inline:数据库缺失或需修正时,直接给每100g的 protein/fat/carb/fiber/sodium(mg)、是否 sugar_alcohol、cap(行业上限%)。
- ingredients[].le2pct:true 表示该配料加入量 ≤2%(GB 7718-2011 4.1.2.1.2 豁免降序排列)。标记后跳过其降序约束、用量封顶 2%。仅在能合理判断其用量 ≤2%(如食品添加剂、香精、微量营养素)时标记;不确定时保持默认(强制降序),结论偏严。
- options.descending:strict(默认,GB 7718 仅要求后项≤前项)、weak(后项≤前项且≥前项50%,额外启发式,需显式指定)、none(跳过跨配料降序约束,仅各配料"内部"降序)。
- ⚠️ 多料包/多复合配料独立产品必须用 descending:"none":GB 7718 的降序排列适用于"单一配料表"。当产品由多个独立小包装/复合配料组成(如方便面的面饼+料包、调味品的芝麻酱包/油包/汁包/菜包),各料包是独立的复合配料,国标只要求"每个料包内部"的配料按降序,料包彼此之间不强制降序。若错误地对所有顶层配料整体施加降序,会把"料包间不降序"当成矛盾,产生过约束假阳性(曾误判五谷道场热干面调味品"脂肪标低",去掉跨料包降序后翻转为合理)。因此:凡标签把产品拆成多个独立料包/子系统的,对应 input 设 "options":{"descending":"none"}。
- options.tolerance:default(蛋白±15%/脂肪±20%/净碳水±20%/纤维±15%/钠±25%)或 GB28050(统一±20%)。
- options.net_carb_rule:net(默认,GB28050净碳水)或 total(按总碳水反算)。
- assumptions(可选):字符串数组,列出计算前提假设(如"基于脱脂亚麻籽粉"),会在交互页面顶部显示为「计算前提」提示卡。
运行
第一步:技术版报告(留底用)
python scripts/verify.py 输入.json -db scripts/ingredient_db.json -out 报告.txt
第二步:粉丝交互版 HTML(交付粉丝用)
python scripts/build_interactive.py 输入.json -db scripts/ingredient_db.json -o 探索器.html
生成一个自包含的交互式 HTML(数据内嵌,手机/电脑直接打开即可,无需服务器)。
依赖:pip install scipy(仅用于线性规划反推)。
环境自检(首次运行前必做):脚本依赖 scipy,本机若未安装会直接报错。在运行 verify.py / build_interactive.py 之前,先用 WorkBuddy 托管 Python 建好虚拟环境并装依赖:
# 用 WorkBuddy 托管 Python 建 venv(路径以本机为准,按需调整)
<managed_python> -m venv <venv_dir>
<venv_dir>/Scripts/pip install scipy
# 之后运行脚本时指定该解释器
若托管环境不可用,退回到本机 python3 -m venv + pip install 同样适用。requirements.txt 已列出依赖,可直接 pip install -r requirements.txt。
粉丝交付标准(最终产物 = 可交互 HTML 页面):技术版 txt(自留)+ 交互版 HTML。
> 不要额外生成二维码、不要云端部署、不要长图 PNG。交互 HTML 已足够粉丝查看全部结论。
交互式 HTML 特性(build_interactive.py)
页面名称:小鼠检察官·营养标签检查
- 顶部「📋 包装原始数据」卡:从照片提取的营养成分表标示值(含能量 kJ)+ 配料表按降序列出。
- 顶部「🚦 综合判定」横幅:合理(绿)/ 可疑(红)+ 一句话原因。
- 营养素项动态生成:标签有几项就列几项,没测膳食纤维就不显示。
- 容差带锚点:锁定某项营养素时允许在国标容差内浮动(蛋白±15%/脂肪±20%/碳水±20%/钠±25%),不再因"精确等于标示值"的过严约束误显"无解"。
- 颜色图例:绿色条=当前可达区、灰色底=基线可达区、蓝色线=包装声称值、橙色点=当前锚点位置。
- 复合配料不确定性提示卡:检测到括号内子配料或"复合"字样时,提示内部配比无法确定、结果可能有偏差。
- 含水量检查:结构法,比对同一口径的自由水。计算「营养表反推的需额外添加水 = 总水分 − 食材自带水」,再检查它是否落在「配料表降序允许的额外添加水区间 [下限, 上限]」内(水排第 k 位时上限=100/k,第1位下限=100/N、第≥2位下限=0)。品类含水常理只做备注,不驱动矛盾判定。
- 粉丝卡含水量口径:只描述客观推算(总水分、需额外添加水、允许区间、预期口感),不下"实际口感是否合理"的实测结论;判断权交给粉丝/观众。
- 移动端优化:viewport 声明 + flex-wrap 自适应 + @media 窄屏优化 + 滑块触摸友好。
输出与三级判定
报告含:约束条件、最佳拟合配比表、Phase1 已标示营养素联合验证、Phase2 各营养素理论可达区间、不可能达标/难以同时达成的明细与主要来源拆解。
| 等级 | 含义 | 触发 |
|---|---|---|
| ✓ 合理 | 配料表能自洽解释营养成分表 | Phase1 存在配比使已标示营养素在容差内同时达标 |
| ✗ 可疑 | 至少一项已标示营养素无论如何配比都不可能达标,或多维无法同时满足 | Phase1 不可行但硬约束自洽 |
| ✗✗ 确定性虚标 | 配料表自身自相矛盾 | 降序+上限+明示下限下比例加不到100%,或降序与明示下限直接冲突(LP不可行) |
- 高度可疑:某已标示营养素标示值落在其理论可达区间
[最小,最大]之外 → 该项无论如何配比都不可能达标,近乎确定性虚标。 - 中度可疑:各项单独可达但已标示营养素无法同时满足(典型:高蛋白⇄高净碳水、高纤维⇄高添加量受降序与cap限制)。
包装照片合规审核(GB 28050 / GB 7718)
当佳玉发来产品包装照片、要你判断"违不违规 / 有没有问题"时,在反向验证之外,还要逐条核对标签是否符合国标,并指出任何不合理、易误导、打擦边球的地方。
权威依据:scripts/gb_standards_compliance.md(含 GB 28050-2011/2025、GB 7718-2011/2025 全文核心——强制项、"0"界限值、表2允许误差、表C.1含量声称阈值、NRV、配料表降序与复合配料展开、定量标示、致敏、禁用"零添加"等用语、九组审核 Checklist 与四段式输出格式)。审核前先读它。
版本口径(关键):
- 现行有效 = GB 28050-2011 + GB 7718-2011(截至 2026-08)。判定"是否违规"以此为准。
- GB 28050-2025 + GB 7718-2025 已于 2025-03-16 发布,2027-03-16 实施(两年过渡期)。其变化(强制 1+6 + "盐油糖"提示语 / 双日期 / 8 大致敏原强制 / 禁用"零添加·不添加·不含"等)作为前瞻提示,标注"2027-03-16 起将不合规",不直接算现行违规。
审核步骤:
1. 读 scripts/gb_standards_compliance.md 的 Checklist(A–H 九组)。
2. 逐项核对照片可见信息:强制标示完整性 → 营养标签(方框表/强制项/具体数值无范围/0界限值/NRV%)→ 配料表(降序/≤2%豁免/复合配料25%展开/添加剂标示/强调配料标添加量)→ 营养声称(达表C.1阈值?比较声称≥25%?功能声称未篡改?)→ 致敏 → 用语(零添加/保健暗示/虚假夸大)→ 日期 → 与反向验证联动。
3. 若照片同时给了配料表+营养成分表,先跑 verify.py 做反向验证,把"数据矛盾/疑似虚标"一并纳入结论。
4. 按四段式输出(见参考文档第四节):【总体结论】→【现行违规】(引具体条款)→【2025版过渡提示】→【反向验证】→【不合理/打擦边球】。
审核铁律:任何不合理、易误导、打擦边球之处都要提出来,不替品牌找补;区分"硬违规"与"软擦边",给佳玉做内容时证据分级清楚。
重要提示
- 数据库为估算量级(参考模型反推 + 食物成分表常识),结论用于可行性/矛盾性判定,不是精确配方还原;粉丝有真实数值时用
inline覆盖再跑。 - 营养成分表未列出的项目(如膳食纤维、糖等)不参与强约束反算,避免假阳性。
- 容差与降序模式(weak/strict)为可调假设,改变它们会影响"可达"边界,但结构性矛盾(确定性虚标)稳健。
- 详尽方法论、约束体系、容差、判定标准见
scripts/method.md;原料数据库结构见scripts/ingredient_db.json。
分发给其他 WorkBuddy 用户
本技能是生成工具,住在你的 ~/.workbuddy/skills/nutrition-label-verifier/(Windows:C:\Users\<用户名>\.workbuddy\skills\;macOS/Linux:~/.workbuddy/skills/)。普通粉丝不需要它——你发给粉丝的永远是「交互式 HTML 页面」,粉丝点开即用,零安装。
只有当同行或内容创作者粉丝也想自己用 AI 跑时,才需要把整个技能文件夹发给他:
- 把
nutrition-label-verifier/整个目录打包成 zip(排除__pycache__)。 - 对方解压到他自己的
~/.workbuddy/skills/目录下(保持文件夹名nutrition-label-verifier不变)。 - 对方重启/打开 WorkBuddy,技能即出现在可用技能列表,对话中提及"食品标签虚标检测 / 营养标签反向验证 / 配料表验证 / 小鼠检察官"即可触发。
- 对方首次使用时,本技能会自动走「环境自检」把 scipy 装好(见上)。
- 之后他发产品照片给你(或他的 AI),流程与本文档完全一致。
> 注意:本技能的全部计算依赖本地 Python 环境。对方若完全零基础,首次设置可能需要你或他的 AI 协助完成环境自检那一步;之后全自动。
局限性
本技能只做"配料表能否撑起营养成分表"的反向可行性验证,不评价安全性、合规性全文、或推荐摄入量。涉及健康建议时以科学证据为准。
作者
署名:抖音 @刘属鼠(营养 / 减肥科普自媒体)。更多配料表解读、营养成分表拆解、减肥科普内容,欢迎在抖音搜索「刘属鼠」。
> 本技能所有输出仅作个人选购辅助参考,非判定证据;最终是否合规以法定检验 / 监管部门结果为准。