周末在旧货店或跳蚤市场淘到好东西,接下来往往是十分钟起步的查价流程:这东西是什么、值多少钱、标题怎么写。一个周末收四十件,研究时间就把利润吃掉了。
FlipCheck 想做的事很直接:拍一张照片,把这段研究压缩到 15 秒。作者给出的卖点也简单——不是十分钟,是十五秒。
整个流程分三步,每一步做完就立刻渲染出来。你先看到它认为这是什么,可以在花掉任何市场数据之前手动改掉搜索词。
- 识别:Gemma 4 从照片里读出品牌、型号、可见成色,以及卖家会输入的那条搜索词。
- 行情:通过 SerpApi 拉取该搜索下最多 200 条在售 eBay 商品,清掉推广位、批量打包、标题不相关的条目和价格离群值。
- 定价:TabPFN 现场在这批商品上拟合一个价格模型,给出快速出手、公道价、可以等三个数字,并附上最接近的几条在售记录。
最后一步是 Gemma 4 写挂牌文案:一条不超过 80 字符的 eBay 标题、一段诚实的描述、以及商品属性,每项都配一个复制按钮。
定价这块是作者自己最满意的部分。TabPFN 是表格基础模型,一次前向传播就能拟合一张小表,不需要训练流程。所以每一次搜索都有属于自己的价格模型,拟合在那次搜索的新鲜在售数据上。
它看每条记录的成色、拍卖还是一口价、运费、卖家反馈,以及标题与搜索词的匹配程度,预测你手上这件物品对数价格的 25、50、75 分位。有效记录少于 8 条时退回普通分位数,少于 3 条就直接说数据不够。
速度上,50 条记录 0.1 秒,200 条 0.2 秒,跑在 CPU 上。测试套件里,它在合成市场上把“全新”定得高于“二手”,并保持快速出手 ≤ 公道价 ≤ 可以等。
有一个细节作者没有回避:SerpApi 的 eBay 引擎已经不再返回已售记录,eBay 的成交价接口又需要审批。所以 FlipCheck 是按当前要价定价的,并且每条结果上都写明“成交价通常还会低一些”。
识别环节踩过两个坑。第一个是让模型先看再命名——在 JSON 结构里加了一个排在最前面的字段,要求先列出照片里所有能看到的标志、标签和印刷细节,再给出物品名称。这修好了那只包的过度自信,但没修好那双球鞋:4B 模型看到的是“红色钩子”,而不是 Jumpman 标志。区分球鞋型号本身就难,真正的解法是换更大的模型。
第二个坑是小模型会编参数。挂牌文案里写 Game Boy 有“立体声能力”,实际上只有插耳机才有。提示词里已经禁止写看不见的规格,所以托管版本改用 31B 的 Gemma 4,走兼容 OpenAI 的接口,切换只改一个环境变量。
因为每次检查都要花真钱,接口做了防护:按 IP 限流,键值取自托管代理写入的地址,伪造 X-Forwarded-For 无法重置,IPv6 客户端按 /64 分组;超过 12 MB 的请求体在读之前就拒绝,解压炸弹图片也会被拦下;API 密钥不会出现在错误信息里,还有专门的测试试图把它泄露出来。CI 每次推送跑 10 个离线测试加上真实的 TabPFN 测试。
作者把开源这件事和副业成本直接挂钩:一次检查的成本要四舍五入到零,副业才成立。TabPFN 的 v2 权重是 Apache 2.0 加署名,可以商用托管,更新的权重是非商用,FlipCheck 有意选了 v2。Gemma 4 是开放权重,同一份代码能跑在笔记本的 Ollama 上、DigitalOcean 上或 OpenRouter 上,哪家涨价就改一个环境变量。对一周要定几百件价的人来说,本地模型意味着完全没有按图计费。
目前 FlipCheck 还没部署,本地三条命令就能跑起来,仓库里带了一份一键托管的 Render 配置。作者列出的下一步是:给四个示例补上真实价格、托管 31B 的 Gemma 以提升球鞋识别、以及找到第一位真实卖家。
热门跟贴