AI 错题本系统设计从错误模式聚类到针对性训练推荐一、错题本不是把做错的题抄一遍传统的错题本做法很机械做错一道题贴上标签定期回顾。这种做法的问题是它关注的是哪道题做错了而不是为什么做错了。一道题做错的原因有很多可能是边界条件没考虑、可能是选择了错误的算法、可能是粗心漏了某个约束。如果错题本只是按题号归档那它只是一个日志而不是一个学习系统。AI 错题本需要做的是从错误中提取模式按模式聚类然后生成针对性的训练计划。这篇文章讨论这个系统的设计思路。二、从错误数据到错误模式flowchart TD A[提交记录] -- B[错误分类引擎] B -- C{错误类型} C --|编译错误| D[语法类错误] C --|答案错误| E[逻辑类错误] C --|超时| F[性能类错误] C --|运行时错误| G[鲁棒性错误] E -- H[模式分析] H -- I{子类型} I --|边界遗漏| J[边界处理不足] I --|算法选错| K[算法选型偏差] I --|推导错误| L[状态转移错误] J -- M[训练推荐引擎] K -- M L -- M D -- M F -- M G -- M M -- N[针对性题目推荐] M -- O[知识点讲解链接] M -- P[复习时间安排]核心模块有三层错误分类引擎将提交记录按错误类型自动分类。模式分析模块从同类错误中提取共性模式。训练推荐引擎根据错误模式推荐针对性练习。三、实现错误模式聚类与推荐from dataclasses import dataclass, field from collections import defaultdict from typing import Optional import json dataclass class Submission: 单次提交记录 problem_id: int problem_tags: list[str] # 题目标签如 [DP, 背包] error_type: str # CE | WA | TLE | RE error_detail: str # 错误详情如 数组越界: index5, len5 timestamp: float code_snippet: str # 提交的代码片段 class ErrorPatternAnalyzer: 错误模式分析器从提交记录中提取高频错误模式 def __init__(self): # 错误模式模板每个模板包含正则匹配规则和语义描述 self._patterns { off_by_one: { keywords: [越界, index out, IndexError, ArrayIndexOutOfBounds], description: 边界偏移错误off-by-one, category: 边界处理, }, null_pointer: { keywords: [NoneType, null, NullPointer, undefined], description: 空指针/空值访问错误, category: 鲁棒性, }, infinite_loop: { keywords: [超时, TLE, time limit, 死循环], description: 循环未终止或复杂度超限, category: 性能, }, } def analyze(self, submissions: list[Submission]) - dict: 分析提交记录返回按错误模式分组的统计 pattern_stats: dict[str, list[Submission]] defaultdict(list) for sub in submissions: matched False for pattern_name, pattern_info in self._patterns.items(): for kw in pattern_info[keywords]: if kw.lower() in sub.error_detail.lower(): pattern_stats[pattern_name].append(sub) matched True break if matched: break if not matched: pattern_stats[unknown].append(sub) return dict(pattern_stats) class TrainingRecommender: 训练推荐引擎根据错误模式推荐练习题目 # 错误模式到练习方向的映射 PATTERN_TO_FOCUS: dict[str, list[str]] { off_by_one: [数组遍历, 二分查找边界, 滑动窗口], null_pointer: [链表操作, 树的遍历, 空值处理], infinite_loop: [复杂度分析, 剪枝策略, 状态空间估算], } def recommend( self, pattern_stats: dict[str, list], top_k: int 5, ) - list[dict]: 生成训练推荐列表 recommendations [] # 按错误频次排序优先处理高频错误 sorted_patterns sorted( pattern_stats.items(), keylambda x: len(x[1]), reverseTrue, ) for pattern_name, submissions in sorted_patterns: if pattern_name unknown: continue focus_areas self.PATTERN_TO_FOCUS.get(pattern_name, []) recommendations.append({ pattern: pattern_name, error_count: len(submissions), focus_areas: focus_areas, sample_problems: submissions[:3], # 代表性错题 priority: 高 if len(submissions) 3 else 中, }) return recommendations[:top_k] class ReviewScheduler: 基于遗忘曲线的复习调度器 使用简化的 SM-2 算法SuperMemo计算下次复习时间。 间隔因子根据答题正确率动态调整。 def __init__(self): self._intervals [1, 3, 7, 14, 30] # 复习间隔天 def schedule(self, problem_id: int, quality: int) - dict: 根据答题质量安排下次复习 Args: quality: 0-50完全忘记5完美作答 if quality 2: # 质量差重置间隔 next_interval 1 ease_factor 1.3 else: # 根据质量选择对应的间隔 idx min(quality - 2, len(self._intervals) - 1) next_interval self._intervals[idx] # 简易的 ease factor 调整 ease_factor 2.5 - (5 - quality) * 0.2 return { problem_id: problem_id, next_review_days: next_interval, ease_factor: round(ease_factor, 2), } # ---- 使用示例 ---- if __name__ __main__: # 模拟提交记录 submissions [ Submission(1, [数组], RE, IndexError: list index out of range, 1000), Submission(2, [DP], WA, 输出与期望不符, 2000), Submission(3, [链表], RE, NullPointerException at line 12, 3000), Submission(4, [数组], RE, 越界访问index10, length10, 4000), Submission(5, [贪心], TLE, 超时n50000 时复杂度 O(n^2), 5000), ] analyzer ErrorPatternAnalyzer() stats analyzer.analyze(submissions) recommender TrainingRecommender() recs recommender.recommend(stats) print( 错误模式报告 ) for rec in recs: print(f\n错误模式: {rec[pattern]}) print(f出现次数: {rec[error_count]}) print(f建议方向: {, .join(rec[focus_areas])}) print(f优先级: {rec[priority]})四、边界分析与权衡4.1 关键词匹配的局限性当前错误分类依赖关键词匹配。这在简单场景下足够但对于复杂错误如答案与预期差 1关键词匹配无法准确归类。升级路径是使用嵌入向量Embedding对错误信息做语义聚类。4.2 冷启动问题新用户没有足够的提交记录时聚类结果不可靠。需要引入一种全局默认推荐策略——比如按知识点难度阶梯推荐——作为冷启动的过渡方案。4.3 遗忘曲线的个性化SM-2 算法的间隔参数是固定的不一定适配所有人的记忆规律。更好的方案是引入在线学习——根据用户的实际遗忘率动态调整间隔参数。4.4 推荐的探索与利用平衡推荐系统需要在高频错误应该优先修和知识盲区应该主动探索之间做平衡。纯利用策略会让用户只练习自己常错的题型而忽略未暴露的薄弱领域。五、总结错题本系统的核心不是存储——任何数据库都能存错题。核心是对错误的模式化理解和针对性响应。从单道题的对与错提升到「这类错误我经常犯」再到「系统推荐我去练这类题」每一步都依赖于对数据的更深层次抽象。这个思路也适用于日志分析、代码 Review、测试报告等需要从数据中提炼模式的场景。