食品标签合规自查
贴一段配料表 + 一串营养成分数值,立刻告诉你哪几项会在抽检时被判不合格、违反哪一条、怎么改;再顺手告诉你 2027-03-16 新国标生效后,这张标签还得改哪几项。
为什么不用图片识别:同类工具都要你上传标签照片或 PDF 稿,靠视觉模型读表格。但标签真正出事的地方是数值——NRV% 算错、能量标低、写了「高蛋白」蛋白质却只有 5g。这些用算术就能查,而且比看图准得多。图糊了、拍歪了、表格线断了,视觉方案就漏判;算术不会。
一、它查什么
第 1 类 · 强制标示项缺失(GB 7718)
食品名称、配料表、净含量、生产者信息、生产日期、保质期、贮存条件、SC 编号、产品标准代号——九项逐条对,缺哪项报哪项。另查营养成分表「1+4」(能量/蛋白质/脂肪/碳水化合物/钠)缺项,这是抽检最常见的不合格点。
第 2 类 · 配料表写法违规
- 括号外用「等」概括配料(GB 7718 4.1.3.1);括号内的举例不算(如「植物油(棕榈油等)」)
- 添加剂用俗称:味精→谷氨酸钠、小苏打→碳酸氢钠、甜蜜素→环己基氨基磺酸钠
- 添加剂只写类别名:「防腐剂」「色素」必须换成 GB 2760 规范名称
- 复合配料未展开(酱油、豆瓣酱等加入量 ≥25% 需括号展开)
- 配料第一位异常(写「水」但产品名不是饮料)
- 含麸质/乳/蛋/大豆等致敏物质却无提示
第 3 类 · 营养成分表算术(GB 28050)
- 能量低标:标示值低于 17P+37F+17C(+8×膳食纤维)换算值的 80%,实测必然超过标示值的 120%,抽检直接判不合格
- NRV% 算错:蛋白 8g 标成 30%(应为 13%)
- 含糖醇的产品会自动识别,不会误报(赤藓糖醇 0 kJ/g,能量天然偏低)
第 4 类 · 营养声称不达标(GB 28050 附录 C)
低能量/无能量/低脂/脱脂/低糖/无糖/无蔗糖/低钠/高蛋白/高纤维/高钙/低饱和脂肪/无胆固醇等 22 项阈值逐条比对。饮品和固体阈值不同,脚本按 --liquid 自动切换。
第 5 类 · 2027-03-16 新国标待改项(单列一块,不混进现行结论)
- 营养成分表「1+4」→「1+6」,新增饱和脂肪、糖为强制项
- 八大致敏物质(麸质谷物/甲壳类/鱼/蛋/花生/大豆/乳/坚果)从推荐改为强制标示
- 禁用「零添加」「不添加」「不使用」「无添加」类表述;禁用「特供/专供/内供」
- 生产日期与保质期到期日双日期标示
- 营养成分表下方加注「儿童青少年应避免过量摄入盐、油、糖」
新规依据:GB 7718-2025、GB 28050-2025、《食品标识监督管理办法》于 2025-03-16 发布,2027-03-16 施行,旧版同步废止。
二、怎么用
# 最快:把整段标签文字粘进去(推荐,字段自动拆)
python3 check_label.py --text "食品名称:高钙苏打饼干
配料:小麦粉、棕榈油、白砂糖、奶粉、小苏打、等
净含量:400g
生产日期:2026-08-01
保质期:9个月
贮存条件:阴凉干燥处
产品标准号:GB/T 20980
SC12345678901234
营养成分表
能量 1850kJ 22%
蛋白质 6.0g 10%
脂肪 18.0g 30%
碳水化合物 62.0g 21%
钠 480mg 24%"
# 跑内置样例,先看输出长什么样
python3 check_label.py --sample
# 逐项传参
python3 check_label.py \
--name "高蛋白饼干" \
--ingredients "小麦粉、白砂糖、植物油、味精" \
--nutrition "能量:1900,蛋白质:5,脂肪:18,碳水化合物:65,钠:300" \
--claims "高蛋白,无糖" \
--net-weight "500g" --producer "某食品有限公司" --sc-code "SC11312345678901"
# 从 JSON 读(字段最全,可带 NRV% 做算术核对)
python3 check_label.py --input label.json --json
# 液体食品(阈值不同);小包装(≤100cm² 可豁免营养表)
python3 check_label.py --text "..." --liquid
python3 check_label.py --input small.json --small-package
输入字段
| 字段 | 说明 |
|---|---|
--text |
整段标签原文,自动拆出名称/配料/净含量/日期/SC/标准号/营养成分/NRV% |
name |
食品名称 |
ingredients |
配料表原文,逗号/顿号分隔 |
nutrition / nutrition_text |
营养成分,如 能量:2000,蛋白质:8,脂肪:20;「糖」单独成项,不会并进碳水 |
nrv_percent |
标签上印的 NRV%,如 {"蛋白质": 13},传了才做算术核对 |
claims |
营养声称,逗号分隔,如 高蛋白,无糖,高钙,无蔗糖 |
net_weight producer production_date shelf_life storage sc_code standard_code |
强制标示项 |
allergen_note |
致敏原提示原文,有则不再报缺 |
expiry_date_marked |
是否已标「保质期到期日」(新规双日期) |
kids_tip |
是否已有儿童青少年提示语(新规) |
liquid / small_package |
液体食品 / 小包装豁免 |
输出
两块分开给,因为现行违规要立刻改,新规待改可以排到改版时一起做:
现行口径结论:不合格 评分 25/100
现行口径:必改 3 · 建议改 1 · 提示 0
2027-03-16 新规:还有 5 项要改(现在改一次到位)
每条问题四行:依据哪一条、为什么算违规、怎么改、改完是什么样。有必改项时附《食品安全法》第一百二十五条的罚则。
三、几个必须说清的专业点
能量方向不能搞反。 GB 28050 允许误差是「实测值 ≤ 120% 标示值」。所以标示值偏高是保守标注、合法;标示值偏低才会让实测超标。很多工具反过来判,会把合规标签判成不合格。
「无糖」不能用总碳水判。 糖是碳水化合物的一部分,碳水 70g 的产品糖可能只有 0.3g(其余是淀粉)。成分表没单列糖时,本工具报「无法验证」并要糖的检测数据,不会直接判你不合格——乱判会让你拿着错结论去改配方。
「无蔗糖」查的是蔗糖,不是总糖。 用果葡糖浆替代蔗糖的产品总糖可能更高,这种写法本身容易被职业打假人盯上,工具会提示而不是放行。
致敏原现行是推荐、新规是强制。 所以含致敏物质无提示在现行口径判「有风险」(中风险),在新规块判「必改」,两边都列出来,你一次改到位。
配料递减顺序查不了。 不知道实际加入量就无法验算排序,只能查明显异常(如第一位是水但产品是固体食品)。这类需要配方表才能判,工具不猜。
四、不适用
- 不替代检测机构的成分检测:工具只校验标示内容的自洽性与法规符合性
- 不查进口食品的中文标签备案、不查保健食品蓝帽子、不查婴配乳粉的注册号
- 不查包装上的广告用语(那是广告法范畴,用「电商文案合规体检」)
- 不识别图片里的标签,只处理文本
- 新规块只覆盖 5 项(1+6、致敏原、禁用「零添加」、双日期、儿童提示语),不覆盖数字标签、进口背标、分装/委托生产标注等版面类要求
五、文件
check_label.py—— 主程序,纯标准库,无网络请求test_label.py—— 自测:12 条合规标签 + 12 条违规标签,误报 0、漏报 0;另测新规检出与文本解析,耗时 <0.1sreferences/GB7718-必标项与罚则.md—— 九项强制标示的逐条要求与常见错法references/GB28050-营养声称阈值表.md—— 22 项声称的阈值表与 NRV 参考值references/2027新规对照清单.md—— 新旧国标逐项对照与改版顺序
> 结果为规则匹配的参考提示,最终以监管抽检结论和检测报告为准。
输入输出示例
- 输入:一款红枣枸杞饮料的完整配料表 + 营养成分表照片文字
- 输出:逐项核查结论(配料表顺序是否符合递减原则、声称"低糖"是否满足 GB28050 阈值、标签警示语是否缺失)+ 不合格项的整改写法。
常见问题
- 新国标 GB7718-2025 怎么算? 技能同时按现行版和 2027-03-16 强制实施的新版对照输出,过渡期内两种口径都会标注。
- 我只拍了一半标签能查吗? 不建议。缺失的信息会以「无法核查」列出,结论可信度下降;至少要有完整配料表和营养成分表。