FeedLens反馈透镜

部署到个人网站

状态:FeedLens 已经放进个人网站的本地副本(projects/feedlens/),首页“项目实践”里加了入口卡片,并打成了可以直接上传的 zip。整站在本机预览验证过。还没有上传到 Cloudflare——上传需要登录你的账号,这一步由你来做。

个人网站是 Cloudflare Pages 上的 qiqixu.pages.dev,每次通过“Create deployment”直接上传整站。上线后的地址是 https://qiqixu.pages.dev/projects/feedlens/。

这次实际做了什么

以你提供的整站压缩包为底,在副本上做了两处改动,原压缩包没有动:

改动 位置 说明
新增 FeedLens 静态展示包 projects/feedlens/(34 个文件,约 0.5 MB) 与已有的 projects/mtr-easyride/ 并列。每页页脚有“← 返回个人网站”,指向首页的项目区
首页新增一张项目卡片 index.html 放在 MTR EasyRide 卡片的下面。沿用原卡片的结构和样式类,只追加了 4 行样式、一段卡片 HTML 和中英文各 5 条文案;原有内容一行没删

验证:原网站 48 个文件除 index.html 外逐字节未变;FeedLens 目录内 791 个相对链接和资源全部能解析;首页中英文切换、卡片跳转、返回链接、手机宽度下的布局都在浏览器里看过。

产物:

上传:在 Cloudflare 控制台打开 qiqixu 这个 Pages 项目,点 “Create deployment”,上传上面的压缩包(或整个 dist/qiqixu-site/ 目录)。直接上传的每次部署都是整站快照,所以传的必须是完整网站,不能只传 feedlens/。

以后更新 FeedLens(重新训练或改了文档之后):

.venv/bin/python scripts/export_static.py --out dist/qiqixu-site/projects/feedlens --home-up 2
(cd dist/qiqixu-site && zip -r -X -q ../qiqixu-product-portfolio-full-site-with-feedlens.zip . -x "*.DS_Store")

--home-up 2 表示输出目录往上两层是个人网站的根目录,用来生成“返回个人网站”的链接。如果你之后改了个人网站的其他内容,请以最新的整站目录为底重新放入 projects/feedlens/,不要用这里的旧副本覆盖。

下面是通用说明:静态包里有什么、其他部署方式、以及如何做成实时推理。

能放上去什么,不能放什么

Cloudflare Pages 托管的是静态文件,不能运行 Python 和 PyTorch,所以:

内容 能否放到 Pages 说明
项目介绍页、文档中心 能 纯静态 HTML
应用的界面 能,但是静态展示版 没有后端,不做实时推理
模型推理 不能 需要一台能跑 Python 的机器
模型权重(131 MB) 不能 超过 Pages 单文件 25 MiB 的限制,也没有必要放

静态展示版怎么保持诚实:示例输入的结果是导出时真的调用一次模型得到的输出,预先存成 JSON;页面顶部有横幅写明“没有连接模型服务、不是实时推理”,每张结果卡带“预先计算”戳记;输入示例以外的文字会被拒绝,并提示在本地启动应用。它展示的是模型真实的输出(包括判断错的那几条),只是不能现场算。

生成静态展示包

.venv/bin/python scripts/export_static.py          # 输出到 dist/feedlens/

产物(约 0.5 MB,三十多个文件):

dist/feedlens/
├── index.html          项目介绍页
├── docs/               文档中心
├── assets/             样式与图标
└── app/                应用的静态展示版
    ├── index.html
    └── data/           status.json、examples.json(预先计算的模型输出)、eval.json(评测结果)

全部使用相对路径,目录名就是网站上的子路径。想换成别的路径,改 --out:

.venv/bin/python scripts/export_static.py --out dist/projects/feedlens

本地预览(与线上相同的子路径结构):

.venv/bin/python -m http.server 8001 --directory dist

然后打开 http://127.0.0.1:8001/feedlens/。

放到 Cloudflare Pages

取决于你的网站现在是怎么部署的。以下步骤基于 Cloudflare Pages 的常规用法,界面上的具体名称请以 Cloudflare 当前的文档为准。

情况一:网站连着一个 Git 仓库(推送即部署)

把 dist/feedlens/ 整个复制到网站仓库里会被发布的那个目录下(纯静态站点通常是仓库根目录或 public/;用了框架的话是框架的静态资源目录,例如 public/ 或 static/),提交并推送:

cp -R dist/feedlens <你的网站仓库>/<发布目录>/feedlens

部署完成后访问 https://qiqixu.pages.dev/feedlens/。

情况二:网站是直接上传的(没有连 Git)

直接上传的每次部署都是整站快照,新上传的内容会替换掉原来的全部文件。所以要上传的是“你的整个网站 + feedlens/ 子目录”,不能只传 feedlens/:

  1. 在本地准备好网站的完整目录,把 dist/feedlens/ 复制进去;
  2. 在 Cloudflare 控制台里找到这个 Pages 项目,新建一次部署并上传整个目录;或者用命令行:
npx wrangler pages deploy <你的整站目录> --project-name <你的 Pages 项目名>

情况三:不想动现有网站

单独建一个 Pages 项目,只放 FeedLens,再从个人网站链过去:

npx wrangler pages deploy dist/feedlens --project-name feedlens

部署后的地址是 https://<项目名>.pages.dev/(项目名可能已被占用,需要换一个)。

在个人网站首页加一个入口

这一步已经做了(见本页开头)。卡片的文案写在个人网站 index.html 的翻译字典里,键名以 feedlens 开头,中英文各一份;想改措辞直接改那里。重新训练导致结论变化时,记得同步修改卡片上的那句评测结论。

更新

重新训练或改了文档之后:

.venv/bin/python -m feedlens.evaluate --systems all     # 如果模型变了
.venv/bin/python scripts/export_static.py               # 重新导出(会重新调用模型计算示例)

然后按上面的方式重新部署。

想要线上实时推理

需要一台能运行 Python 的服务器(约 1 GB 内存即可,不需要 GPU),在上面启动 uvicorn app.server:app,再把静态站点里“看在线示例”的链接指过去:

FEEDLENS_APP_URL=https://<你的应用地址>/ .venv/bin/python scripts/build_site.py

这一步没有做过,也没有测过公网环境下的并发和安全性。目前的后端没有访问频率限制,直接暴露到公网前需要补上。

本页由 docs/13-deploy.md 生成。