知行栈
Codex实践

我用 Codex 把 Python 学习资料做成桌面应用

从学习路线、题库 Schema 到 Tauri 桌面应用,记录 Codex 如何帮我把零散 Python 训练资料变成一个本地优先的学习系统。

这个项目一开始不是为了“做一个 AI 学习产品”。

它更具体。孩子已经学了两年 Python,正在准备 Python 5 级和信息素养相关考试。问题也很清楚:for 循环不够稳,独立写完整程序还吃力,Debug 能力需要慢慢练。

如果只让 Codex 出题,它很快就能生成一堆练习。但那不是我想要的。题目多,不等于训练有效。更容易发生的是,今天五道题,明天五道题,做完就散了,错因没有留下,复做没有安排,长期路线也没有收敛。

所以我让 Codex 做的第一件事,不是出题,而是把项目变成一个学习系统。

我是怎么一步步做的

第一步,我先让 Codex 读现有资料,而不是马上生成新题。它要看 README.mdAGENTS.md学习路线.md、已有题库和应用设计,先知道孩子当前水平、短板和训练边界。

第二步,清理材料位置。原始考级资料、打印练习和早期 Markdown 周练习不继续混在工程里,而是放到仓库外归档。正式应用只读 content/ 里的结构化题库。这个动作很普通,但它把“资料堆”切成了“输入资料”和“应用数据”。

第三步,写长期路线。Codex 把 12 个月拆成五个阶段:基础加固、结构化编程、算法入门、赛事能力、赛前强化。每周训练什么、每 4 周怎么测、错题怎么复做,都先写进路线,而不是临时想到哪练哪。

第四步,把题目结构化。题目进 content/questions/week-XX.json,答案和测试进 content/solutions/week-XX.json,知识点进 content/curriculum/topics.json,再用 Schema 约束。这样 Codex 后续出题时,不只是写题干,还必须照着数据结构交付。

第五步,设计桌面应用。它没有一上来写界面,而是先写 应用架构设计.md,把 Tauri 2ReactPyodide Web WorkerSQLite、DeepSeek API Key 存储、本地备份恢复这些边界定清楚。

第六步,进入实现和验收。应用里要能跑 Python、判公开测试和隐藏测试、保存草稿和提交历史、记录错因、安排复做、导出周报。最后还要有手工验收清单,比如死循环超时后环境能不能恢复,备份恢复会不会覆盖 API Key。

这条路走完,项目就不再是“让 AI 出题”。

它变成了一个本地学习系统:题目、判题、记录、复盘和 AI 建议各在各的位置上。

先定一句硬规则

这个项目里有一句很重要的话:

本地程序负责事实,大模型负责建议。

这句话把边界切开了。

题库、答题记录、学习画像、判题结果都保存在本机。Python 代码优先在本机运行,不依赖云端判题。AI 可以做学习诊断、题目草拟和分级提示,但不能直接判题,不能自动修改学习画像,也不能自动发布新题目。

这个边界很重要。学习系统最怕把“建议”和“事实”混在一起。孩子的代码有没有通过测试,应该由确定性测试说了算;AI 可以解释错误,但不能替代判题器。

Codex 帮我把材料变成工程

后来项目慢慢长成几个层次。

第一层是学习路线。学习路线.md 里把 12 个月训练拆成基础加固、结构化编程、算法入门、赛事能力、赛前强化几个阶段。每周默认 5 道题,包含热身、专项、Debug 和趣味综合挑战。

第二层是结构化题库。题目放在 content/questions/,标准答案和测试用例放在 content/solutions/,知识点放在 content/curriculum/,再用 JSON Schema 约束格式。

第三层是桌面应用。技术上用 Tauri 2 + React + TypeScript,用 Pyodide Web Worker 在本机跑 Python,用 SQLite 保存学习记录,用系统原生凭据库存 DeepSeek API Key。

这些选择不是为了显得技术栈很满。它们服务的是同一个目标:这个工具平时能离线用,关键数据留在本机,AI 只在需要建议时出现。

这个用法适合什么

Codex 很适合把“我有一堆材料”变成“我有一个可维护系统”。

它可以帮你做几件麻烦事:

  • 把长期学习目标拆成阶段。
  • 把题目和答案从 Markdown 变成结构化数据。
  • 给题库加 Schema 和校验脚本。
  • 把应用功能拆成前端、运行器、本地存储、AI 辅助和家长审核。
  • 写出手工验收清单,比如死循环超时后 Python 环境能不能恢复,备份恢复会不会覆盖 API Key。

这些事都不神奇,但很费心。

更关键的是,Codex 会把“当下的想法”沉到文件里。README.md 说明项目定位,AGENTS.md 说明后续维护规则,应用架构设计.md 说明技术边界。下一次继续做,不用重新解释一遍。

这类项目真正难的不是写一个页面,也不是接一个模型。

难的是让学习这件事有记忆。