2026 — 进行中

浮生

每天一个主题,把复杂信息做成能读、能点、能筛的知识看板

角色
独立开发(生成流水线 → 数据层 → 阅读前端)
技术栈
  • React
  • TypeScript
  • Vite
  • Tailwind CSS
  • ECharts
  • Supabase
  • PostgreSQL
  • GitHub Actions
  • Vercel
线上地址
打开线上站点 ↗daily-knowledge-board.vercel.app

知识类内容的成本从来不在「写」,而在「组织」:一个行业、一个事件、一个人物,查多久、怎么落成结构、配什么图、用什么形式呈现 —— 这些活每篇都要重来一遍。浮生(Immortal Blue)想验证的是:如果把这套流程整个交给流水线,人只负责定义「什么样的内容算合格」,产出还能不能保持体面。

每天是怎么生成出来的

  • GitHub Actions 定时三次(北京时间 08:00 / 16:00 / 24:00)触发,跑 api/scripts/daily-generate.js,直接调 LLM、写完 Supabase 就结束
  • 选题去重做了两道:prompt 里塞进最近 30 个已发布选题当排除列表;topics.slug 上有唯一约束兜底,撞了就换选题重试(最多 3 次)
  • 生成之外还有两件事一起跑:标签抽取和封面图检索 —— 于是一条内容落库时就已经是可筛选、有图的完整状态
  • 每个阶段的耗时记进 phase_timings,页面上能直接看到这条内容生成了多久

关键取舍

  • 生成不放在 Vercel serverless 里。 Vercel 函数 300 秒超时,跑不完一次完整生成(LLM 正文 + 标签 + 配图)。改成在 Actions 的 runner 上跑 Node 脚本,Vercel 只负责托管前端。
  • 模型是适配层之后的配置,不是代码里的常量。 OpenAI / Anthropic / DeepSeek 走同一套接口,按模型上下文窗口算安全的 max tokens,顺带估算成本;换模型只改环境变量。
  • 截断要能自己发现。 输出被上下文吃断时,自动换紧凑 prompt 重试一次,而不是往库里塞半截内容。
  • 内容是数据,不是文件。 存在 Supabase 里,因为要按分类、日期、标签做查询,用 Markdown 文件做这些很别扭。

现状

已上线,每天自动生成并发布。还没做的是用户体系(订阅、收藏)和 SSR —— 目前是纯 Vite 的 SPA,SEO 是已知短板。

← 回到作品列表