Skip to content

Latest commit

 

History

History
513 lines (354 loc) · 31.7 KB

File metadata and controls

513 lines (354 loc) · 31.7 KB

🎯 面试预备 · A-Level 拍照批改助手(AI PM 视角)

项目定位:面向 A-Level 数学学生的拍照作业自动批改产品。 一张整页照片 → 30 秒内返回每题判分 + 错在哪一步 + 下一步怎么学。 技术栈:FastAPI + React/Vite + 多 LLM 异构路由 + SymPy 确定性验证 + SQLite 题库 + Docker/国内云部署。 开发周期:12 天独立完成(2026-04-07 → 2026-04-18),一个人定义需求、选型、上线、持续迭代。


一、一句话介绍(30 秒版)

我独立设计并落地了一个 A-Level 数学拍照批改产品。解决的是:学生晚上做完题想知道哪里错了,但家长老师不在身边。 拍一张整页作业,30 秒返回每题判分、错在哪一步、附带精炼解题思路,看不懂还能三层递进追问。 和 ChatGPT 比,我专精 A-Level 考纲、不让模型帮学生遮丑、能给老师教学诊断——家长老师可以真的放心把作业丢给它。


二、目标用户(我明确定义过的,不是"所有学生")

主力用户:正在学 A-Level / AS 数学的中国学生(CIE 考纲,9709)。 次要用户:一对一辅导老师

为什么不是"所有学生"?因为我为此做出过具体取舍:

  • 砍班级汇总 → 因为 1v1 场景不需要
  • 部署选国内云 → 因为用户在大陆、不能依赖 VPN
  • 输入优先手机端 → 学生晚上做完题直接拍,不会开电脑
  • 支持 HEIC → iPhone 用户占大头,我自己用 iPhone 15 Pro 反复调试
  • 反馈中文、公式 LaTeX → 贴合 CIE 考纲用户的双语习惯

PM 信号:用户不是被"市场调研"出来的,是被我每一个砍功能的决策反推出来的。


三、5 个关键产品决策

1. 砍掉"老师/学生视角切换"——伪需求识别

前端原本有"复核模式、老师视角、学生视角"三套 UI。我判断:用户真正关心的只有"这题判对了吗"。三个视角是工程师视角的炫技,不是用户需求。一次性砍掉,让首屏只剩"拍照 → 结果"。

PM 信号:不把"已经做出来的东西"当沉没成本。

2. 砍掉"班级汇总"——用用户画像约束 scope

基于"A-Level 场景里学生多是 1v1 辅导"直接否掉,避免产品分裂为 ToB 教务系统。

PM 信号:用清晰的用户画像把 scope 钉死。

3. 把"30 秒内最高正确率,不计 API 成本"写成显式目标函数

技术选型争论时,我先写出目标函数,再倒推出"五 Agent 异构投票 + 早返回"方案。

PM 信号:用可量化目标替代模糊的"做好一点"。

4. "物理做不到的,用交互掩盖"——速度幻觉

单页识别 23 秒是模型硬上限。我提出:用户翻图/裁剪时后台跑 OCR,结果用 SSE 流式逐题返回,0–10s 出第一题。模型没变快,产品变快了

PM 信号:接受物理极限,用交互结构对冲——AI PM 的核心技能。

5. 发现 LLM 数学幻觉 → 引入 SymPy 独立验证层

A/B 对比时发现模型"算错但写得自信"。否决 Function Calling 方案(速度/兼容/可靠三维劣势),拍板 SymPy 后处理 + 5s 超时保护。

PM 信号:把 AI 不可信当作前提,不等模型变好。


四、图像识别方案(面试必问:你怎么从一张照片变成结构化数据的?)

整体架构:一次 VL 调用 + 并行 OCR 交叉校验

手机拍照(HEIC/JPEG/PDF)
    ↓
预处理:EXIF 旋转纠正 → Tesseract 朝向检测 → 缩放至 ≤2048px
    ↓
多页?→ 智能拼接(≤3 页纵向拼成长图,顶部插灰色分隔条 "— Page N —")
    ↓
    ┌──────────────────────┐
    │       并 行           │
    │  VL 模型(切题+提取)  │  ←  一次调用输出 JSON 数组:题号/题文/学生答案/工作步骤/分值/置信度/页码
    │  OCR 模型(纯文字)    │  ←  专用 OCR 逐页提取文字
    └──────────────────────┘
    ↓
OCR 交叉校验:SequenceMatcher 找上下文 ≥0.7 匹配时,只替换数字(不碰结构)
    ↓
CPU 后处理:题号归一化 → 跨页同题合并 → 孤儿子题回填父题号 → 自洽性检测
    ↓
结构化 JSON 交给 Grader

为什么这么设计(4 个关键决策)

决策 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 爆炸。


五、遇到的最大的三个问题

问题 1:LLM 会"帮学生把错题抄对"

Segmenter 会主动纠正学生的代数错误——学生写 (2x-4)² = 4x²-8x+16,模型"好心"抄成 4x²-16x+16老师永远看不到学生不会平方展开。 → 解法:prompt 用 A/B/C/D 四组正反例强制"错的也要原样抄"。 → 教训:AI 的默认行为(helpful)不一定是产品想要的行为(truthful)。

问题 2:线上性能断崖

本地 23 秒,上线第一次 57 秒、答案还错了。 → 解法:定位到多 agent 并发把国内 LLM 厂商 RPM 打爆触发 429。加共享限流锁 + 并发信号量(pipeline=2 / prepare=4)。 → 教训AI 产品在 dev 和 prod 行为可能完全不同——模型厂商的 rate limit 在替你做隐式负载测试。

问题 3:单页 23 秒是模型硬上限

换模型、压 prompt、减 token 都到不了 10 秒。 → 解法:设计速度幻觉——后台预识别 + SSE 流式 + 显示当前使用的模型名。体感延迟 30s → 10s。 → 教训AI 产品最重要的交互设计技能,是把等待时间折叠进用户操作里


六、核心竞争力(vs ChatGPT / AI 搜索 / 豆包拍题)

面试最容易被挑战的问题。4 个清晰壁垒:

1. 教学级反馈,不是答案

ChatGPT 给答案。我的产品给诊断:错在第几步、是代数问题还是符号错误、下一步复习哪个知识点。学生反馈和老师反馈分两套——学生看下一步做什么,老师看班上还需要补什么。

2. 可信度:SymPy 独立验证层

ChatGPT 的微积分会"看起来对"但实际错。我对每道微积分/代数题再用 SymPy 符号计算做确定性验证,发现 LLM 判错会 override。通用 AI 助手不会做这个——因为它们没有"A-Level 数学"的领域约束。

3. 异构投票抗幻觉

5 个跨厂商模型(DeepSeek / Qwen / GLM)投票 + 早返回。ChatGPT 是单一厂商、单样本。同家模型的系统性偏差会被共识放大——异构投票破解了这一点。

4. 题库闭环:从"批作业"到"刷题"

爬完整 CIE 9709 历年真题 + Mark Scheme 入库,学生可按知识点/难度抽题,做完后复用同一条批改管线。ChatGPT 没有结构化的 CIE 题库

5. 领域知识壁垒:懂 CIE 阅卷规则

比如答案 24/210 即使数值对也要扣 1 分(没化简到 4/35)、茎叶图/箱线图的正确作图顺序、A-Level 大纲优先的公式选择(三角形面积优先 ½ab sin C 不做几何拼装)。这是通用 AI 助手永远学不会的规则——我用 6 个专项验证器(SymPy + 概率 + 分数化简 + 统计 + 图表 + LaTeX)一条条编码进去。

一句话拉开差距ChatGPT 是"什么都能答一点的通才",我的产品是"专精 A-Level 数学、不会帮学生遮丑、能给老师教学诊断的专家"。家长老师把作业丢给它可以真的放心。


七、我怎么定义需求(三层漏斗)

  1. 用户场景先行:"学生晚上 10 点做完 Paper 1、家长不在身边" → 决定输入是"手机拍照"不是"上传 PDF"。
  2. 显式目标函数:"30 秒内、最高正确率、成本暂不约束" → 决定用 5-agent 投票不是单模型。
  3. 验收标准可量化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/15 晚 ~ 4/16)

这是"批改完之后"的体验重构——从"告诉你错了"升级为"教你怎么做对"。

8.1 解题思路自动生成(后端四层质控管道)

批改完成后,系统自动为每道错题生成 4–6 步精炼解题思路。 但 LLM 生成的"标准答案"有三个典型问题,我做了四层质控:

问题 解法
Prompt 约束 LLM 输出冗长、格式不统一 五套递进式 Prompt(A→E),最终选 E:编号步骤 + 每句 ≤20 字 + 以 ∴ 结尾
SymPy 计算验证 LLM 解题思路里 186+910=1086 这类低级算术错 自动扫描所有计算步骤,发现错误则修正
格式清洁 模型输出"wait, no"、"let me recalculate"等自言自语 正则清洗 + 统一 LaTeX 分隔符
结构检查 输出混入"批改反馈""正确答案"等元信息 禁止词检测,命中则重新生成

PM 决策:解题思路生成失败不阻塞批改主流程——返回 None,前端按需请求降级。"锦上添花的功能不能成为单点故障"这个原则贯穿了整个产品。

8.2 三层级递进追问对话(核心产品创新)

学生看完解题思路后,可以继续追问"我还是不懂"。系统不是简单重复,而是自动升级解释层级

层级 策略 举例
Level 1(默认) 拆细步骤 把"对 x³sin(2x) 用乘法法则"拆成具体的 u'v + uv'
Level 2 换讲法 用不同数字/不同角度重新讲一遍
Level 3 回退基础 从更基本的前置概念讲起("你先理解什么是乘法法则")

交互设计:

  • 每条 AI 回复后出两个按钮:✅ 听懂了(层级重置)和 🔄 换个方式解释(层级 +1)
  • 流式输出(WebSocket),失败时 fallback 到一次性请求
  • 上下文包含:题目 + 学生答案 + 解题思路 + 完整对话历史

PM 思考:这解决的是**"AI 教学的致命缺陷"——不会判断学生理解到了哪一层**。ChatGPT 只会在同一水平反复解释,学生越问越懵。我的三层递进机制模拟了真实老师的教学直觉:先细讲 → 不懂就换角度 → 还不懂就回退到前置知识。

8.3 邀请码门禁 + 全局异常捕获

  • InviteGate:内测阶段用邀请码(ALEVEL2026 / BETA2026)控制用户准入。前端 localStorage 校验,未通过则全屏挡住。 → PM 决策:产品未达到公开标准时,主动限制用户范围,避免"半成品被传播"毁口碑。
  • ErrorBoundary:React 全局异常捕获 → 埋点上报 trackEvent('ui_error') → 降级显示错误页 + 重试按钮。 → PM 决策:上线前最后一道保险,确保任何前端崩溃不会变成白屏。

8.4 前端数学渲染增强

  • 多种 LaTeX 分隔符归一化((...) / [...] → $...$ / $$...$$
  • 裸 LaTeX 命令自动检测并渲染
  • KaTeX 渲染失败时降级到纯文本 → 解决的是"不同 LLM 输出的 TeX 格式不统一"这个跨厂商问题。

8.5 埋点覆盖

新增埋点事件:

  • ui_solution_expand:用户展开解题思路(区分缓存/请求)
  • ui_chat_send:用户发起追问
  • ui_chat_got_it:用户点"听懂了"
  • ui_chat_reexplain:用户点"换个方式解释"

→ 可以计算:解题思路的展开率、追问深度分布(多少人到 Level 3)、"听懂了"转化率。这些数据直接决定下一步是优化解释质量还是简化交互。


十、Day 10-11 新增:领域专项验证器矩阵 + 教师工作台(4/16 ~ 4/17)

这一轮重点是把"AI 说错了"的边际成本降到最低——针对最容易被 LLM 判错的三类题目,每一类都配了一个独立的、零 LLM 调用的验证器

10.1 概率题专项验证器(verifier/probability_verifier.py

用户痛点:LLM 在条件概率 P(X≥2 | 至少1红且至少1蓝) 这类题上系统性出错——不是算错,是样本空间识别错

我的方案:把 LLM 的能力切成两半——

  • LLM 只负责"提取"(分布参数、事件定义),擅长的事
  • Python 负责"计算"(用 Fraction 算精确分数),LLM 不擅长的事
  • 支持超几何分布、P(A)、P(A|B)、P(A∩B) 三种模式

PM 思考AI PM 最重要的技能之一是识别"LLM 擅长什么、不擅长什么",然后把不擅长的部分交给确定性代码。我没有"等模型变强",而是用工程兜底把准确率一次性做到 100%

10.2 分数化简检测器(verifier/simplification_verifier.py

用户痛点: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 阅卷规则,我懂。产品壁垒往往不在模型,而在对用户场景的理解深度

10.3 图表题安全网(grader/diagram_grader.py

用户痛点:茎叶图、箱线图、直方图类题目学生手绘作答,AI 无法读图。老系统会把"识别失败"误判为"答错了"——这是最糟糕的错误类型。

我的方案:双通道容错

  • 通道 A:识别到是图表题 → LLM 不判分,反而生成 ≤220 字的"参考作图步骤指南"(轴定义 → 关键计算 → 绘图要点 → 常见失分点),标记 needs_review
  • 通道 B:LLM 置信度低 + 学生答案为空 → 改判"待复核"而非直判错

PM 思考把"AI 无法判定"这件事本身变成产品价值——与其让用户看到"识别失败"觉得产品很烂,不如给学生一份"你应该怎么画"的指南。化被动拒判为主动指导,这是非常 PM 的设计。

10.4 LaTeX 分数自动约简(utils/latex_simplify.py

用户痛点:系统生成的参考答案本身都没化简(\frac{12}{18} 而不是 \frac{2}{3})——官方答案都不化简,学生凭什么信?

我的方案:用 sympy Rational 递归化简所有纯整数分数;含变量/根号的跳过;失败时静默返回原字符串。零异常、零调用。

PM 思考"自己的产品先按产品标准要求自己"。这是很小的细节,但体现一致性——你不能一边扣学生"没化简"的分,一边自己输出未化简的答案。

10.5 历史记录 + 详情查看(HistoryTab.tsx + HistoryDetail.tsx

用户痛点:教师批完一套卷子,无法回看同一份作业的全局,也看不出学生错题的共性模式

我的方案

  • 按天聚合批改记录
  • 统计卡片:"共 X 题 · 正确 Y · 错误 Z · 待复核 W · 准确率 P%"
  • 点进详情看每题的反馈,支持按状态筛选(正确 / 错误 / 未作答)
  • 即时展示"参考作图步骤",教师可对照学生原卷二次判分

PM 思考:从"批一次"升级到"回看 + 二次判分 + 错题模式分析"——这是教师工作流而不是学生工作流。产品开始具备 ToB 属性的雏形。

10.6 跨能力升级

这一轮还悄悄做了两件事:

  • Segmenter 增强:新增"右边距排版处理"规范——防止学生在页边空白作答被错位关联(典型的 iPhone 照片拍题场景)
  • Grader 增加"概率验证修正流":独立计算证明学生正确但 LLM 判错时,主动 flip is_correct=True,附加 [已通过概率验证修正] 标签——让用户看到系统的纠错逻辑,而不是默默改掉

10.7 这一轮新增的核心 PM 原则

原则 体现
切分 LLM 的能力边界 概率题:LLM 提取 + Python 计算
零 LLM 调用的验证层 分数化简、LaTeX 约简
把"AI 无法判定"变成产品价值 图表题生成作图指南
领域知识即壁垒 A-Level 阅卷的"化简扣分"规则
对自己的输出也按标准要求 参考答案自动化简
从学生工作流扩展到教师工作流 历史记录 + 二次判分

十一、Day 12 新增:获客链路 + 感知延迟零化 + 国际化(4/18)

这一轮是从"能用"到"有人来用"——把产品从工具升级为完整用户旅程。

11.1 营销落地页 + 零摩擦获客(frontend/src/pages/landing/

用户痛点:用户看到链接 → 需要先注册 → 才能体验 → 大量流失。

我的方案:全新 Landing Page,包含 Hero / Features / HowItWorks / Demo / Comparison / FAQ / FinalCTA 等 7 大模块:

  • 双路 CTA:首屏直接给"📸 拍照"和"📎 选文件"两个按钮
  • 零注册体验:用户在落地页选完图就直接进入主应用看结果,不拦截
  • Comparison 模块直接对比 ChatGPT / 豆包拍题,把前面说过的 5 条竞争力产品化展示

PM 思考获客不是 MRKT 的事,是产品的事。访问 → 体验的每一步摩擦都会砍掉转化率。我在落地页里先让用户尝到甜头再考虑注册,把"产品就是最好的销售"这个理念落到设计里。

11.2 跨页面文件传递:pendingUpload Store(landing/lib/pendingUpload.ts

技术挑战:用户在落地页选了图,跳转到主应用后这些图必须保留——但 File 对象不可 JSON 序列化,sessionStorage 装不进,React Context 也跨不了页面。

我的方案:用一个内存 module-scope store(单例模式)暂存 File 对象。落地页写入,主应用挂载时消费并清空。简单、无依赖、不引入状态管理库。

PM 思考最好的工程方案常常是最朴素的——我没被"应该上 Redux / Zustand"的惯性裹挟。这是 PM 在技术选型上该有的判断:先问"最小代价解决这个问题是什么",而不是"行业最佳实践是什么"

11.3 感知延迟零化:/prepare-upload 预处理(api/routes.py

用户痛点:从落地页到主应用,中间会卡 2-3 秒"什么都没发生"。

我的方案:用户在落地页点完 CTA 的一瞬间,前端就异步调用 /prepare-upload 把图传到后端——后端立刻开始解 HEIC、做 EXIF 纠正、缩放、朝向检测。用户走到主应用时,这些活已经干完 70%。

  • 两级并发限流:轻量预处理 _prepare_semaphore(4),完整管线 _pipeline_semaphore(2)
  • 失败静默降级:预处理挂了就主应用阶段重做,用户无感

PM 思考把等待折叠进用户的操作时间里——这是第 2 次用同一个设计原则(第一次是"用户裁剪时后台跑 OCR")。好的 PM 原则会在产品里反复复用。

11.4 上传前图片裁剪(UploadForm.tsx ImageCropper)

用户痛点:iPhone 拍作业经常拍歪、边缘超出、手指入镜。用户不会在传之前先裁——他们不知道要裁。

我的方案:上传时强制进入裁剪界面,默认选中全图,用户可以拖拽调整。最多 9 张,单张 20MB。

PM 思考不要假设用户知道怎么用你的产品。强制一个 2 秒的裁剪步骤,换回了 10+ 秒的识别失败+重拍循环。增加一点点前置操作,换掉后面一大段失败路径——这是净体验提升。

11.5 题目中英双语翻译(/translate-question endpoint)

用户痛点:CIE 真题全英文,中国学生读题卡在"这道题到底问的什么"。

我的方案:每道题旁边一键"翻译"。

  • Prompt 刻意约束"只翻译、不解题"——避免学生一键跳过思考
  • 保留公式原样,数学术语附双语注释
  • 命中缓存不二次调用 LLM

PM 思考AI 翻译功能的产品价值在于"克制"。通用翻译器会顺带解释题目——但我的场景里,直接给答案 = 毁掉学习体验。Prompt 是产品边界,用 prompt 设计定义"什么该做、什么不该做"。

11.6 模型注册中心 5 角色隔离升级(router/models.py

不同模型干不同活:

角色 用途 选型考虑
base 快速文本判分 便宜快
vision 题目切分 + 识别 视觉能力优先
ocr 纯文字交叉校验 专用 OCR 模型
review 升级复审 推理强度优先
explain 解题思路 + 追问 表达清晰优先

支持多供应商客户端(Anthropic 兼容 / OpenAI 兼容协议),角色解耦厂商——换厂商不影响角色定义。

PM 思考AI PM 的核心认知是"模型是零件,不是产品"。把模型抽象成角色,产品逻辑才不会被某一家厂商的能力变化绑死。


十二、迭代全景(12 天做了什么)

天数 阶段 核心产出
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 预处理 + 上传前裁剪 + 中英双语翻译

十三、下一步迭代路线(30 天规划)

优先级 方向 为什么
P0 埋点 + 灰度 从 benchmark 驱动转向真实用户行为驱动
P0 题库练习闭环上线 爬虫/入库/API ready,只差前端。一次性拍照 → 每日刷题,LTV 提升 10x
P1 错题本 / 薄弱知识点画像 批改数据天然沉淀用户知识地图,ChatGPT 给不了的复利
P1 扩科目:物理 9702、化学 9701 爬虫框架可复用,grader prompt 需领域专家
P2 教师端:批量作业 + 班级知识点热力图 C 端延伸到小班辅导机构
P3 个性化出题 基于错题本 RAG 出相似题,真正"千人千面"

不做的(同样重要):

  • 不做大班课/学校级 SaaS——团队和产品定位不匹配
  • 不做通用学科大模型——壁垒是领域约束,摊开就没了
  • 不做解题过程教学视频——违背"让用户自己想"的教学理念

十四、被砍掉的 5 件事(最能体现判断力)

  1. 班级汇总 —— 用户画像不符
  2. 老师/学生视角切换 —— 用户只看结果
  3. Function Calling 验算 —— 三维权衡后否决,改 SymPy
  4. Render 部署 —— 国内可达性否决,换国内云
  5. 首屏"识别中"进度圈 —— 换成预览即识别的速度幻觉

十五、AI PM 独有的设计动作(面试差异化)

通用 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、不懂学生、不懂老师的人根本想不到——这是壁垒。