朱曦霖
联系Available for work
← AI 数字分身

AI 数字分身

系统架构

无状态 FastAPI 后端 + 原生 Web Component 前端

后端不存会话,浏览器带着最近历史来;私密原始资料与可部署资料物理隔离;生产边界是代码级锁死的,不是配置项。

调用链

个人网站 / Web Component
             │ HTTPS 上的 JSON 或 SSE

FastAPI:请求校验 → 人设装配 → 对话服务 → Provider 适配层
             │                                    │
             │                                    ├── 托管 API(当前生产默认)
             │                                    ├── 本机 llama.cpp(开发阶段)
             │                                    └── HTTPS + API-key 的自托管模型主机(已就绪)
             └── 只读的、经本人批准的人设文件

Provider 适配层是这套架构里唯一为「以后要换模型」预留的位置。上面三条后端走同一个接口,切换不影响前端契约。

部署拓扑

静态前端由自有域名提供,FastAPI 以单实例部署在免费容器平台上。镜像从仓库根目录构建,这样容器里能同时拿到后端运行代码和根目录那份只读人设。

关键架构决策

后端无状态。 会话历史由浏览器携带。代价是每次请求要多传一点数据,换来的是服务端可以随时重启、扩缩、迁移,也不存在「服务器上留着谁的聊天记录」这个问题。

私密原始资料与可部署人设物理隔离。 两个目录,只有后者进镜像。

开发可以无 API Key 启动,生产就绪检查必须严格。 本地开发不该被密钥卡住,但生产环境缺任何一项都不许起。

前端用 Shadow DOM。 组件嵌进任何页面都不会污染宿主样式,宿主的 CSS 也影响不到它。

生产 CORS 不是可配置列表,是代码级锁定的两个 origin。 多一个、少一个、出现通配符,服务直接拒绝启动。

部署蓝图显式声明免费套餐、单实例、关闭自动部署,不创建数据库或磁盘。 成本边界写进版本控制,而不是靠记得。

容器用锁文件构建、非 root 用户运行、exec 启动进程,确保平台发来的 SIGTERM 能真的到达进程,而不是被 shell 吞掉。

自托管模型主机不部署在免费平台上。 它独立运行,模型端口只在容器网络内可见,反向代理只通过 HTTPS 暴露健康检查和受 Bearer key 保护的推理接口。在没有经过验证的主机之前,生产配置保持指向托管 API——不给自己留误切换生产流量的机会。