大多数天气应用的目标是让你多刷一会儿。PLOT 反着来:它加载真实天气,用 TabPFN 读你这一天,然后给你三个具体步骤,指望你关掉屏幕。

这是一个 Hacktoberfest 开源 AI 挑战第一周(Touch Grass )的提交项目。它的核心承诺只有一句:屏幕的任务,在一分钟内结束。

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

它到底回答什么问题

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

  • ⏸️ 等一等
  • 出去走走
  • 去打理花园

给出答案之后,它递给你三步清单,然后期待你离开。目标用户很明确:任何有院子、阳台或者附近有公园,却把天气预报翻来覆去过度思考、迟迟不出门的人。

数据是真的,不是合成的

这是作者最在意的部分。没有假温度。

训练数据来自 Open-Meteo 历史 API 的 ERA5 数据,覆盖 12 座城市 × 7 年的每日记录。经过特征工程后,生成 30684 行真实数据,落在 outdoor_history.csv 里。

特征包括:从最低温 0℃ 推算的 days_since_last_frost(距上次霜冻天数)、土壤湿度、风速、日照时长。标签则来自 backend/labels.py 里一套透明的园艺启发式规则——无霜日、降水、风速边界。

TabPFN 学的是表格里的模式,不是聊天散文。作者对此说得很直白。

60 秒看懂流程

整条链路是这样跑的:

  1. 你选城市或用定位
  2. Open-Meteo 提供今日温度、降雨、风、土壤,以及 92 天霜冻窗口
  3. TabPFN 分类:等待、散步、园艺,并给出类别概率
  4. 输出三步清单
  5. 你放下手机

用户旅程里有个具体例子:打开网站、选波特兰,界面请求 /api/weather,Open-Meteo 返回真实温度、霜冻滞后、土壤数据;点击获取户外信号,界面把数据 POST 到 /api/check,TabPFN 返回「园艺,83% 置信度」,界面给出三步清单,然后你走向你的院子。

架构与部署

浏览器端是静态 UI。后端跑在 Render 上,用 FastAPI(backend/main.py),核心是 OutdoorEngine 和 TabPFNClassifier。数据层是那份 30684 行的 CSV,天气层是 weather.py,对接 Open-Meteo 并带兜底方案。

模型调用很简洁:

  • TabPFNClassifier() 初始化
  • model.fit(X_train, y_train) 喂真实行
  • model.predict_proba(X_today) 输出等待/散步/园艺

这是一个开放权重的表格模型,可以随时替换而不必重写产品。

天气接口 GET /api/weather?lat=&lon= 返回今日状况加霜冻滞后。主路径是 Open-Meteo 预报,带 past_days=92 取霜冻历史;兜底路径是在免费托管触发限流时,用最近城市当天的真实 ERA5 行顶上。

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