← 返回工作台(制造人的AI手记)
PORTAL // HUANGFENG
📝 制造人的AI手记
🎯 核心工程问题与经验边界

“不用买服务器、不配域名、不申请模型 Key,如何做出一款带 AI 视觉批阅能力的小程序?真正的难点从来不是写 Prompt,而是端侧真机与物理传感器给你的当头一棒。”

本文记录微信小程序「宝贝作业管家」从第一行代码到 2.0 上线(经历 20+ 个版本真机迭代)的完整全托管实践。全面复盘:PostgREST + RLS + 混元/GLM 模型降级链的全托管红利、视觉大模型“好心脑补”错别字的硬约束方案、放弃小程序内置相机组件的昂贵代价、逐题截图(bbox)两次调用解耦,以及微信第三方授权冻结 CI 发版的排障闭环。

这个项目从第一行代码到真机上线,没有买过一台云服务器,没有部署过一行后端代码,也没有申请过任何 AI 模型的 API Key。

>

我们做的是一个面向小学生的作业与试卷批阅工具(宝贝作业管家)。从最初的 Demo 验证,到体验版、真机测试、备案初通,再到经历了 20 多个版本的真实迭代,整套系统完整跑通了。本文把这套全托管架构的真实红利、隐含边界,以及在端侧真机上踩出来的十几个工程坑完整复盘出来。

01 什么是小程序全托管架构?

很多人对“无后端开发”的理解还停留在静态页面或者纯本地存储。在 WorkBuddy 的架构下,它其实是将一个带 AI 能力的微信小程序所需的服务端基础设施,全部做了一层托管:

这里面最实惠的,是它的模型资源配置。实测中其模型目录里的 hy3(腾讯混元思考模型)支持多模态识图,且单价倍率为零。对于试卷和作业这种图片 Token 消耗极大的场景,多模态主通道挂在上面,运行成本几乎为零;再搭配 glm-5.3-flash 做低成本文本快速兜底,用降级链代替省着调用。

但这套全托管并不是万能银弹。选型之前必须看清它的物理边界:

1没有自定义后端运行环境:服务端不能跑 Node.js 或 Python 代码,业务逻辑要么写在前端,要么写成数据库的 PL/pgSQL 函数。复杂的第三方 Webhook 回调、定时任务或者队列编排,无法直接在服务端展开。

2网关的严格约束:多模态调用拒收普通的 HTTPS 图片外链,只认 Base64 Data URL;遇到流式排队慢时,前端必须自带超时看门狗(比如 45 秒超时切断),否则界面会无限转圈。

3SDK 真机缺陷需手动兜底:SDK 在真机上存在 TextDecoder 缺失报错(真机无 Web API,且沙箱内 global !== globalThis,Polyfill 必须内联注入 SDK 文件顶部);上传 ArrayBuffer 会被误判抛错,每次重新执行“构建 npm”后都需要手动补丁。

02 手写批阅的视觉 AI:那些 Prompt 治不好的病

当我们在真实场景中用多模态模型批改小学生的纸质作业和试卷时,遇到的第一个系统性打击是:大语言模型的“好心脑补”。

1. 转录与比对必须硬解耦

大语言模型拥有极强的文本先验概率。当看到一个错别字或形近字时(比如孩子把“清泉”写成“情泉”,把“珍惜”写成“借惜”),模型在阅读时会自动顺滑地把它读成正确的字,并给出“完全正确”的判定。对于语文默写、生字词批阅,这种脑补是灾难性的,而且错得无声无息。

反复测试后,有效的约束原则必须在工程上定死:

2. 逐题切图定位(bbox):先识别,后定位

很多开发者希望让模型在批阅整卷的同时,顺便把每一道题在图中的坐标(Bounding Box)一并返回,以便前端裁出每道题的作答截图。

实测证明:视觉模型“理解卷面内容”很强,但“测算精确坐标”极弱。 一旦让它顺便给坐标,会出现大面积漏框、跨题大框,甚至坐标与题目完全错位。

最终稳定下来的方案是两次调用解耦:

1第一次调用(主批阅):专注认题、转录、批改,确定题目总数与每道题的开头文字;

2第二次调用(专职定位):把第一轮识别出来的题目清单作为锚点喂给模型,钉死题号数量与粒度,要求逐题给坐标,防止重新切分造成紊乱;

3坐标容差与修剪:逐题采用独立坐标框,题与题解耦,外扩 2.5% 的安全边距(过大容易吞入邻题,过小会切掉笔画);只有当下道题的顶边真正被上一题穿透时,才通过工程逻辑硬修剪,允许截图之间轻微重叠。

03 最贵的一课:放弃小程序的内置相机组件

在 1.4 到 2.0 的迭代中,最耗费精力也最昂贵的一个教训,是在图片采集环节。

为了让用户体验顺滑,我们最初花了数周时间在小程序里用 组件打磨拍摄页:自制对焦辅助框、写清晰度检测闸门、陀螺仪横竖屏矫正、按框连拍。但真实用户拿到手,核心反馈始终是:“字看不清”、“容易拍糊”、“小字认不出来”。

反复排查后,我们发现了小程序的三个底层硬伤:

1 拍照来自预览流:其导出的图像分辨率严重受限,远低于手机后置镜头的真实硬件规格;

2缺少对焦控制 API:微信小程序的组件文档中,没有开放任何点按对焦或连续对焦调节接口,在低反差纸面和暗光环境下经常拉风箱或虚焦;

3完全吃不到系统相机的算法优化:手机厂商几十人的团队在系统相机里打磨的多帧合成、高动态范围(HDR)、微距降噪,小程序组件通通调不到。

我们在 2.0 版本彻底做了架构断腕:采集端彻底退出 组件,把拍摄交给系统原生相机或微信原生拍摄界面(wx.chooseMedia),小程序把全部精力放在导入后的图像处理上。

用户用系统相机拍好后导入,小程序提供轻量直观的交互:

单变量对比实验证明:同一个多模态模型,仅仅把输入源从小程序相机抓拍换成手机系统相机导入,试卷文字的识别准确率就产生了质的飞跃。采集端的物理画质缺失,软件界面和 Prompt 根本救不回来。

04 图像预处理的误区:分辨率高于滤镜

对于喂给多模态大模型的文档图像,很多人习惯搬出传统 OCR 的思路:先做灰度化、高斯二值化、锐化去噪。

实测结论正好相反:二值化对大模型不仅无益,反而有害。

传统 OCR 依赖字符边缘的黑白跳变,但视觉大模型识别字符严重依赖微弱的灰度纹理和笔锋连贯性。一旦施加二值化,小学生用 2B 或 HB 铅笔写得稍轻的连笔,直接被滤成了白地,模型不仅认不出,还会当成空白题。

真正收益最高的预处理纪律只有两条:

1分辨率预算拉满:大模型对密集手写字的识别门槛约在 250~300 PPI。在网关体积允许的范围内(Base64 编码后约 1.4MB 内),优先保留原生分辨率;超过上限时,先压像素(如等比缩至 2400px)再适度控质,而不是只降 JPEG 质量。

2减少重复重编码代数:从快门拍下、相册选图、前端裁切到 Base64 编码,每一次 Canvas 导出或压缩都会损失一代画质。在端上尽可能合并处理步骤,避免图片被反复有损压缩。

05 微信生态与发布链路的真实暗礁

脱离了纯开发环境,真正往上线走时,生态层面的规则往往会让不熟悉微信体系的开发者卡壳好几天。

1. 案例复盘:发版罗生门与第三方授权冲突

在开发中期,我们曾遇到一个极其诡异的问题:命令行 CI 工具每次都提示上传成功,后台也能看到新的版本号,但用户手机上的体验版永远显示为老版本,新功能死活出不来。

排查多日后,翻阅微信底层规则才找到真凶:小程序如果在后台把「小程序开发与数据分析」权限授权给了第三方服务商,微信为了防止代码覆盖,会即时冻结该小程序通过公众平台或 CI 自主发版的能力。

在授权期间,CI 工具虽然能把代码推上去留个记录,但“设为体验版”和“提交审核”会被底层静默拦截。终结手段很简单:去微信公众平台后台解除第三方授权,发版通道立刻恢复正常。这也沉淀为我们团队的纪律:让辅助平台初始化必要能力后,尽早收回授权,将上传密钥(CI Key)掌握在自己的自动化脚本中。

2. 账号体系的假象:微信 UID ≠ 手机号 UID

在一次测试数据清理后,有用户反馈“历史数据全空了”,但重新退出再登录又恢复了正常。

排查确认:系统支持微信一键登录与手机号验证码登录。虽然是同一个人、同一个手机,但在 WorkBuddy 底层:

两者在数据库里是两套隔离的记录。用户偶然切换了登录方式,落进了空壳账号,误以为数据丢失。在多登录态打通之前,产品上必须对家庭共享和身份绑定做显式引导,避免用户对数据安全产生恐慌。

3. 个人主体的新窗口与边界

很多独立开发者受限于个人主体身份,无法开通企业级功能。但 2026 年微信政策迎来了一些关键调整:

结语:朴素的工程常识

回顾从 0 到 2.0 的全过程,WorkBuddy 这类全托管基础设施最大的价值,是把个人做产品的启动摩擦力降到了前所未有的低点。一个不懂 Linux 运维、不买数据库、不申请模型账号的开发者,完全可以在几天内把一个带 AI 视觉能力的小程序推上线。

但当产品真正面对真实用户、破损试卷、反光桌面和多样机型时,你就会发现:真正决定产品能不能活下来的,从来不是把哪家模型的 Prompt 调得多花哨,而是那些极其朴素的工程细节。

是对分辨率的毫厘必争,是承认传感器能力的物理边界,是对真机沙箱环境的敬畏,是对数据边界的严格把关。把这些最琐碎、最不性感的坑踩平了,AI 的能力才算真正在用户的指尖落了地。