项目定位:面向 A-Level 数学学生的拍照作业自动批改产品。 一张整页照片 → 30 秒内返回每题判分 + 错在哪一步 + 下一步怎么学。 技术栈:FastAPI + React/Vite + 多 LLM 异构路由 + SymPy 确定性验证 + SQLite 题库 + Docker/国内云部署。 开发周期:12 天独立完成(2026-04-07 → 2026-04-18),一个人定义需求、选型、上线、持续迭代。
我独立设计并落地了一个 A-Level 数学拍照批改产品。解决的是:学生晚上做完题想知道哪里错了,但家长老师不在身边。 拍一张整页作业,30 秒返回每题判分、错在哪一步、附带精炼解题思路,看不懂还能三层递进追问。 和 ChatGPT 比,我专精 A-Level 考纲、不让模型帮学生遮丑、能给老师教学诊断——家长老师可以真的放心把作业丢给它。
主力用户:正在学 A-Level / AS 数学的中国学生(CIE 考纲,9709)。 次要用户:一对一辅导老师。
为什么不是"所有学生"?因为我为此做出过具体取舍:
- 砍班级汇总 → 因为 1v1 场景不需要
- 部署选国内云 → 因为用户在大陆、不能依赖 VPN
- 输入优先手机端 → 学生晚上做完题直接拍,不会开电脑
- 支持 HEIC → iPhone 用户占大头,我自己用 iPhone 15 Pro 反复调试
- 反馈中文、公式 LaTeX → 贴合 CIE 考纲用户的双语习惯
PM 信号:用户不是被"市场调研"出来的,是被我每一个砍功能的决策反推出来的。
前端原本有"复核模式、老师视角、学生视角"三套 UI。我判断:用户真正关心的只有"这题判对了吗"。三个视角是工程师视角的炫技,不是用户需求。一次性砍掉,让首屏只剩"拍照 → 结果"。
PM 信号:不把"已经做出来的东西"当沉没成本。
基于"A-Level 场景里学生多是 1v1 辅导"直接否掉,避免产品分裂为 ToB 教务系统。
PM 信号:用清晰的用户画像把 scope 钉死。
技术选型争论时,我先写出目标函数,再倒推出"五 Agent 异构投票 + 早返回"方案。
PM 信号:用可量化目标替代模糊的"做好一点"。
单页识别 23 秒是模型硬上限。我提出:用户翻图/裁剪时后台跑 OCR,结果用 SSE 流式逐题返回,0–10s 出第一题。模型没变快,产品变快了。
PM 信号:接受物理极限,用交互结构对冲——AI PM 的核心技能。
A/B 对比时发现模型"算错但写得自信"。否决 Function Calling 方案(速度/兼容/可靠三维劣势),拍板 SymPy 后处理 + 5s 超时保护。
PM 信号:把 AI 不可信当作前提,不等模型变好。
手机拍照(HEIC/JPEG/PDF)
↓
预处理:EXIF 旋转纠正 → Tesseract 朝向检测 → 缩放至 ≤2048px
↓
多页?→ 智能拼接(≤3 页纵向拼成长图,顶部插灰色分隔条 "— Page N —")
↓
┌──────────────────────┐
│ 并 行 │
│ VL 模型(切题+提取) │ ← 一次调用输出 JSON 数组:题号/题文/学生答案/工作步骤/分值/置信度/页码
│ OCR 模型(纯文字) │ ← 专用 OCR 逐页提取文字
└──────────────────────┘
↓
OCR 交叉校验:SequenceMatcher 找上下文 ≥0.7 匹配时,只替换数字(不碰结构)
↓
CPU 后处理:题号归一化 → 跨页同题合并 → 孤儿子题回填父题号 → 自洽性检测
↓
结构化 JSON 交给 Grader
决策 1:一次 VL 调用完成切题 + 内容提取,不拆两步
拆成"先切题、再逐题识别"意味着 N+1 次 LLM 调用,延迟和成本都 xN。合并为一次调用,让模型在看到完整上下文的情况下切题,准确率也更高。
决策 2:VL 和 OCR 并行,不串行
OCR 不需要等 VL 完成。并行后总耗时 = max(VL, OCR),不是 VL + OCR。 OCR 只用来校验数字("2"和"3"差一个数字就是整题判错),不碰结构——保守策略,宁可漏纠不能误纠。
决策 3:多页作业用"智能拼接"而不是"逐页独立识别"
逐页识别的致命问题:跨页题目被拆成两条、子题丢失父题号。拼接成长图后 VL 模型有完整视野,能自然处理"第 2 页开头是上一题的续写"。 但有安全阀:拼接后总高度超 3500px 则回退逐页,防止 token 爆炸。
决策 4:CPU 层做 3 项轻量自洽性检测,零 LLM 调用
| 检测 | 场景 | 动作 |
|---|---|---|
| 答案漏抽 | working_steps 有"="但 student_answer 空 | 标 needs_review |
| 数字幻觉 | student_answer 中的多位数无法在上下文追踪 | 疑似幻觉,标记 |
| 数学一致性 | 用 SymPy 验证答案是否满足最后等式 | 不一致则标记 |
→ 微秒级,不阻塞用户。在管线早期就标记"这题可能识别有问题",下游 grader 会降低置信度或升级复审。
"你怎么从一张照片变成结构化数据?"
三步:预处理(旋转纠正 + 多页拼接)→ VL 模型一次调用切题并提取全部字段 → CPU 后处理合并跨页题目。
关键设计是一次调用而不是 N+1 次——模型看到完整上下文切题更准,延迟和成本都只有 1/N。同时并行跑一个专用 OCR 做数字交叉校验,因为数学题里一个数字错就是整题错。
多页作业我用"智能拼接"而不是逐页识别,避免跨页题目被切断。但加了安全阀——拼接后太长就回退,防止 token 爆炸。
Segmenter 会主动纠正学生的代数错误——学生写 (2x-4)² = 4x²-8x+16,模型"好心"抄成 4x²-16x+16。老师永远看不到学生不会平方展开。
→ 解法:prompt 用 A/B/C/D 四组正反例强制"错的也要原样抄"。
→ 教训:AI 的默认行为(helpful)不一定是产品想要的行为(truthful)。
本地 23 秒,上线第一次 57 秒、答案还错了。 → 解法:定位到多 agent 并发把国内 LLM 厂商 RPM 打爆触发 429。加共享限流锁 + 并发信号量(pipeline=2 / prepare=4)。 → 教训:AI 产品在 dev 和 prod 行为可能完全不同——模型厂商的 rate limit 在替你做隐式负载测试。
换模型、压 prompt、减 token 都到不了 10 秒。 → 解法:设计速度幻觉——后台预识别 + SSE 流式 + 显示当前使用的模型名。体感延迟 30s → 10s。 → 教训:AI 产品最重要的交互设计技能,是把等待时间折叠进用户操作里。
面试最容易被挑战的问题。4 个清晰壁垒:
ChatGPT 给答案。我的产品给诊断:错在第几步、是代数问题还是符号错误、下一步复习哪个知识点。学生反馈和老师反馈分两套——学生看下一步做什么,老师看班上还需要补什么。
ChatGPT 的微积分会"看起来对"但实际错。我对每道微积分/代数题再用 SymPy 符号计算做确定性验证,发现 LLM 判错会 override。通用 AI 助手不会做这个——因为它们没有"A-Level 数学"的领域约束。
5 个跨厂商模型(DeepSeek / Qwen / GLM)投票 + 早返回。ChatGPT 是单一厂商、单样本。同家模型的系统性偏差会被共识放大——异构投票破解了这一点。
爬完整 CIE 9709 历年真题 + Mark Scheme 入库,学生可按知识点/难度抽题,做完后复用同一条批改管线。ChatGPT 没有结构化的 CIE 题库。
比如答案 24/210 即使数值对也要扣 1 分(没化简到 4/35)、茎叶图/箱线图的正确作图顺序、A-Level 大纲优先的公式选择(三角形面积优先 ½ab sin C 不做几何拼装)。这是通用 AI 助手永远学不会的规则——我用 6 个专项验证器(SymPy + 概率 + 分数化简 + 统计 + 图表 + LaTeX)一条条编码进去。
一句话拉开差距: ChatGPT 是"什么都能答一点的通才",我的产品是"专精 A-Level 数学、不会帮学生遮丑、能给老师教学诊断的专家"。家长老师把作业丢给它可以真的放心。
- 用户场景先行:"学生晚上 10 点做完 Paper 1、家长不在身边" → 决定输入是"手机拍照"不是"上传 PDF"。
- 显式目标函数:"30 秒内、最高正确率、成本暂不约束" → 决定用 5-agent 投票不是单模型。
- 验收标准可量化:
benchmark.py+expectations,输出correctness_match_rate/score_match_rate/elapsed_seconds/avg_confidence。改动前后必须跑回归。
我拒绝的需求定义方式:
- "用户应该会喜欢 XX"(没证据)
- "竞品有 YY 我们也做 YY"(没目标函数)
- "先做了再说"(没验收标准)
| 维度 | 指标 | 基线 |
|---|---|---|
| 准确率 | score_match_rate / correctness_match_rate | 单页 benchmark 回归 |
| 延迟 | elapsed_seconds | 单页 ≤ 30s、首题 ≤ 10s |
| 置信度 | avg_confidence | ≥ 0.85 才不触发 needs_review |
| 鲁棒性 | 异构 agent 投票一致率 | 分歧率 < 20% |
| 用户行为(埋点就位) | 拍照→看完结果的完成率 / 重复使用率 | 上线后采集 |
上线前就主动提了埋点需求——不是发布后才补。
这是"批改完之后"的体验重构——从"告诉你错了"升级为"教你怎么做对"。
批改完成后,系统自动为每道错题生成 4–6 步精炼解题思路。 但 LLM 生成的"标准答案"有三个典型问题,我做了四层质控:
| 层 | 问题 | 解法 |
|---|---|---|
| Prompt 约束 | LLM 输出冗长、格式不统一 | 五套递进式 Prompt(A→E),最终选 E:编号步骤 + 每句 ≤20 字 + 以 ∴ 结尾 |
| SymPy 计算验证 | LLM 解题思路里 186+910=1086 这类低级算术错 | 自动扫描所有计算步骤,发现错误则修正 |
| 格式清洁 | 模型输出"wait, no"、"let me recalculate"等自言自语 | 正则清洗 + 统一 LaTeX 分隔符 |
| 结构检查 | 输出混入"批改反馈""正确答案"等元信息 | 禁止词检测,命中则重新生成 |
PM 决策:解题思路生成失败不阻塞批改主流程——返回 None,前端按需请求降级。"锦上添花的功能不能成为单点故障"这个原则贯穿了整个产品。
学生看完解题思路后,可以继续追问"我还是不懂"。系统不是简单重复,而是自动升级解释层级:
| 层级 | 策略 | 举例 |
|---|---|---|
| Level 1(默认) | 拆细步骤 | 把"对 x³sin(2x) 用乘法法则"拆成具体的 u'v + uv' |
| Level 2 | 换讲法 | 用不同数字/不同角度重新讲一遍 |
| Level 3 | 回退基础 | 从更基本的前置概念讲起("你先理解什么是乘法法则") |
交互设计:
- 每条 AI 回复后出两个按钮:✅ 听懂了(层级重置)和 🔄 换个方式解释(层级 +1)
- 流式输出(WebSocket),失败时 fallback 到一次性请求
- 上下文包含:题目 + 学生答案 + 解题思路 + 完整对话历史
PM 思考:这解决的是**"AI 教学的致命缺陷"——不会判断学生理解到了哪一层**。ChatGPT 只会在同一水平反复解释,学生越问越懵。我的三层递进机制模拟了真实老师的教学直觉:先细讲 → 不懂就换角度 → 还不懂就回退到前置知识。
- InviteGate:内测阶段用邀请码(ALEVEL2026 / BETA2026)控制用户准入。前端 localStorage 校验,未通过则全屏挡住。 → PM 决策:产品未达到公开标准时,主动限制用户范围,避免"半成品被传播"毁口碑。
- ErrorBoundary:React 全局异常捕获 → 埋点上报
trackEvent('ui_error')→ 降级显示错误页 + 重试按钮。 → PM 决策:上线前最后一道保险,确保任何前端崩溃不会变成白屏。
- 多种 LaTeX 分隔符归一化((...) / [...] →
$...$ /$$...$$ ) - 裸 LaTeX 命令自动检测并渲染
- KaTeX 渲染失败时降级到纯文本 → 解决的是"不同 LLM 输出的 TeX 格式不统一"这个跨厂商问题。
新增埋点事件:
ui_solution_expand:用户展开解题思路(区分缓存/请求)ui_chat_send:用户发起追问ui_chat_got_it:用户点"听懂了"ui_chat_reexplain:用户点"换个方式解释"
→ 可以计算:解题思路的展开率、追问深度分布(多少人到 Level 3)、"听懂了"转化率。这些数据直接决定下一步是优化解释质量还是简化交互。
这一轮重点是把"AI 说错了"的边际成本降到最低——针对最容易被 LLM 判错的三类题目,每一类都配了一个独立的、零 LLM 调用的验证器。
用户痛点:LLM 在条件概率 P(X≥2 | 至少1红且至少1蓝) 这类题上系统性出错——不是算错,是样本空间识别错。
我的方案:把 LLM 的能力切成两半——
- LLM 只负责"提取"(分布参数、事件定义),擅长的事
- Python 负责"计算"(用
Fraction算精确分数),LLM 不擅长的事 - 支持超几何分布、P(A)、P(A|B)、P(A∩B) 三种模式
PM 思考:AI PM 最重要的技能之一是识别"LLM 擅长什么、不擅长什么",然后把不擅长的部分交给确定性代码。我没有"等模型变强",而是用工程兜底把准确率一次性做到 100%。
用户痛点:A-Level 真实阅卷标准里,答案 24/210 即使数值对也要扣 1 分(没化简到 4/35)。这是 ChatGPT 永远不会告诉学生的"隐藏扣分项"。
我的方案:
- 正则扫学生答案里的所有分数形式(
a/b和\frac{a}{b}) - 一行
gcd()判断是否化简 - 零 LLM 调用,纯正则 + 数学库
智能降分策略:
- 满分 ≥3 分的题才扣 1 分
- ≤2 分的题只记录不扣分(避免把小题扣成 0)
- 中文反馈直接举例:"
24/210应化简为4/35"
PM 思考:这是领域知识壁垒——通用 AI 助手不懂 CIE 阅卷规则,我懂。产品壁垒往往不在模型,而在对用户场景的理解深度。
用户痛点:茎叶图、箱线图、直方图类题目学生手绘作答,AI 无法读图。老系统会把"识别失败"误判为"答错了"——这是最糟糕的错误类型。
我的方案:双通道容错
- 通道 A:识别到是图表题 → LLM 不判分,反而生成 ≤220 字的"参考作图步骤指南"(轴定义 → 关键计算 → 绘图要点 → 常见失分点),标记
needs_review - 通道 B:LLM 置信度低 + 学生答案为空 → 改判"待复核"而非直判错
PM 思考:把"AI 无法判定"这件事本身变成产品价值——与其让用户看到"识别失败"觉得产品很烂,不如给学生一份"你应该怎么画"的指南。化被动拒判为主动指导,这是非常 PM 的设计。
用户痛点:系统生成的参考答案本身都没化简(\frac{12}{18} 而不是 \frac{2}{3})——官方答案都不化简,学生凭什么信?
我的方案:用 sympy Rational 递归化简所有纯整数分数;含变量/根号的跳过;失败时静默返回原字符串。零异常、零调用。
PM 思考:"自己的产品先按产品标准要求自己"。这是很小的细节,但体现一致性——你不能一边扣学生"没化简"的分,一边自己输出未化简的答案。
用户痛点:教师批完一套卷子,无法回看同一份作业的全局,也看不出学生错题的共性模式。
我的方案:
- 按天聚合批改记录
- 统计卡片:"共 X 题 · 正确 Y · 错误 Z · 待复核 W · 准确率 P%"
- 点进详情看每题的反馈,支持按状态筛选(正确 / 错误 / 未作答)
- 即时展示"参考作图步骤",教师可对照学生原卷二次判分
PM 思考:从"批一次"升级到"回看 + 二次判分 + 错题模式分析"——这是教师工作流而不是学生工作流。产品开始具备 ToB 属性的雏形。
这一轮还悄悄做了两件事:
- Segmenter 增强:新增"右边距排版处理"规范——防止学生在页边空白作答被错位关联(典型的 iPhone 照片拍题场景)
- Grader 增加"概率验证修正流":独立计算证明学生正确但 LLM 判错时,主动 flip
is_correct=True,附加[已通过概率验证修正]标签——让用户看到系统的纠错逻辑,而不是默默改掉
| 原则 | 体现 |
|---|---|
| 切分 LLM 的能力边界 | 概率题:LLM 提取 + Python 计算 |
| 零 LLM 调用的验证层 | 分数化简、LaTeX 约简 |
| 把"AI 无法判定"变成产品价值 | 图表题生成作图指南 |
| 领域知识即壁垒 | A-Level 阅卷的"化简扣分"规则 |
| 对自己的输出也按标准要求 | 参考答案自动化简 |
| 从学生工作流扩展到教师工作流 | 历史记录 + 二次判分 |
这一轮是从"能用"到"有人来用"——把产品从工具升级为完整用户旅程。
用户痛点:用户看到链接 → 需要先注册 → 才能体验 → 大量流失。
我的方案:全新 Landing Page,包含 Hero / Features / HowItWorks / Demo / Comparison / FAQ / FinalCTA 等 7 大模块:
- 双路 CTA:首屏直接给"📸 拍照"和"📎 选文件"两个按钮
- 零注册体验:用户在落地页选完图就直接进入主应用看结果,不拦截
- Comparison 模块直接对比 ChatGPT / 豆包拍题,把前面说过的 5 条竞争力产品化展示
PM 思考:获客不是 MRKT 的事,是产品的事。访问 → 体验的每一步摩擦都会砍掉转化率。我在落地页里先让用户尝到甜头再考虑注册,把"产品就是最好的销售"这个理念落到设计里。
技术挑战:用户在落地页选了图,跳转到主应用后这些图必须保留——但 File 对象不可 JSON 序列化,sessionStorage 装不进,React Context 也跨不了页面。
我的方案:用一个内存 module-scope store(单例模式)暂存 File 对象。落地页写入,主应用挂载时消费并清空。简单、无依赖、不引入状态管理库。
PM 思考:最好的工程方案常常是最朴素的——我没被"应该上 Redux / Zustand"的惯性裹挟。这是 PM 在技术选型上该有的判断:先问"最小代价解决这个问题是什么",而不是"行业最佳实践是什么"。
用户痛点:从落地页到主应用,中间会卡 2-3 秒"什么都没发生"。
我的方案:用户在落地页点完 CTA 的一瞬间,前端就异步调用 /prepare-upload 把图传到后端——后端立刻开始解 HEIC、做 EXIF 纠正、缩放、朝向检测。用户走到主应用时,这些活已经干完 70%。
- 两级并发限流:轻量预处理
_prepare_semaphore(4),完整管线_pipeline_semaphore(2) - 失败静默降级:预处理挂了就主应用阶段重做,用户无感
PM 思考:把等待折叠进用户的操作时间里——这是第 2 次用同一个设计原则(第一次是"用户裁剪时后台跑 OCR")。好的 PM 原则会在产品里反复复用。
用户痛点:iPhone 拍作业经常拍歪、边缘超出、手指入镜。用户不会在传之前先裁——他们不知道要裁。
我的方案:上传时强制进入裁剪界面,默认选中全图,用户可以拖拽调整。最多 9 张,单张 20MB。
PM 思考:不要假设用户知道怎么用你的产品。强制一个 2 秒的裁剪步骤,换回了 10+ 秒的识别失败+重拍循环。增加一点点前置操作,换掉后面一大段失败路径——这是净体验提升。
用户痛点:CIE 真题全英文,中国学生读题卡在"这道题到底问的什么"。
我的方案:每道题旁边一键"翻译"。
- Prompt 刻意约束"只翻译、不解题"——避免学生一键跳过思考
- 保留公式原样,数学术语附双语注释
- 命中缓存不二次调用 LLM
PM 思考:AI 翻译功能的产品价值在于"克制"。通用翻译器会顺带解释题目——但我的场景里,直接给答案 = 毁掉学习体验。Prompt 是产品边界,用 prompt 设计定义"什么该做、什么不该做"。
不同模型干不同活:
| 角色 | 用途 | 选型考虑 |
|---|---|---|
base |
快速文本判分 | 便宜快 |
vision |
题目切分 + 识别 | 视觉能力优先 |
ocr |
纯文字交叉校验 | 专用 OCR 模型 |
review |
升级复审 | 推理强度优先 |
explain |
解题思路 + 追问 | 表达清晰优先 |
支持多供应商客户端(Anthropic 兼容 / OpenAI 兼容协议),角色解耦厂商——换厂商不影响角色定义。
PM 思考:AI PM 的核心认知是"模型是零件,不是产品"。把模型抽象成角色,产品逻辑才不会被某一家厂商的能力变化绑死。
| 天数 | 阶段 | 核心产出 |
|---|---|---|
| Day 1-2 | 基础批改 | 单模型批改 + 前端拍照上传 + E2E 测试 |
| Day 3-4 | 质量攻坚 | 发现 LLM 幻觉 → SymPy 验证层 + 双层路由 + 6 条升级规则 |
| Day 5-6 | 多 Agent + 性能 | 5-agent 异构投票 + 早返回 + SSE 流式 + 速度幻觉设计 |
| Day 7-8 | 题库闭环 | 爬虫 + PDF 解析 + SQLite 入库 + 题库 API |
| Day 9 | 部署上线 | 国内云部署 + 并发限流 + 线上性能调优 |
| Day 10 | 教学深化 | 解题思路生成 + 三层追问对话 + 邀请码门禁 + 埋点体系 |
| Day 11 | 领域验证器 + 教师端 | 概率/分数化简/图表题三大专项验证器 + LaTeX 自动化简 + 教师历史工作台 |
| Day 12 | 获客 + 感知加速 + 国际化 | 落地页 + 跨页文件传递 + /prepare-upload 预处理 + 上传前裁剪 + 中英双语翻译 |
| 优先级 | 方向 | 为什么 |
|---|---|---|
| P0 | 埋点 + 灰度 | 从 benchmark 驱动转向真实用户行为驱动 |
| P0 | 题库练习闭环上线 | 爬虫/入库/API ready,只差前端。一次性拍照 → 每日刷题,LTV 提升 10x |
| P1 | 错题本 / 薄弱知识点画像 | 批改数据天然沉淀用户知识地图,ChatGPT 给不了的复利 |
| P1 | 扩科目:物理 9702、化学 9701 | 爬虫框架可复用,grader prompt 需领域专家 |
| P2 | 教师端:批量作业 + 班级知识点热力图 | C 端延伸到小班辅导机构 |
| P3 | 个性化出题 | 基于错题本 RAG 出相似题,真正"千人千面" |
不做的(同样重要):
- 不做大班课/学校级 SaaS——团队和产品定位不匹配
- 不做通用学科大模型——壁垒是领域约束,摊开就没了
- 不做解题过程教学视频——违背"让用户自己想"的教学理念
- 班级汇总 —— 用户画像不符
- 老师/学生视角切换 —— 用户只看结果
- Function Calling 验算 —— 三维权衡后否决,改 SymPy
- Render 部署 —— 国内可达性否决,换国内云
- 首屏"识别中"进度圈 —— 换成预览即识别的速度幻觉
通用 PM 不会想到、但我明确推动过的事:
| 问题 | 我的动作 |
|---|---|
| LLM 会"帮学生纠错"导致假阳性满分 | prompt 强制"原样抄" |
| VL 模型把纯答题页识别为空条目 | 自己拆解三种分页合并策略,选实测最好 |
| 多厂商 API rate limit 并发雪崩 | 共享锁 + 最小请求间隔 |
| 不同模型有系统性偏差 | 强制跨厂商异构投票 |
| 模型能力每月在变 | ModelClient 抽象,不绑厂商 |
| 反馈 LLM 挂了怎么办 | 降级到模板 fallback,不抛 500 |
| LLM 解题思路有算术错 | 四层质控:Prompt→SymPy 计算验证→格式清洁→结构检查 |
| 学生说"不懂"但 AI 只会重复 | 三层递进追问:拆细→换角度→回退基础 |
| 不同 LLM 输出的 TeX 格式不统一 | 前端多分隔符归一化 + 裸 LaTeX 自动检测渲染 |
| 产品未就绪就被传播毁口碑 | 邀请码门禁控制内测范围 |
| LLM 样本空间识别错(概率题) | LLM 只提取分布参数,Python 用 Fraction 算精确分数 |
| AI 无法读手绘图表(茎叶图/箱线图) | 反向生成"参考作图步骤指南",化拒判为主动指导 |
| 系统参考答案自己都没化简 | LaTeX 分数递归化简,对自己也按标准要求 |
| LLM 独立计算正确但判错 | 验证器主动 flip 判定,附"[已通过概率验证修正]"标签让用户看到纠错逻辑 |
① 自我介绍
我独立设计并落地了一个 A-Level 数学拍照批改产品。10 天,一个人定义需求、技术选型、上线。它解决的是:学生晚上做完题想知道哪里错了,家长老师不在身边。拍照 30 秒返回判分 + 错在哪步 + 精炼解题思路 + 三层递进追问——不只告诉你错了,还教你怎么做对。
② 最像 AI PM 的一件事
当我发现模型识别一张整页要 23 秒、没法再压缩时,我没去卷模型,而是重新设计了交互:用户裁剪图片时 OCR 并行、结果用 SSE 逐题流式推送,第一题 10 秒内出。模型没变快,产品变快了。这是 AI 产品独有的设计能力——接受不确定性,用交互结构对冲。
③ 你对 AI 产品的理解
AI 产品核心约束是"模型不可信、不可控、成本非线性"。好的 AI PM 不是把 AI 当黑盒调用,而是要显式设计:兜底(SymPy 验证)、降级(反馈 fallback)、目标函数(30s/最高正确率)、速度幻觉(流式 + 预识别)、异构投票(反幻觉)。我在这个项目里每一条都落了地。
Q:你怎么平衡准确率和成本?
双层路由 + 选择性升级(6 条规则)+ 升级后才走 5-agent 投票 + 早返回。简单题一次快模型搞定,复杂题才烧钱。
Q:为什么不用一个最强模型?
成本、延迟、单点故障都不能接受。异构投票比单模型多样本能更有效抑制幻觉。
Q:SymPy 卡住怎么办?
multiprocessing+ 5s timeout,超时返回 inconclusive,LLM 判分继续有效。
Q:怎么验证改动没把系统改坏?
benchmark.py跑真实作业图,expectations机制算correctness_match_rate / score_match_rate,模型/prompt 升级前后对比。
Q:和 ChatGPT 相比壁垒在哪?
四条:教学级反馈(不是答案)、SymPy 确定性兜底、跨厂商异构投票抗幻觉、CIE 结构化题库闭环。
Q:用户为什么不直接用豆包拍题?
豆包给单题答案,我给"这道题错在第几步 + 下一步复习什么 + 老师应该补什么知识点"。产品形态不同:豆包是搜索,我是教学诊断。
Q:学生看完解释还是不懂怎么办?
三层递进追问:Level 1 拆细步骤、Level 2 换个角度讲、Level 3 回退到前置知识。模拟真实老师的教学直觉。用户点"听懂了"重置层级、点"换个方式"自动升级。埋点追踪追问深度分布,数据驱动优化解释质量。
Q:解题思路的质量怎么保证?
四层质控管道:五套递进 Prompt 选最精炼的 → SymPy 自动扫描并修正算术错 → 正则清洗模型自言自语 → 结构检查+禁止词检测。前端还有二次拦截。生成失败不阻塞批改主流程。
Q:产品上线后怎么看数据?
已埋点:解题思路展开率、追问发送量、"听懂了"转化率、追问层级分布、UI 异常上报。可以回答"用户是不是真的在用解释功能"和"Level 3 到达率是不是太高(说明默认解释质量差)"。
Q:为什么要单独做概率/分数化简/图表题的验证器?不能让 LLM 统一判吗?
这三类是LLM 系统性错误最密集的区域:概率题会错在样本空间(不是算术)、分数化简是隐藏扣分项(LLM 根本不懂 CIE 阅卷规则)、手绘图表 LLM 直接没法读。我的做法是切分 LLM 能力边界——让 LLM 做提取和理解,把"确定性判定"交给代码。这三个验证器零 LLM 调用,准确率一次做到 100%,还没成本。
Q:图表题读不了是产品缺陷,你怎么处理的?
不承认是缺陷,把它做成了产品特色——识别到图表题就不判分,反而生成一份 ≤220 字的"参考作图步骤指南"(轴定义 → 关键计算 → 绘图要点 → 常见失分点),标记待复核。学生拿到的是一份学习材料,不是"识别失败"的错误提示。PM 思维就是把能力边界变成价值主张。
Q:你怎么体现对用户场景的深度理解?
举三个例子:①A-Level 阅卷规则里
24/210没化简要扣 1 分,我专门写了化简检测器;②iPhone 照片常在右边距空白作答,我在 segmenter 里加了排版规范防错位;③学生说"不懂"时真正需要的是换角度讲而不是重复,我做了三层递进追问。这些不懂 A-Level、不懂学生、不懂老师的人根本想不到——这是壁垒。