双十一购物算账助手:比价 / 值不值 / 囤货 / 国补
这个技能解决什么
双十一、618、年货节买之前,用户真正要算的是四笔账:
- 同款全网比价:淘宝、京东、拼多多同款,哪个到手价最低?
- 大件值不值:这个东西该不该买?是真需求还是冲动?
- 家庭囤货测算:按家里消耗速度,这次该囤多少?会不会囤多?
- 国补到手价核算:国补能补多少?叠完券最终到手多少?
四个模式共用一套本地确定性计算引擎,不联网也能算,不要求任何密钥。价格数据来自用户提供或搜索线索,工具只负责把账算准、把口径讲清。
> 定位边界(必须如实告诉用户):本技能是「买前算账器」,不是实时价格数据库。不能替代慢慢买/Keepa 的历史价格曲线,不能自动抓取淘宝/京东/拼多多商品页实时价,也不能替用户下单或领券。
模式路由
| 用户说的话 | 用哪个模式 | 脚本子命令 |
|---|---|---|
| 同款比价、哪个平台便宜、淘宝 vs 拼多多、到手价对比 | 同款全网比价 | compare |
| 大件值不值、该不该买、这钱花得值吗、冲动消费 | 大件值不值 | worth |
| 囤货、囤多少、纸巾/洗衣液/大米买几箱、怕囤多/囤少 | 家庭囤货测算 | stockpile |
| 国补、补贴、以旧换新、到手价、能省多少 | 国补到手价核算 | subsidy |
| 国补政策是什么、哪些品类能补、补多少 | 政策速查 | policy |
| 家庭日用品一个月用多少、保质期多久 | 参考表 | ref |
如果用户一句话里混了多个需求(例如"这个空调国补后多少钱,顺便看看京东和淘宝哪个便宜"),先跑 subsidy 算单平台到手价,再用 compare 做多平台对比,最后合并成一张结论表。
统一工作流
- 判断模式:按上表路由。
- 收集最小输入:先看用户已经给了什么,只追问缺的关键项;能合理默认的先默认,并在结果里标注假设。
- 写 JSON 输入:把结构化数据写到
.temp/shopping-input-<mode>.json(不要写到用户目录)。 - 运行脚本:
python3 scripts/shopping_calc.py <mode> --input <json>;需要结构化结果时加--json。 - 呈现结论:先给一句话结论,再给明细表,最后给"下单前核验清单"和口径说明。
- 诚实收口:价格是用户提供/搜索线索就明确说;国补是政策快照就说快照日期;不承诺"全网最低"。
脚本路径相对于技能目录:scripts/shopping_calc.py。如果当前目录不确定,用技能目录的绝对路径调用。
模式一:同款全网比价(compare)
最小输入
- 商品名(同款同规格,写清型号/容量/版本)
- 至少 2 个平台的报价;每个平台尽量提供:标价、直降、店铺券/品类券、满减、VIP 折扣、红包、以旧换新折价
- 如果商品参加国补:补充品类、能效等级(家电)、本人本类名额是否已用
输入 JSON 示例
{
"product": "小米15 12+256G",
"offers": [
{
"platform": "京东",
"list_price": 3598,
"direct_discount": 200,
"coupons": [{"name": "店铺券", "amount": 200}, {"name": "品类券", "amount": 100}],
"full_reduction": {"threshold": 300, "amount": 50},
"vip_discount_rate": 0.95,
"red_packet": 50,
"trade_in": 0,
"subsidy": {"enabled": true, "category": "phone", "per_person_used_in_category": 0}
},
{
"platform": "拼多多",
"list_price": 3099
}
]
}
字段说明:
- full_reduction:threshold 是"每满多少",amount 是"减多少";按券后价计算可减次数。
- vip_discount_rate:0.95 表示 95 折;不填按无折扣。
- subsidy.enabled:是否叠加国补;category 可省略,脚本会按商品名自动识别。
- total_units + unit_name:同款不同规格时填总计量(如 2400 抽),脚本会算单位价并提示哪个更划算。
- 所有金额为单件口径,不乘购买数量。
输出怎么读
- 到手价:按"标价 → 直降 → 券 → 满减 → VIP → 红包 → 以旧换新 → 国补"顺序模拟。
- 共省:标价 − 到手价,含国补。
- 国补列:该平台该商品可叠加的国补金额;"不符合资格"会在风险提示里说明原因。
- 单位价提示:如果各平台规格不同,会额外提示"按单位价谁更划算"。
必须说的边界
- 结果是基于用户提供价格的模拟,不是实时抓取;下单前以平台结算页为准。
- 不承诺"全网最低",只承诺"在你提供的报价里,哪个到手价最低"。
- 如果用户只给了一个平台的价格,明确告诉用户"这不是比价,我可以先帮你算这一单的到手价,再补另一个平台就能对比"。
模式二:大件值不值(worth)
最小输入
- 商品名、价格
- 可选但强烈建议:月收入或月可支配收入、预计月使用次数、预计使用年限、是否有替代品、租用单次价格
- 需求自查四问:旧物是否损坏、是否无可替代、是否 30 天前就已计划、72 小时后是否仍想要
输入 JSON 示例
{
"item": "跑步机",
"price": 3999,
"monthly_income": 15000,
"monthly_disposable": 6000,
"expected_lifetime_months": 60,
"usage_per_month": 8,
"has_substitute": true,
"rental_alternative_per_use": 30,
"necessity": {
"old_broken": false,
"no_substitute": false,
"planned_30days": false,
"still_want_after_72h": true
},
"category_idle_rate": 0.6
}
评分逻辑(确定性,0–100)
| 维度 | 满分 | 怎么算 |
|---|---|---|
| 需求真实度 | 25 | 旧物损坏 6 + 无可替代 8 + 30天前已计划 6 + 72小时后仍想要 5;有替代品再扣 4 |
| 使用频率 | 20 | ≥8次/月 20;4–7次 15;1–3次 9;<1次 4 |
| 单次使用成本 | 20 | 价格 ÷ 预计总使用次数;有租用价时与租用比 |
| 预算冲击 | 20 | 价格 ÷ 月可支配收入;≤10% 20;≤30% 14;≤50% 7;>50% 一票否决 |
| 时间成本 | 15 | 价格 ÷ 时薪(月薪÷174);≤8小时 15;≤24小时 11;≤80小时 6;>80小时 2 |
未回答项处理:需求四问任一项未回答时,按"否"计 0 分,并在输出里列出未回答项;不猜测、不默认"是"。
has_substitute 与 necessity.no_substitute 必须逻辑一致;两者冲突时以 necessity 为准,脚本会给出提示。
结论分档:
- ≥75:建议买
- 55–74:可以买,但先想清替代方案
- 35–54:建议缓一缓
- <35:不建议买
- 预算占比 >50%:不论总分,直接"不建议现在买(预算红线)"
冷静期按价格分级:<100 元 50 分钟;100–999 元 12 小时;1000–4999 元 24 小时;≥5000 元 3 天。输出会给出截止时间。
必须说的边界
- 分数基于用户自报的使用预期和收入,未来真实使用频率无法被工具预知;分数是决策辅助,不是替用户拍板。
- 不要编造"这个品类二手保值率/故障率"等数据;如需品类口碑,可联网搜索并标注来源,或只给通用提示。
模式三:家庭囤货测算(stockpile)
最小输入
- 家庭人数
- 商品清单:品名、整包价、每包几件、销售单位、现有库存
- 月用量可自报;不报则按内置"三口之家参考值 × 家庭系数"估算(会自动标注是参考值)
- 可选:保质期、日常价(算省多少)、囤货预算、大促总预算
输入 JSON 示例
{
"family_size": 3,
"months_to_next_promo": 6,
"budget": 800,
"items": [
{
"name": "抽纸",
"category": "paper_towel",
"pack_spec": "3层100抽×24包",
"pack_price": 59.9,
"pack_qty": 24,
"sale_unit": "包",
"unit_count": 100,
"unit_name": "抽",
"current_stock": 4,
"regular_price": 79.9
},
{
"name": "大米",
"category": "rice",
"pack_price": 59.9,
"pack_qty": 1,
"sale_unit": "袋",
"base_units_per_sale_unit": 10,
"current_stock": 0.5
}
]
}
字段说明:
- pack_price 是整包/整箱价,pack_qty 是这一包里有几个销售单位(如 24 包)。
- monthly_usage 单位是"销售单位/月"(如 7 包/月);不填则按 category 查参考表。
- 参考表单位与销售单位不一致时(如大米按 kg、销售按 10kg/袋),用 base_units_per_sale_unit 换算。
- unit_count + unit_name 用来算"元/抽"这类单位价;不填则算"元/销售单位"。
- category 合法值必须来自 data/household_usage.json 的键:paper_towel、toilet_paper、laundry_detergent、laundry_pods、dish_soap、rice、flour、cooking_oil、toothpaste、shampoo、body_wash、hand_soap、trash_bag、diaper、disinfectant、battery。写错会直接报错,不会静默按错误品类估算;自定义品类请省略 category 并直接提供 monthly_usage。
- months_to_next_promo 按"当月至下次大促月"的整月数:11月双十一→次年6月618填7;6月618→11月双十一填5;不确定填6(脚本按6+1个月缓冲计算)。
计算规则
建议囤量 = 月用量 × 可囤月数 − 现有库存
可囤月数 = min(距下次大促 + 1个月缓冲, 12个月红线, 保质期 ÷ 3, 品类特殊上限)
品类特殊上限:
- 纸尿裤:2 个月(按尺码买,不按折扣囤)
- 消毒液:3 个月(只囤一季)
- 食用油:6 个月(开封后 3 个月内用完)
- 垃圾袋:6 个月(折扣可忽略,不值得专门囤)
输出怎么读
- 建议囤:扣掉现有库存后的建议购买量(销售单位)。
- 折合包数:按整包向上取整,避免拆零买不到。
- 单位价:元/抽、元/卷、元/克;只按单位价比,不被"大包装省多少"话术带走。
- 备注:保质期压缩原因、品类特殊规则、规格障眼法提示。
- 超预算会明确警告,并建议优先保刚需、砍低弹性品类。
必须说的边界
- 参考用量是媒体经验值,不是统计年鉴;用户自报优先。
- 无法感知用户家里真实库存,
current_stock必须由用户提供或确认。 - 不替用户决定"必须囤",只给建议区间和约束条件。
模式四:国补到手价核算(subsidy)
最小输入
- 商品名、标价
- 品类(可省略,按商品名自动识别)
- 家电:能效等级(2026 年仅 1 级能效/水效可补)
- 优惠明细:直降、店铺券、品类券、满减、VIP 折扣、红包、以旧换新折价
- 本人今年该类国补名额是否已用
输入 JSON 示例
{
"product": "1.5匹一级能效空调",
"category": "ac",
"list_price": 4000,
"energy_level": 1,
"discounts": [
{"name": "平台直降", "amount": 300},
{"name": "店铺券", "amount": 200},
{"name": "跨店满减", "amount": 300}
],
"vip_discount_rate": 0.95,
"red_packet": 50,
"include_red_packet_in_base": true,
"trade_in_value": 0,
"per_person_used_in_category": 0
}
字段说明
discounts:所有优惠按固定金额填(直降/店铺券/品类券/跨店满减)。full_reduction:如果是"每满 300 减 50"这种阶梯满减,可改用{"threshold": 300, "amount": 50},脚本会按券后价自动算可减次数;也可先按结算页折算成固定金额填进discounts。vip_discount_rate:0.95 表示 95 折。include_red_packet_in_base:红包是否计入国补基数,默认true;平台明确"红包不计入基数"时改成false。per_person_used_in_category:本人今年该品类已用名额数,≥1 则不享受国补。
2026 年规则要点(内置快照)
| 项目 | 家电 6 类 | 数码 4 类 |
|---|---|---|
| 品类 | 冰箱、洗衣机、电视、空调、电脑、热水器 | 手机、平板、智能手表手环、智能眼镜 |
| 门槛 | 仅限 1 级能效/水效 | 单件销售价 ≤6000 元 |
| 比例/封顶 | 15%,单件最高 1500 元 | 15%,单件最高 500 元 |
| 限购 | 每人每类 1 件(全国互斥) | 每人每类 1 件(全国互斥) |
| 基数 | 扣除各环节优惠后的最终销售价 | 同左 |
| 期限 | 2026-12-31 截止,先到先得 | 同左 |
include_red_packet_in_base:红包是否计入国补基数存在平台差异,默认 true(先抵红包再算国补,更保守);如果用户平台明确"红包不计入基数",改成 false。
输出怎么读
- 瀑布表:标价 → 各项优惠 → 红包 → 以旧换新 → 国补基数 → 国补 → 最终到手价。
- 资格核验清单:品类、能效/价格门槛、每人每类名额、三一致、地区额度、截止日期、结算页国补立减。
- 不符合资格时明确说原因,不硬算补贴。
必须说的边界
- 国补政策是 2026 年快照,2027 年可能调整;跨年后先
policy看快照日期,并提示用户复核当期政策。 - 无法查询用户所在省市的实时补贴余额/线上额度;只能给"先到先得、可能已耗尽"的提示。
- 平台结算页是最终权威,工具算的是规则推演值。
价格数据从哪来(诚实边界,必须遵守)
优先级从高到低:
- 用户提供:截图、订单页、商品页价格、口述。让用户确认"标价/券后价/是否含运费"。
- 联网搜索线索:可用
online_search搜"商品名 + 京东/淘宝/拼多多 + 价格",或抓取什么值得买好价页/慢慢买搜索页;必须标注"搜索线索,非实时结算价",并给出处。 - 平台商品页直抓:不要承诺。京东/淘宝/拼多多有风控,脚本不内置抓取;如果浏览器能打开,人工核对可以,但不要写成"自动实时比价"。
铁律:
- 不虚构价格。没有价格就向用户要,不要"估一个"。
- 不虚构优惠。用户没说的券/满减,不要自己加。
- 不承诺全网最低。只说"在你给的报价里最低"。
- 不替用户下单/领券/支付。
结果呈现规范
- 先给一句话结论(如"京东到手价最低,¥2,055.38,比淘宝便宜 ¥22.56"),再给明细表。
- 表格列不要超过 7 列;手机屏幕上看不清时,拆成两张表。
- 金额统一
¥1,234.56;单位价小于 1 元时保留 3–4 位小数(如¥0.025/抽)。 - 风险提示、资格清单、口径说明放在结论之后,不要抢在结论前面。
- 不生成 HTML 报告(默认聊天内表格即可);用户明确要报告时,再按苹果设计美学另做页面。
常见问题
Q1:能自动查淘宝/京东/拼多多的实时价格吗?
不能稳定自动抓取(平台有风控)。本技能的做法是:你提供价格/截图,或用搜索线索辅助,本地算准到手价。实时价格库请配合慢慢买等工具使用。
Q2:国补算出来的数和结算页不一样?
国补按"扣除各环节优惠后的最终销售价"计算,红包是否计入基数各平台有差异;以结算页为准。把结算页的优惠明细发我,我可以按你的实际顺序重算。
Q3:囤货参考用量准吗?
是媒体经验值(三口之家),不是统计数据。你家实际用量优先;不确定就"记两周再乘二"。
Q4:值不值评分能替我做决定吗?
不能。它把"需求真伪、使用频率、单次成本、预算占比、时间成本"摊开给你看,帮你想清楚;未来真实使用频率只有你自己知道。
Q5:支持 2027 年国补吗?
内置的是 2026 年规则快照。2027 年政策出台后更新 data/guobu_rules_2026.json 即可;跨年后先提醒用户复核当期政策。
数据与文件
| 文件 | 用途 |
|---|---|
scripts/shopping_calc.py |
四模式计算引擎(纯标准库,Python 3.8+) |
data/guobu_rules_2026.json |
2026 国补规则、品类、封顶、清单(机器可读) |
data/household_usage.json |
家庭日用品月用量、保质期、特殊规则(机器可读) |
references/guobu-2026.md |
国补政策依据、来源、真实案例(人读版) |
references/household-consumption.md |
家庭消耗参考表与囤货方法论(人读版) |
references/worth-it-method.md |
大件值不值评分方法与来源 |
references/price-data-guide.md |
价格采集、平台优惠顺序、诚实边界 |
references/user-guide.md |
大白话使用说明(给普通用户看) |
安全与边界
- 所有计算在本地完成,不上传价格、收入、家庭数据。
- 不执行购买、支付、领券、下单等交易动作。
- 不提供"逃税/骗补/虚假申报"建议;国补资格以官方规则和平台核验为准。
- 政策数据标注快照日期与来源;不把过期规则说成现行规则。