做这个项目纯粹是被逼的。家里孩子每天要数学口算和中文识字市面上各种学习App用了不少要么题库固定翻来覆去就是那几道题要么所谓的AI批改只给个对错打发了事。我自己本身是做开发的索性动手搭了一套基于OpenClaw的AI家教系统把数学、中文和AI串在一起用Agent自动完成出题、批改、错题归档和复习提醒。这套东西已经跑了几个月前前后后迭代了七八个版本踩了不少坑今天把思路和实现细节整理出来给想自己折腾的朋友做个参考。项目适用的人群我大致分三类一是家里有孩子需要日常练习、又不想被App绑架的家长二是对Agent编排和Prompt工程感兴趣的开发者可以拿这套流程当练手项目三是做教育类产品的人这里面的题目生成策略、批改校验逻辑、多Agent协作模式都有可复用的价值。整个项目没有用任何黑科技核心就是大模型负责生成、规则负责兜底、OpenClaw负责调度。1. 项目源起与整体设计思路1.1 一个真实的需求先交代一下背景。家里孩子上小学数学需要每天做口算和竖式计算中文需要识字、组词、造句。表面上看起来需求很简单实际落地才知道有多麻烦。市面上的学习App存在几个共性问题。题库虽然大但出题逻辑是写死的比如口算题永远在某个数字范围内随机完全没有根据孩子的错误情况做动态调整。孩子十道题错三道App也不会告诉你这三道题背后的薄弱点是什么更不会三天后再把这几个知识点拎出来重新练。用通用的大模型对话界面也不行。你让AI出一组竖式计算题它能出但出完就结束了没有批改环节没有错题记录第二天还得重新组织语言让AI出新的题。而且大模型生成数学题时答案本身经常算错孩子照着错答案练习越练越偏。中文更麻烦多音字、笔画数、部首判断这些大模型一本正经胡说八道的概率不低。所以我的需求其实很明确要一个能自动出题、自动批改、自动记录错题、自动安排复习的学习闭环。AI要参与但不能只靠AI必须有规则层做校验。1.2 为什么选OpenClaw而不是现成工具先说明一下OpenClaw是什么。它是一套开源的个人Agent运行框架支持任务编排、插件扩展、定时调度和多Agent协作数据模型可以自定义底层模型能对接主流大模型API也能接本地部署的开源模型。它解决的是怎么让AI在合适的时机做合适的事这个问题。选择OpenClaw有三个关键理由。第一它支持定时任务。每天固定时间触发学习任务不需要我手动去点开始。第二它支持结构化的数据存储。错题、学习记录、复习计划都可以存成结构化数据而不是像聊天记录一样散落各处。第三它是多Agent架构。我可以把出题批改复习规划拆成不同的Agent各自有独立的Prompt和上下文避免一个Agent干所有事情导致的上下文混乱。有人可能问为什么不直接用大模型API写个脚本也可以但脚本的扩展性和维护性差。比如今天要加一个周末不安排新题只做复习的逻辑脚本要改代码而OpenClaw只需要改配置。再比如需要两个Agent协作时机器脚本要自己实现消息传递OpenClaw内置了这套机制。1.3 整体架构整个系统分为三层。数据层负责存储错题记录、学习进度、题目缓存用JSON文件加SQLite实现。调度层是OpenClaw负责任务触发和Agent编排。生成层是大模型加规则校验器大模型负责生成题目和批改评语规则校验器负责查答案的数学正确性和中文字形信息。三个关键Agent的分工是出题Agent根据当天的知识点和难度参数生成题目批改Agent接收孩子的作答结合规则校验器给出对错判断和错误分析复习Agent每周汇总错题生成个性化复习卷。三个Agent通过结构化数据文件协作互不干扰。2. 数学模块让AI出题既随机又有据2.1 出题模板与难度参数数学模块的难点不是生成题目而是怎么控制生成题目的类型、难度和数量。我的做法是先定义知识点维度。比如三年级口算维度包括加减乘除、数字范围、是否有进位或退位。再把每个维度映射成Prompt里的约束条件。以竖式计算为例Prompt长这样请生成5道三位数乘两位数的竖式计算题要求 1. 被乘数在100-999之间乘数在10-99之间 2. 至少包含2道需要连续进位的题目 3. 答案必须正确每题给出完整的竖式过程 4. 输出格式为JSON数组每个元素包含expression、answer、carryTimes三个字段。这里有一个关键不要让AI直接给出最终答案就够了我还要求它给出进位次数。这既是给孩子批改用的参考也是我自己做校验的一个维度。AI生成时如果算错了carryTimes和实际竖式过程对不上规则校验器能发现。2.2 答案校验的规则兜底大模型生成的数学题答案不可信是常态。我实测过让大模型做二十道两位数乘法大约有两三道会算错错误率在10%到15%之间。所以从设计上就不能信任AI的计算能力。解决办法是用Python表达式求值来校验答案。def verify_math_expression(expression, ai_answer): try: # 限制在安全求值范围内只允许数字和四则运算符 import ast tree ast.parse(expression, modeeval) # 这里做AST节点白名单校验省略细节 real_answer eval(compile(tree, string, eval)) return abs(float(real_answer) - float(ai_answer)) 1e-6 except Exception: return None # 无法校验标记人工复核这就像出卷老师出完题还得找另一个老师各自算一遍两个答案对上了才敢印进卷子。AI生成的答案是第一遍Python求值是第二遍。不一致时以规则校验结果为准同时把AI的答案丢弃重新生成。2.3 错题归类的数据格式错题记录不能只存这题错了要把错误类型和关联知识点结构化存下来。我定义的数据格式大致是这样的{ question_id: 20260316-001, expression: 326 × 47, correct_answer: 15322, student_answer: 15222, knowledge_point: 三位数乘两位数-进位, error_type: 进位遗漏, timestamp: 2026-03-16 20:14:05 }这里error_type字段由批改Agent根据错位位置推断。比如答案差了100说明十位的进位漏了错误类型就标记为进位遗漏。复习Agent每周统计所有错题的error_type分布把频次高的知识点提前排进下一周的练习计划。3. 中文模块识字、组词与语感训练3.1 汉字拆解与拼音标注中文模块比数学麻烦得多。数学好歹答案可以用计算器校验中文的答案是开放的造句题更是有无穷种合法答案。先解决基础的生字信息生成。我要的字段包括部首、笔画数、结构、拼音、组词、例句。大模型能生成这些但准确性需要验证尤其是笔画数和多音字。我的做法是让AI生成之后再用一个本地收录了常用汉字信息的库做校验。汉字是封闭集合《通用规范汉字表》就那么多字完全可以用本地数据校验。AI说这个字十二画本地库查出来是十一画就以后者为准。这里有个生活化的类比AI相当于一个记忆不太牢靠的语文老师而本地字库就是新华字典。老师说的可能错字典不会错那就让老师先说字典审一遍。3.2 造句批改的难点造句题批改是整套系统里最棘手的部分。孩子造句造得五花八门有错别字、有语序不通、有搭配不当大模型判起来经常误判。我调整过好几轮方案最终的批改逻辑是分步走。第一步用规则检查错别字把学生答案里的字和标准汉字库比对识别出明显的错字。第二步把句子交给大模型判断语义通顺和搭配合理性。第三步两路结果合并规则层发现的错字优先模型层的语义判断做辅助。你是一位小学语文老师。请批改下面的造句作业只输出JSON {has_typo: true/false, typos: [错字列表], sentence_ok: true/false, comment: 一句话点评} 要求语法错误要指出具体问题不要笼统说不通顺。实测下来这个策略能把误判率从三成压到一成以下。关键在于让AI说清楚哪里不对而不是只下个不行的判断。3.3 阅读语感素材生成中文学习除了字词还得有阅读输入。我不太想直接用现成的课文材料而是让AI根据当天学的生字生成一篇短文把生字嵌进短文里。生成短文时有个坑AI为了用上指定的几个字会把句子写得很生硬。我的Prompt里加了一条约束文本必须自然流畅不得为了包含指定汉字而强行组句如果某个字难以自然融入可以省略。加了这条之后文章质量明显提升。4. OpenClaw的Agent编排与调度4.1 任务拆分与配置OpenClaw的调度核心是任务配置。每个Agent对应一组任务任务之间可以设置触发条件。我把每日流程拆成四个任务。tasks: - name: math_paper_generate agent: question_generator trigger: cron(0 18 * * 1-5) params: subject: math knowledge_points: [multiplication] - name: chinese_paper_generate agent: question_generator trigger: cron(0 18 * * 1-5) params: subject: chinese - name: homework_review agent: homework_grader trigger: event(homework_submitted) - name: weekly_review_plan agent: review_planner trigger: cron(0 9 * * 1)这个配置的意思是工作日下午六点生成当天作业孩子写完提交后触发批改Agent每周一早上根据错题生成复习计划。OpenClaw的定时规则支持cron表达式很灵活比如周五不生成作业、周一生成复习卷改配置就行。4.2 多Agent协作与数据隔离Agent之间协作最容易出的问题就是上下文污染。之前我试图让一个Agent既出数学题又出中文题结果它出中文题时会突然冒出一句这道题需要进位。后来改成每个学科拆成独立的Agent实例各自只加载自己学科的Prompt和数据。三个Agent之间不直接通信而是通过共享数据文件间接协作。出题Agent把题目写进当天的工作目录批改Agent轮询这个目录发现新的提交文件就开始处理。这个模式的好处是任何一个Agent挂了重启后能根据文件状态恢复不会丢数据。4.3 模型选型与成本控制不同任务我用不同规模的模型。出题任务对推理要求不高但要求多样性用中小规模模型就够了成本低、速度快。批改任务需要一定的理解和判断力用更强的大模型。复习规划任务一周才跑一次用最强模型也无所谓。这里有一个实用的缓存策略题目生成结果按知识点难度参数日期做缓存键同一天内重复请求同一组参数时直接返回缓存不重新调用模型。光这一项就把模型调用量省了差不多四成。5. 实操中的翻车现场与排查方法5.1 数学批改AI把对的判成错的有一次孩子做的竖式计算全部正确批改Agent却判了两道错。查日志发现AI是按照自己重新计算的错误结果在比对孩子答对了AI算错了。这个问题出现后我才下决心加了Python表达式求值做兜底不再让大模型做计算判断它只负责分析错误类型。后面我把校验逻辑固定成一条铁律凡是有确定性答案的任务AI的判断永远只是参考规则校验说了算。5.2 多音字识别翻车中文生字卡片生成时某个多音字在组词里读一个音在例句里却是另一个读音AI没有标注出这个差异。孩子的识字作业就出错了。解决办法是引入一个后处理脚本检测到多音字时要求AI额外输出一个字段标记当前语境下的读音和释义。整个流程变成预处理先查本地字库确认目标字是否是多音字如果多音把读音信息作为上下文注入Prompt再要求AI生成的例句必须使用指定读音。5.3 Agent串台早先的版本里复习Agent会把数学错题和中文错题混在一个报告里生成导致中文报告里出现进位遗漏这样的词。从根上解决是把复习拆成两个Agent数学复习和中文复习各自读各自的数据源。数据文件也分开存放根目录下分math和chinese两个子目录互不干扰。5.4 题目重复率过高运行一周后发现数学题开始重复了。排查下来是两个问题。一是模型的输出在相似Prompt下会趋向于某些常见组合比如三位数乘法里326×47这种好算的数出现频率特别高。二是随机种子没控制好。我的解决办法是建立一个历史题目索引表每次生成前先查重和新题做相似度比对重复就重新生成。同时给Prompt加了避免使用与已生成题目雷同的数字组合的指令并把历史题目的数字范围特征传给模型。5.5 数据结构损坏有几次批改Agent因为网络超时返回了截断的JSON导致整个任务链卡住。OpenClaw的任务重试机制帮我挡了一部分但更根本的还是在代码里加了JSON解析容错解析失败时把原始文本存下来标记为待人工复核不让坏数据阻塞后续任务。6. 从这套系统里沉淀的几个经验回头看这套AI学科练习的系统最值得说的不是用了什么高大上的技术而是三个朴素的原则。第一个原则是规则兜底永远大于模型的自信。模型再强也会有幻觉。数学题答案让计算器说了算汉字笔画数让字库说了算AI只负责它真正擅长的事情——生成多样性内容和理解开放性的语义。这样分工明确系统的可靠性才有保障。第二个原则是让AI给可验证的过程不只是给结论。比如竖式计算题要求AI输出进位次数造句批改要求AI指出具体错误位置。这相当于给AI的回答附加了一层证据不仅方便我校验也让错误反馈对孩子更有指导性。第三个原则是结构化数据是Agent协作的地基。三个Agent能互不干扰地协作靠的是统一的JSON数据格式和历史记录索引。如果没有这层设计Agent之间传话式的协作方式很容易上下文错乱。后面我还在琢磨两个扩展方向。一个是把错题分析结果做成难度自适应让出题Agent根据孩子近一周的错误率自动调整数字范围和题型配比。另一个是把批改时AI写的点评收集起来定期做一次语料分析观察孩子在不同知识点上的错误模式随时间的变化趋势。这套东西现在虽然还很简陋但从实用性来说已经完全替代了之前用的学习App。按照同样的思路把它扩展成别的学科练习工具也只是改配置的事。
阅读完成 · 觉得有帮助?