去年秋天我开始做 AI Writer 的时候,面临的第一道选择题就是:技术栈怎么选?

没有团队,没有 Ops,预算有限——这是大多数独立开发者的真实处境。这篇文章不讲大道理,只记录我在做实际产品时的技术取舍和思考过程,希望能给你一些参考。

一、选型原则:从后往前推

我的选型逻辑很简单:从最终用户感受到的体验,往前倒推需要什么基础设施。

AI Writer 的核心场景是:用户上传一篇英文论文 → 系统分析 AI 率 → 提供降 AI 改写建议。这意味着我需要:

  • 一个能处理长文本的 LLM 推理层
  • 足够快的响应速度(用户等不了 30 秒)
  • 可靠的存储(用户数据不能丢)
  • 简单的部署方式(一个人运维)

下面是我的最终选择,以及为什么选它们。

二、LLM 推理:Claude API + 多 Provider 兜底

AI 产品的核心是模型推理。我选 Claude API 作为主力有三层考虑:

质量优先:AI Writer 的核心价值是"保留学术原意的前提下降 AI 率",对语义理解能力要求很高。Claude 在长文本、学术语境下的表现是目前最好的。

但只依赖一个 provider 有风险——API 故障、限流、价格波动。所以我在架构上预留了多 Provider 切换能力:

// LLM Provider 抽象层
interface LLMProvider {
  name: string;
  chat(messages: Message[], opts?: Options): Promise<Response>;
}

const providers = {
  claude: new ClaudeProvider(process.env.CLAUDE_API_KEY),
  openai: new OpenAIProvider(process.env.OPENAI_API_KEY),
  // 未来可扩展
};

// 自动降级:主 provider 失败 → 备选重试
async function withFallback(messages, main = 'claude') {
  for (const name of [main, ...Object.keys(providers).filter(p => p !== main)]) {
    try {
      return await providers[name].chat(messages);
    } catch (e) {
      console.warn(`${name} 失败,尝试下一个`, e.message);
    }
  }
  throw new Error('所有 provider 均不可用');
}

实际的体验是:Claude API 的可用性很好,上线以来没触发过降级。但有了这套兜底,睡觉也踏实些。

三、存储:SQLite 是独立开发者的最佳朋友

在做技术选型时,我一度认真考虑过 PostgreSQL,甚至看了 Supabase。但最后选择了 SQLite——准确地说,是 Turso(基于 libSQL 的边缘分布式 SQLite)。

理由很简单:

  • 零运维:不需要连接池,不需要配置主从,不需要处理备份——Turso 自动处理
  • 足够快:对独立开发者来说,SQLite 的性能天花板非常高。单表百万条数据量级的查询,毫秒级返回
  • 开发体验好:本地开发就是文件读写,不用装数据库

如果将来业务量真的大到 SQLite 扛不住,那时候再切 PostgreSQL 也不迟。大多数项目根本活不到那一天——这听起来有点残酷,但做独立开发先活下来比什么都重要。

四、部署:最简方案

部署我选了 Vercel + Cloudflare Workers 的混合方案:

前端 Vercel(Next.js)
API 层 Vercel Edge Functions
AI 推理 Cloudflare Workers(长任务)
数据库 Turso(边缘 SQLite)
域名 Cloudflare DNS

这套组合的好处是:所有服务都有 generous 的免费额度。在用户量到几百之前,月度基础设施成本基本为 0。

五、一些经验教训

最后分享几个踩过的坑:

① 不要在早期做微服务。我一开始试图把前端、API、AI 推理拆成三个独立服务,结果花了大量时间在部署配置和服务间通信上。后来全部合并到一个 Next.js 应用里,用路径区分职责,开发效率提升了一倍。

② 流式响应是刚需。AI 产品的用户体验很大程度取决于响应速度。即使用户需要等 10 秒才能拿到完整结果,只要用流式(SSE)让用户看到文字逐行出现,感知延迟就基本消失了。

③ 数据库 schema 不要一开始就上 ORM。我早期用 Drizzle ORM,但频繁的需求变更导致 migration 文件膨胀。后来直接写 raw SQL,反而更清晰——当然这只是个人偏好,小团队的优势就是可以随时改主意。


以上是在构建 AI Writer 过程中的真实技术决策。没有哪个选择是完美的,技术选型本质上是在有限资源下做 trade-off。

如果你也在做类似的事,欢迎 发邮件 一起交流——独立开发者的路,一个人走有时候挺孤独的。