问题
简历是静态的,招聘方看完只能靠猜。但让大模型代替自己说话有三个真问题:它会编造经历、会泄露不该说的信息、会在没人看着的时候烧掉预算。
这个项目的全部工程量,本质上都在回答这三件事。
做法
- 后端:FastAPI,提供 Profile、JSON Chat 与 SSE 流式三套 API;DeepSeek 适配层处理取消、重试与限流
- 前端:原生 Custom Element + Shadow DOM,零运行时依赖,一个
script标签加一个元素即可嵌入任何页面 - 双人格:专业人格与闲聊人格各自独立会话,记录彼此隔离,切换不串历史
- 三语:中英德,
sessionStorage会话隔离,匿名 UUID,不建立跨设备长期记忆 - 安全:XSS 防护、安全渲染、严格生产 CORS
- 部署:Render Free,Docker 非 root 镜像,动态端口,健康检查,SIGTERM 优雅退出
三个值得讲的工程决策
一、门禁写成启动失败,而不是警告
生产 CORS 只接受两个域名,出现通配符、本地 origin、遗漏或额外域名都直接拒绝启动。批准版资料缺失同样拒绝启动。
这类边界写成 warning 等于没写——没人会去看日志里的黄字。
二、可观测,但不可窥探
聊天路径产生统一的匿名结构化指标,只记录白名单元数据、延迟、失败分类与 token 用量,不记录问题、回答、对话历史、身份或任何凭据。生产环境的原始对话日志由配置门禁强制关闭。指标代码本身的异常会被吞掉,不影响聊天主流程。
想知道系统好不好用,不需要读用户说了什么。
三、零付费运维
固定输出 token 上限、并发上限、每分钟限流、单 IP 每日轮次上限与单会话每日上限,五层一起兜住成本。免费套餐的休眠与冷启动是已接受的限制,不为监控新增任何付费资源。
进行中
本机 llama.cpp 加 Qwen3-4B 量化模型的自托管推理链路已打通。目前正在从零训练一个小型 decoder-only GPT,目标不是替换通用大模型,而是走完「从零训练 → 导出量化格式 → 接入同一套 OpenAI 兼容调用路径」的完整工程链路。
线上默认仍是托管 API,不因实验自动切换生产。