算法学习 Agent:提示答案之前,先判断卡在哪一步
一、直接给答案会降低训练价值
算法学习 Agent 如果用户一问就给完整答案,短期效率很高,长期学习效果很差。用户可能复制代码通过题目,却没有理解题型、状态和证明。下一道变形题仍然会卡住。
更好的方式是先诊断卡点。用户是没读懂题意,不会建模,不会选择数据结构,还是代码边界写错。不同卡点需要不同提示。学习 Agent 的目标不是展示自己会做题,而是把用户从当前卡点推到下一步。
二、诊断流程要分阶段
flowchart TD A[用户输入] --> B{是否理解题意} B -- 否 --> C[重述题意] B -- 是 --> D{是否有思路} D -- 否 --> E[提示关键性质] D -- 是 --> F{代码是否通过} F -- 否 --> G[定位反例] F -- 是 --> H[复杂度复盘]诊断阶段不要急着输出最终代码。可以先让用户描述暴力思路,再引导发现瓶颈。比如从 O(n²) 到 O(n),重点不是背答案,而是找出可维护的单调关系或可复用状态。
Agent 也要识别用户已有基础。已经写出接近正确代码的人,需要的是边界定位;完全没有思路的人,需要的是题意拆解和小例子推导。提示粒度要跟当前状态匹配。
三、提示要有梯度
hints: level_1: "观察窗口右端右移时,左端是否只会向右移动" level_2: "尝试维护一个满足条件的最长窗口" level_3: "用两个指针和一个计数表更新窗口"梯度提示比一次性答案更适合训练。第一层给方向,第二层给结构,第三层才接近实现。用户如果能在第一层解决,就不要继续喂答案。系统要尊重学习过程。
代码提示也要控制量。可以先指出某一行边界错误,而不是整段重写。完整代码应放在最后,并附上复杂度和反例验证。这样答案不是黑盒,而是推理链的终点。
def choose_hint_level(attempt_count: int, has_code: bool) -> int: if not has_code: return 1 if attempt_count < 2: return 2 return 3四、学习记录要沉淀薄弱点
Agent 每次诊断都应记录卡点类型。是二分边界、递归终止、图遍历 visited、动态规划状态定义,还是复杂度估算。长期看,这些数据比刷题数量更重要。
学习报告不要只统计做了多少题。应该统计哪些题型反复出错、哪些错误已经减少、哪些知识点需要复盘。刷题效率的核心,不是每天多做几道,而是减少重复跌倒。
Agent 还要避免过度提示。用户刚开始思考时,系统如果直接给关键性质,会剥夺推理过程。可以设置等待和确认机制:先问用户是否需要提示,再给第一层线索。训练系统要帮助学习,不要把每道题都变成自动补全。
对代码错误,Agent 可以先生成最小反例。比如用户写了二分边界错误,就给一个长度很小的数组,让错误显现出来。最小反例比直接指出答案更有记忆点,也更容易让用户自己修正。
学习路径推荐也要可解释。系统建议复习单调栈时,要说明依据:最近三道题都没有正确维护栈内含义,或者复杂度证明总是漏掉弹栈次数。推荐如果没有证据,容易变成新的焦虑来源。
还要允许用户选择训练模式。冲刺模式可以更快给提示,复盘模式可以更重视证明和反例,入门模式则多给图解和小例子。同一套 Agent 不应该对所有人输出同样节奏。
五、总结
算法学习 Agent 应先诊断卡点,再给梯度提示,最后才提供完整题解。诊断结果要沉淀成薄弱点数据。
真正有训练价值的 Agent,不是替用户做题,而是让用户下一次更接近自己做出来。