一个反着做的天气应用

大多数天气应用的目标是让你多刷一会儿。PLOT 的目标正好相反:看完就走。

打开网易新闻 查看精彩图片

你选一个地点,或者直接共享定位,真实天气数据加载进来。然后 TabPFN——一个开放的表格基础模型——把你这一天的天气当成表格里的一行来读,给出三个答案之一:等一等、去散步、去打理花园。

接着它给你三条具体步骤,然后指望你关掉屏幕出门。整个界面的任务,被压缩在一分钟以内。

它到底给谁用

目标用户说得很直白:家里有院子、有阳台,或者附近就有公园,但习惯把天气预报翻来覆去地看、却迟迟不出门的那批人。

这个定位本身就挺有意思。它不解决"天气怎么样"的问题,它解决"知道了天气之后你到底动不动"的问题。

数据是真的,不是编的

这个项目最在意的部分,是训练数据。没有假温度。

数据来自 Open-Meteo 的历史接口(ERA5),覆盖 12 座城市、7 年的逐日记录。经过特征工程后,落成一张真实表格 outdoor_history.csv。

特征包括几项:

  • 距上次霜冻的天数,由最低温 0℃ 推算
  • 土壤湿度
  • 风速
  • 日照时长

标签不是模型瞎猜的,而是来自一套透明的园艺经验规则,写在 labels.py 里——无霜日、降水、风速边界。TabPFN 学的是这张表里的模式,不是聊天文本。作者自己也把这一点讲得很清楚。

流程拆开看就四步

第一步,你选城市或用定位,前端向 Open-Meteo 请求真实天气。

第二步,后端拿到今日气温、降水、风速、土壤数据,同时拉取 92 天的霜冻窗口。

第三步,TabPFN 做分类,输出 wait、walk、garden 三个类别以及各自的概率。比如演示里给出的结果是 garden,置信度 83%。

第四步,界面给你一张三步清单,然后结束。清单的终点是门口。

技术选型上的几个取舍

TabPFN 用的是开放权重版本,通过 tabpfn_client 调用,fit 真实行、predict_proba 出结果。作者强调的一点是:这个模型可以换掉,而不用重写整个产品。

天气接口有主备两条路。主路是 Open-Meteo 预报,带 past_days=92 拿霜冻历史;备用路是在免费托管被限流时,取最近城市的真实 ERA5 行,对应今天的日历日。

部署在 Render 上,用 render.yaml 蓝图,健康检查在 /api/healthz,TABPFN_TOKEN 放在环境变量里,从不提交。

界面刻意做得很克制:没有聊天气泡,没有紫色渐变,一个品牌、一个行动按钮、一张结果卡。城市预设覆盖 12 种气候,支持浏览器定位,支持刷新实时天气。

为什么这件事值得用表格模型

作者给出的理由很直接:霜冻和种植决策本身就是表格形态的数据。它们属于电子表格,不属于聊天线程。

一个封闭的聊天接口,拿到"距上次霜冻 208 天"这种字段,未必知道该怎么处理。而 TabPFN 就是为这种列而生的。

隐私方面,定位不被存储,天气按请求实时拉取。训练表随仓库一起发布,可以审计。离线路径也留了:CSV 加开放模型的组合,意味着在缓存了数据行的情况下,一台笔记本就能在野外跑起来。

顺带一提,首次在 Render 免费层加载,服务唤醒大约需要 30 秒。

它想让你做的事只有一件

PLOT 是 Hacktoberfest 第一周"Touch Grass"主题的参赛项目。它的口号是:离开屏幕,照料土地。