站长提示:本章内的所有项目都属于真实的商业项目,说句大白话就是,这些项目都是我正在运营的,帮我挣钱的,所以这是属于内部项目,仅限于参加【大模型/Agent面试陪练1V1指导】学员学习。人啊,活到老学到老,即便我的年龄逐渐变大,但是我依然不断地动手开发新的软件项目。如同一个人从小喜欢看动物世界一样,即便他长大之后,甚至七老八十岁了,他依然会喜欢。爱好,这种东西无关乎年龄大小。所以,软件开发属于我的爱好,我会一直坚持下去的。我也奉劝各位读者,不管是年轻的还是年长的,无论是新手还是大佬,动手编码的想法不能扔,即便是AI这么强大,但是你们想一想,如此强大的AI不是空想出来的,而是有人动手一行一行代码编出来的,所以任何时候,动手编码的能力不能丢,欢迎大家参加【大模型/Agent面试陪练1V1指导】
数学搭子是一个面向考研数学和大学数学备考的 AI 智能体产品。它解决的不是“搜题”问题,而是“学生反复错同一个知识点,却没人帮他记住”的问题。
学生把错题录入系统(支持文字描述和拍照识别),系统自动提取考点、建立掌握度档案,并基于遗忘曲线在合适的时间推送复习。学生和 AI 的对话不是通用聊天,而是围绕他个人的薄弱考点展开的针对性陪练。
产品已在线上运行,支持多用户注册、手机号验证码登录、会员订阅。
后端:Python + FastAPI,异步接口,SSE 流式输出。数据层用 SQLite,按学生维度做数据隔离。
前端:原生 HTML/CSS/JS,移动优先的响应式布局,桌面端和移动端两套交互模式(桌面双栏、移动端底部 Tab 切换)。公式渲染用 KaTeX,Markdown 渲染用 marked。
模型层:DeepSeek 系列模型。文本推理用 deepseek-flash,图像识别用多模态能力。所有模型调用走 OpenAI 兼容接口,可替换。
状态管理:Redis 存短信验证码,带 TTL 和重发限制。用户身份用 token 会话管理,不暴露自增主键。
每个考点有一个 0-5 的熟练度等级。学生每次复习后反馈“做对了”或“还不会”,系统据此调整等级,并重新计算下次复习时间。间隔从 1 天逐步拉长到 30 天,掌握后不再推送。
这不是简单的定时提醒,而是一个状态机:熟练度上升则间隔拉长,下降则间隔缩短,形成自适应节奏。
学生输入一段自然语言描述(比如“今天做矩阵的秩的题,秩的判定完全不会”),系统不是直接存原文,而是用模型提取出结构化的考点和卡点,再做去重和合并。同一个考点的多次错误会被聚合到一条记录上,而不是散落成多条。
每次对话前,系统会从错题本里筛选出和当前话题相关的记录,注入到 system prompt 里。筛选逻辑结合了“到期优先”“未掌握优先”“字面匹配”三层策略。这让 AI 的回复不是泛泛而谈,而是基于学生真实的历史错题。
支持拍照上传错题。图片经视觉模型识别后转成文字,再走结构化提取流程。图片本身落盘存储,数据库只存路径,避免数据库膨胀。对话中上传的图片同样会持久化,刷新后历史记录里仍能看到原图。
后端用 SSE 流式推送模型输出,前端逐字渲染。公式和 Markdown 在流结束后统一渲染,避免流式过程中公式被截断导致的渲染错误。长公式在移动端支持横向滚动,不撑破布局。
让模型提取结构化考点时,它偶尔会输出单引号、中文引号、多余的花括号。系统做了一层容错解析,解析失败时回退到关键词规则,保证不丢数据。
模型看不到历史里的图片,只能看到路径。系统通过“让模型第一轮先完整描述图片内容”的方式,把图片信息转成文字存进对话历史,后续追问时基于这段描述回答。
同一套 HTML 要同时适配两种布局。方案是移动优先,用媒体查询在 768px 处切换,JS 只在移动端接管面板显示逻辑,桌面端完全交给 CSS。
免费用户每月限制录入次数。计数不是靠错题表去数(因为一次录入可能产生多条、去重会改变数量),而是单独建了一张只增不减的事件日志表,按月统计。
如果你拿它当面试项目,可以重点讲这几个方向:
这个项目的好处是每一层都有真实的工程细节可挖,不是调个 API 就完事的 demo。
数学搭子 —— AI 驱动的考点追踪与遗忘曲线复习系统(个人项目 / 全栈)
独立设计并开发了一个面向考研数学的 AI 学习智能体,支持文字与拍照录入错题、自动提取结构化考点、基于遗忘曲线的动态复习调度、上下文感知的对话陪练,已线上运行并支持多用户登录与订阅。
如果要更短,可以压成一行:
独立开发 AI 学习智能体「数学搭子」:错题结构化提取 + 遗忘曲线复习调度 + 上下文感知对话,FastAPI + SSE + SQLite + DeepSeek,已上线运行。
面试讲项目,最怕两件事:讲成产品介绍,或者讲成技术堆砌。正确的讲法是:用一条主线串起来,中间穿插技术决策和取舍。
“这是一个 AI 学习智能体,解决的是学生反复错同一个知识点、却没人帮他记住的问题。用户录入错题,系统提取考点、追踪掌握度、按遗忘曲线推送复习,并通过对话做针对性陪练。已经上线运行。”
不要说“我做了个错题本”,那听起来像个练手项目。要说“考点追踪 + 遗忘曲线”,这两个词能立刻让面试官知道你在做有状态、有调度的系统,而不是简单的 CRUD。
第一步,讲清楚为什么不是“聊天机器人”。
“一开始我做的是通用聊天陪伴,但很快发现一个问题:学生不主动说,系统就什么都不知道。所以我把它改成了错题本,学生的录入是主要入口,对话是辅助。这一步的转变是把产品从‘被动响应’变成‘主动追踪’。”
这一步能体现你在做产品判断,不是闷头写代码。
第二步,讲核心技术:熟练度状态机。
“每个考点有一个 0 到 5 的熟练度。学生每次复习后反馈‘做对了’或‘还不会’,熟练度加减一,系统据此计算下次复习时间,间隔从 1 天到 30 天。掌握到 5 就归档,不再推送。”
这是整个项目的技术核心,一定要讲清楚。面试官会问:“为什么是这几个间隔?”你可以说:“参考了间隔重复的经典曲线,1/2/4/7/15/30 是常见的梯度,实际跑下来对考研这个周期是合适的。”
第三步,讲 LLM 工程上的坑。
“让模型提取结构化考点时,它经常不按格式输出——单引号、中文引号、多余的花括号都遇到过。我一开始想靠 prompt 约束,后来发现不够,加了一层容错解析:先做字符串清洗,再尝试 JSON 解析,失败就回退到关键词规则。核心原则是——不能让模型的不稳定影响数据落库。”
这一段能体现你踩过坑、有实战经验。面试官最想听的就是这种细节。
第四步,讲一个你自己做的取舍。
比如:
“我一开始把所有错题都塞进上下文发给模型,后来发现 token 成本高、模型注意力也被稀释。改成三层筛选:先看到期的,再看未掌握的,最后补几条和当前话题相关的。一次最多注入 5 到 8 条。效果反而更好。”
这一步能体现你有成本意识和工程判断,不是“能跑就行”。
第五步,讲一个架构上的决策。
“用户身份我一开始是直接传自增 id,后来意识到这样别人改一下数字就能看别人的数据。改成了 token 会话管理,前端只存 token,后端从 token 反查 id。前端永远拿不到真实主键。”
这一步能体现你有安全意识,不是只关注功能。
不要把项目讲得完美无缺。留一个“还在优化”的点,比如:
“现在上下文召回还是基于字面匹配,用户换个说法就匹配不上。我下一步想改成向量召回,用 embedding 做语义相似度,但这个会引入新的依赖,还在评估。”
这样面试官会觉得你有技术规划,而且知道自己系统的边界在哪。
提前准备好这几个问题的答案:
讲的时候不要背稿。上面这些是骨架,你要用自己的话讲出来,中间穿插你真实踩过的坑。面试官能听出你是真的做过,还是在背项目介绍。
评论专区
评论加载中...登录后即可发表评论