一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

从零搭建本地 AI 平台:一次完整开发复盘

时间:2026-09-21 10:26:01 编辑:袖梨 来源:一聚教程网

从对话界面到知识库检索,再到桌面端打包,一个本地 AI 平台看似只是把若干成熟组件组合起来,真正落地时却会遇到架构边界、原生模块兼容、密钥存储和流式中断等一连串工程问题。下面结合一次完整开发经历,梳理这些问题的处理方式及其背后的取舍。

从 0 到 1 做一个本地 AI 平台,我学到了什么

一个人、一台机器、一套代码,走完产品全流程的复盘。

这个项目是什么

一个私人 AI 助手:对话、知识库 RAG、自定义助手人设,Web 模式和桌面端(Electron)双交付。技术栈是 Next.js 14 全栈 + Electron + SQLite + pnpm Monorepo。

从零到能打包交付,踩了不少坑,也沉淀了一些方法论。

学到的 10 件事

1. 分层是一个人开发的护城河

Monorepo + 单向依赖 + 服务层,让改动有边界。改数据库不影响前端,换供应商不影响 UI。没有分层,一个人维护全栈就是噩梦。

2. 原生模块的 ABI 问题要提前想清楚

Electron + better-sqlite3,差点让我放弃桌面端。最终方案是 fork 真实 Node 子进程,原生模块跑在和编译时一致的运行时里。遇到 dlopen 报错,先查 NODE_MODULE_VERSION

3. 密钥安全是底线,不是可选项

API Key 明文落库 = 把钥匙放在门口。加密落盘 + 永不返回明文 + 本地服务令牌守卫,三层防护缺一不可。用户把 Key 交给你,你要对得起这份信任。

4. 流式对话的中断语义要设计好

用户点停止,已生成的内容不能丢。abort 后写回已生成内容、消息置 stopped,是体验细节,也是工程素养。

5. 小体量数据别上重型组件

几百篇文档的知识库,SQLite + sqlite-vec 完全够。归一化向量后 L2 等价余弦,一个文件搞定。不要为了「技术先进」引入运维负担

6. 统一 API 契约省掉一半联调时间

{ success, data } / { success, error: { code, message } } + 领域错误码,前端零猜测。前后端类型同源(Zod schema),改一处全链路生效。

7. 测试里绝不调真实 API

慢、贵、不稳定。100% mock 外部调用,测试验证的是你的代码逻辑,不是模型质量。依赖注入让 mock 变得简单。

8. 300 行规则是给「未来的自己」的礼物

超长文件 = 认知过载 = 改不动。设个数字红线,用脚本强制,逼自己拆。维护成本在写的时候就付了,后面都是收益。

9. 一个人也要有 CI

没人评审,CI 就是 reviewer。typecheck + lint + 行数 + 覆盖率,全绿才提交。不是为了好看,是为了改代码不害怕。

10. 文档不是交付后的事

架构文档、接口文档、模块设计,边写代码边更新。代码会忘,文档不会。三个月后回来,文档是你和过去自己的对话

踩过的坑(避坑指南)

症状解法
Electron fork 子进程 ABI 不匹配窗口 30s 不出现打包内置真实 Node,fork 指定 execPath
fork 无 error 子进程崩溃无日志加 error/exit ,转发 stdout/stderr
Smart App Control 拦截未签名 exe打包产物无法启动用官方签名 electron.exe 作为宿主加载 asar
SSE 半包解析失败流式内容错乱逐字符状态机 parser,不依赖完整行
密钥明文出参安全漏洞仓储层分脱敏视图和含密文行,服务层才可取密文
数据库写入非单一事务崩溃后数据不一致四步写库包进一个 db.transaction
未子进程端口回收重启端口被占will-quit 先 SIGTERM 再 SIGKILL

独立开发的心态

一个人做全栈产品,最大的挑战不是技术,是取舍

  • 什么该自己做,什么用现成的(SQLite 不自己写,UI 组件用 shadcn)
  • 什么现在做,什么以后做(Ollama 适配器先预留,不实现)
  • 什么是必须的,什么是锦上添花(密钥安全必须,主题切换锦上添花)

不要追求完美,追求能用、好维护、能迭代

下一步

这个项目还能继续:

  • Ollama 本地模型适配器(完全离线)
  • 多模态(图片理解、文档解析增强)
  • 对话导出 / 数据备份
  • 插件系统(函数调用)

但核心闭环已经跑通:配置供应商 → 创建助手 → 对话 → 知识库 RAG → 桌面打包。

写在最后

从 0 到 1 做一个产品,技术只是其中一部分。架构决策、工程规范、测试体系、文档习惯,这些「非功能」的东西,决定了项目能不能活下去、能不能长大。

希望这个系列能给你一些启发。如果你也在做自己的 AI 应用,记住:先让它跑起来,再让它跑得好

热门栏目