
1. 项目概述当小模型学会“进化”在机器学习工程MLE领域我们正处在一个有趣的十字路口。长久以来一个普遍的认知是模型的能力与参数量成正比。要解决复杂的、需要多步推理和代码执行的工程任务比如参加Kaggle竞赛我们自然而然地会去调用那些参数量动辄数百亿甚至数千亿的“前沿大模型”如Claude 3.5 Sonnet, GPT-4o通过精巧设计的提示词Prompt和智能体脚手架Agent Scaffold来驱动它们工作。这就像聘请一位经验丰富但收费高昂的专家顾问他知识渊博能立刻给出不错的方案但他的“思考方式”是固定的不会因为帮你解决了100个类似问题而变得更快、更准、更懂你的特定需求。但有没有另一种可能如果我们培养一位资历尚浅但学习能力极强的“实习生”——一个参数量仅30亿的小模型如Qwen2.5-3B并为他设计一套科学的“在职培训”体系让他通过大量实践不断积累经验、修正错误、优化策略他最终能否在特定任务上超越那位不再进步的“专家顾问”我们最近的一项探索给出了肯定的答案。核心思路是用强化学习Reinforcement Learning, RL替代静态提示赋予小模型“进化”的能力。这并非简单的模型微调而是构建一个完整的“智能体-环境”交互闭环。智能体小模型根据当前任务状态如问题描述、历史尝试生成一个行动计划并编写执行代码动作环境代码沙箱执行这段代码并返回结果如模型准确率、运行日志我们根据结果给出奖励或惩罚。智能体的目标就是通过策略梯度更新学会最大化累积奖励也就是生成越来越好的解决方案。这个想法的价值巨大。它意味着我们不必永远追逐更大的模型和更复杂的提示工程而是可以通过一种可学习的、数据驱动的方式让一个计算成本低廉的小模型在特定领域持续精进最终达到甚至超越静态大模型的性能。这对于资源受限的场景、需要高度定制化Agent的垂直领域或是追求极致性价比的应用开辟了一条全新的路径。然而将经典的RL范式直接套用到MLE智能体上就像让F1赛车手去开越野车会遭遇两个水土不服的核心挑战动作执行时间可变在模拟环境如Atari游戏中智能体执行一个动作如“向左移动”几乎是瞬间完成的。但在MLE任务中一个动作可能是一段训练线性回归的代码1秒也可能是训练一个深度神经网络并做复杂特征工程的代码10分钟。在分布式异步RL训练中执行快的动作会更快地返回经验、更频繁地更新策略导致策略迅速偏向于生成那些“短平快”但性能平庸的方案。奖励信号极其稀疏环境通常只在任务完全成功时如代码无错运行并输出有效结果才给出一个最终得分如Kaggle的Public LB分数。一个在数据加载阶段就崩溃的方案和一个在最后一步保存结果时出错的方案获得的奖励都是零或一个极低的负分。这种“非黑即白”的反馈让学习变得异常困难智能体很难知道自己的方案“差一点就成功了”从而无法进行有效的梯度更新。针对这两个拦路虎我们设计了两项关键技术时长感知梯度更新和环境插桩。前者确保了策略更新不会歧视耗时长的优质动作后者则将稀疏的“最终奖励”拆解为稠密的“过程奖励”为智能体的每一步进展提供即时反馈。我们的实验表明经过RL训练的Qwen2.5-3B模型在12个精选的Kaggle任务上平均性能超越了使用最佳脚手架提示的Claude 3.5 Sonnet模型达22%。这不仅仅是数字的超越更是一种范式的转变从依赖模型的“先天禀赋”转向培育模型的“后天习得能力”。2. 核心挑战与创新解法拆解将强化学习应用于机器学习工程智能体我们面对的不是一个干净的实验室环境而是一个充满不确定性和长反馈周期的真实世界模拟。下面我将深入拆解这两个核心挑战背后的机理并解释我们的解决方案为何有效。2.1 挑战一可变时长动作与分布式训练的“不公平竞争”在标准的分布式异步RL框架如Ray的RLlib中通常会部署多个“演员”Actor进程并行地与各自的环境副本交互。每个演员采样一个动作执行它收集经验状态、动作、奖励、新状态然后将这些经验发送给中央的“学习者”Learner进行策略梯度更新。这个设计在动作耗时恒定的环境中非常高效。但在MLE场景中动作即生成的代码的执行时间Δt差异巨大。假设我们有一个简单的线性回归方案动作AΔt_A 1秒和一个复杂的梯度提升树方案动作BΔt_B 60秒。在固定的训练时间窗口T内演员能够采样并执行动作A的次数大约是动作B的60倍。因此学习者收到的关于动作A的经验数据量也是动作B的60倍。问题就出在策略梯度的更新公式上。策略梯度试图增加高奖励动作的概率减少低奖励动作的概率。其更新方向由∇θ log πθ(a|s) * A(s, a)决定其中A(s, a)是优势函数衡量该动作相对于平均水平的优劣。在异步更新中如果我们简单地对所有经验样本进行平均或求和那么来自动作A的梯度贡献将占据绝对主导地位仅仅因为它的样本数量多。即使动作B能带来更高的长期回报比如更高的模型精度其微弱的梯度信号也很容易被动作A的海量样本所淹没。这导致策略πθ迅速收敛到“总是生成快速方案”的次优模式如图2所示智能体最终只会生成执行飞快但性能一般的逻辑回归代码。我们的解法时长感知梯度更新解决思路的核心是“公平加权”。既然动作B因为执行慢而被采样得少那么我们就让它的每一次出现“分量更重”。具体做法是在计算每个经验样本的梯度贡献时乘以该动作的执行时长Δt。原始的梯度估计期望为∇J(πθ) ≈ E[ Σ ∇θ log πθ(ak|sk) * A(sk, ak) ]我们将其修改为∇J(πθ) ≈ E[ Σ Δtk * ∇θ log πθ(ak|sk) * A(sk, ak) ]这个Δtk因子起到了关键的平衡作用。它使得一个耗时短Δt小但被频繁采样的动作其总梯度贡献 ≈ (高频率 * 小Δt) * 梯度项。一个耗时长Δt大但被低频采样的动作其总梯度贡献 ≈ (低频率 * 大Δt) * 梯度项。在理想情况下如果两个动作的价值由A体现相近那么它们对策略更新的总影响应该是相近的Δt因子恰好抵消了采样频率的差异。这就确保了策略不会仅仅因为某个动作“跑得快”而偏爱它而是真正根据其带来的期望奖励价值来做决策。实操心得梯度缩放与数值稳定直接使用原始的Δt可能长达数百秒进行乘法会导致梯度爆炸。在实际实现中我们通常对一个批次Batch内所有动作的Δt进行归一化例如除以该批次的平均执行时间将缩放因子控制在1附近。同时需要确保梯度裁剪Gradient Clipping是开启的以维持训练稳定性。2.2 挑战二稀疏奖励与“千里之堤溃于蚁穴”MLE任务的最终奖励如测试集得分是典型的稀疏奖励。智能体成的代码是一条长长的指令链导入包 - 加载数据 - 数据预处理 - 特征工程 - 模型构建 - 模型训练 - 模型预测 - 结果保存。只要任何一个环节出错比如pandas版本不兼容、文件路径错误、矩阵维度不匹配整个链条就断裂了返回的奖励是-10我们设定的完全失败惩罚。这对于学习来说是灾难性的。想象一下一个新手程序员写了100行代码只有最后一行有个语法错误编译器直接报“编译失败”。如果他只知道“失败”这一个结果他将完全不知道前面99行都是正确的调试将无从下手。我们的智能体就面临着同样的困境。它可能已经学会了如何正确加载复杂的图像数据这是一个巨大的进步但因为保存结果的代码有误它得到的反馈和那些连import都写不对的方案是一样的。这种信号无法引导它朝着正确的方向微调。我们的解法环境插桩提供部分信用我们的目标是将“最终得分”这个单一信号转变为反映“完成进度”的稠密信号。核心思想是在代码执行的关键节点插入“检查点”并通过检查点的通过情况来给予部分奖励。但如何自动插入这些检查点呢我们利用了一个关键的观察生成代码的模型被RL训练的策略模型和理解代码结构的模型可以是同一个模型的不同“副本”。我们固定一个静态的、不参与梯度更新的Qwen2.5-3B模型副本称之为“环境模型”。它的任务不是生成解决方案而是对策略模型生成的代码进行“插桩”。具体流程如下插桩提示我们将策略模型生成的代码连同一段精心设计的提示一起输入给环境模型。提示要求它识别代码中的关键步骤如“数据加载”、“模型定义”、“训练循环”并在每个步骤完成后插入一条特定的打印语句如print(“DATA_LOADED”)。执行与匹配执行这份被插桩后的代码。无论最终是否成功执行过程的终端输出都会被捕获。信用提取通过正则表达式匹配终端输出中的这些特殊打印语句。每匹配到一个预定义的里程碑如DATA_LOADED,MODEL_BUILT,TRAINING_COMPLETE就给予一个小的正向奖励例如0.1。组合奖励最终的奖励R_total是部分信用和最终得分的组合如果代码运行完全失败无任何输出或报错R_total -10。如果代码运行有输出但未完成全部任务R_total -10 0.1 * N其中N是匹配到的里程碑数量。如果代码成功运行并产生有效提交R_total Score_from_graderKaggle得分归一化到[-1,1]区间。这种方法的美妙之处在于自我监督它利用模型自身对代码结构的理解来创建监督信号无需人工标注。增量反馈即使最终失败智能体也能知道自己走到了哪一步。能成功加载数据比完全失败要好能训练起来又比只加载了数据要好。这提供了宝贵的学习信号。鼓励探索智能体有动机去尝试完成更复杂的步骤因为每完成一步都有即时奖励缓解了稀疏奖励下的探索难题。注意事项避免奖励黑客必须使用独立的、冻结的模型进行插桩。如果让被训练的策略模型自己给自己插桩它很快会学会“作弊”——生成大量毫无实际功能的print(“DATA_LOADED”)语句来骗取奖励而不去真正执行数据加载操作。将“裁判”和“运动员”分离是保证学习过程健康的关键。3. 系统架构与实操流程理解了核心思想后我们来搭建整个系统。这是一个整合了分布式RL训练、代码沙箱执行和动态奖励计算的复杂工程。下图概括了我们的框架注此处原为Mermaid图表已按规范移除。以下用文字描述架构图整个系统由四个核心模块组成以流水线方式协作策略模型一个可训练的Qwen2.5-3B模型接收任务状态问题描述、历史记录输出解决方案计划代码。它是被RL优化的对象。分布式执行环境一组并行的沙箱环境。每个环境接收策略模型生成的代码执行它并记录执行时间Δt、终端输出和最终得分如果有。环境插桩模块一个静态的Qwen2.5-3B模型副本。它接收原始代码输出插桩后的代码插入打印语句。学习器核心RL优化器。它从所有执行环境中收集经验元组(s, a, Δt, R_total, s‘)其中R_total由部分信用提取器根据终端输出计算得出。学习器使用PPO算法并应用我们提出的时长感知梯度更新规则来计算梯度并更新策略模型的参数。3.1 实操步骤详解假设我们要在一个Kaggle表格数据分类任务上训练我们的RL智能体。以下是逐步操作指南步骤1环境搭建与基准测试首先我们需要一个可靠的评估环境。我们采用MLEBench的设置它提供了75个Kaggle任务的统一接口数据加载器、验证分割、评分器。我们的第一步是运行基线模型。准备基线使用AIDE、OpenHands等先进的Agent脚手架配合Claude-3.5-Sonnet或GPT-4o在每个任务上运行24-100小时记录其能找到的最佳分数。这设定了我们要超越的标杆。初始化策略模型加载预训练的Qwen2.5-3B模型。在训练开始前我们先进行一轮零样本zero-shot测试让模型直接为任务生成128个解决方案温度0.7。检查是否有至少一个方案能成功运行并得到分数。这确保了任务对于小模型的初始能力是可解的RL才有改进空间。我们从MLEBench中筛选出12个满足此条件的任务进行后续实验。步骤2构建训练循环我们的训练循环基于分布式RL框架如HybridFlow进行修改。关键代码如下逻辑# 伪代码展示核心循环逻辑 import torch from transformers import AutoModelForCausalLM, AutoTokenizer from rllib.agents import PPOAgent # 假设的RL库 # 1. 初始化模型和Tokenizer policy_model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-3B-Instruct) env_model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2.5-3B-Instruct) # 静态副本 env_model.eval() # 冻结参数 tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2.5-3B-Instruct) # 2. 初始化RL Agent (例如PPO) agent PPOAgent(policy_model, ...) # 需要自定义的Policy Network包装 # 3. 分布式演员循环 (每个演员进程执行) def actor_rollout(task_description): # 3.1 策略模型根据状态生成动作代码 state format_state(task_description, history) input_ids tokenizer(state, return_tensors“pt”).input_ids with torch.no_grad(): output policy_model.generate(input_ids, max_new_tokens1024, temperature0.7) action_code tokenizer.decode(output[0], skip_special_tokensTrue) # 3.2 环境插桩 instrumentation_prompt f“” 请为以下Python代码在关键步骤后插入打印语句用于跟踪执行进度。 例如在成功加载数据后插入 print(‘DATA_LOADED’)。 只输出插桩后的完整代码。 代码 {action_code} “” instr_input tokenizer(instrumentation_prompt, return_tensors“pt”).input_ids with torch.no_grad(): instr_output env_model.generate(instr_input, max_new_tokens1200) instrumented_code tokenizer.decode(instr_output[0], skip_special_tokensTrue) # 3.3 在沙箱中执行插桩后的代码并计时 start_time time.time() execution_result safe_execute_in_sandbox(instrumented_code) # 返回(success, output, score) duration time.time() - start_time # 3.4 计算奖励 partial_credit 0 for milestone in [“DATA_LOADED”, “MODEL_BUILT”, “TRAINING_STARTED”, “PREDICTION_DONE”]: if milestone in execution_result.output: partial_credit 0.1 if execution_result.success: reward normalize_score(execution_result.score) # 归一化到[-1,1] else: reward -10 partial_credit # 3.5 构建经验并发送给学习器 experience { “state”: state, “action”: action_code, “duration”: duration, “reward”: reward, “next_state”: update_state(state, execution_result.output) } send_to_learner(experience) # 4. 学习器更新循环 (应用时长感知梯度) def learner_update(batch_of_experiences): states, actions, durations, rewards, next_states unpack(batch_of_experiences) # 计算标准PPO损失 (价值损失、策略损失、熵正则项) loss ppo_loss(policy_model, states, actions, rewards, next_states) # 关键修改在策略梯度项上乘以 duration # 假设 policy_loss 是计算好的策略梯度损失 policy_loss policy_loss * durations.mean() # 简化的示意实际需按公式集成到梯度计算中 loss.backward() optimizer.step()步骤3训练监控与调试训练过程通常持续1-3天使用8张A100 GPU。需要监控以下关键指标平均奖励/分数应呈现上升趋势。初期可能因探索而较低后期应收敛。平均动作执行时间在应用时长感知梯度后这个时间应该不会像图2那样急剧下降并稳定在低位而是可能有所波动允许更耗时的动作出现。部分信用分布观察DATA_LOADED,MODEL_BUILT等里程碑的达成频率。在训练初期DATA_LOADED的频率会逐渐提高表明智能体正在学会正确加载数据。生成代码的质量定期抽样检查生成的代码。你应该能看到代码从充满语法错误、无法运行逐渐变得规范并开始尝试更复杂的模型和特征工程方法。步骤4评估与对比训练收敛后我们让最终的策略模型生成128个解决方案并选取其中得分最高的作为最终提交。内部评估与训练前Qwen2.5-3B的零样本性能对比计算提升幅度。外部基准对比将最佳得分与步骤1中记录的基线模型Claude-3.5-Sonnet AIDE等的最佳得分进行对比。我们的目标是超越它们。消融实验必须进行消融实验以验证每个组件的必要性无时长感知梯度训练会迅速收敛到快速但次优的方案。无环境插桩平均奖励收敛更慢方差更大尤其在复杂任务上可能完全无法学习。无自改进提示我们还可以在50%的回合中不是让智能体从头解决任务而是给它一个之前生成的可能不完美的解决方案要求它改进。消融实验显示加入这种自改进提示能带来平均8%的额外性能提升。4. 实验结果深度分析与行业启示我们在12个多样化的Kaggle任务上进行了全面评估任务类型涵盖文本分类、情感分析、图像分类、表格数据预测等。下表汇总了RL训练后的小模型Qwen2.5-3B与仅使用提示的多个前沿大模型的对比结果表1小模型RL训练 vs. 大模型提示在MLEBench 12个任务上的表现任务名称Qwen2.5-3B (零样本)Llama3.1-405B AIDEClaude3.5-Sonnet AIDEGPT-4o AIDE (100小时)Qwen2.5-3B RL (Ours)社交媒体评论侮辱检测 (↑)0.870N/AN/AN/A0.895自动化作文评分 (↑)0.3310.7770.7940.7590.746随机披萨请求分类 (↑)0.5890.6190.6270.6380.663推文情感短语抽取 (↑)0.027N/A0.4480.2830.596表格数据竞赛-五月2022 (↑)0.7870.9390.7430.8830.913表格数据竞赛-十二月2021 (↑)0.8270.7710.6450.9570.951专利短语匹配 (↑)0.065N/A0.8050.5880.527植物病理图像分类 (↑)0.6280.9680.9900.9700.970树叶分类 (↓, 误差)0.8846.7470.4360.8460.124透明导体预测 (↓, 误差)0.1780.1660.0830.0720.059恐怖小说作者识别 (↓, 误差)0.5960.4870.7010.5460.404Chatbot对战预测 (↓, 误差)11.481.2692.2111.4511.081(↑表示分数越高越好↓表示误差越低越好分数为均值±标准误N/A表示基线未产生有效提交)结果解读与洞见全面超越的潜力我们的方法在12个任务中的8个上取得了最佳性能平均超越最强的Claude3.5-Sonnet基线22%。这强有力地证明了通过RL进行持续学习的小模型可以击败仅靠提示的静态大模型。尤其在“推文情感短语抽取”任务上RL小模型取得了0.596的显著高分而大模型基线最高仅为0.448这体现了RL在解决复杂、易被“走捷径”任务上的优势见图3基线模型倾向于直接编码评估指标而非真正学习。并非万能但有普适性在少数任务如“专利短语匹配”、“植物病理图像分类”上我们未能超越最佳基线。这可能是由于任务本身需要非常特定的先验知识或复杂的架构设计而这些知识在Qwen2.5-3B的预训练数据中不足难以通过任务特定的RL完全习得。然而即使在这些任务上RL训练也大幅提升了小模型自身的性能对比其零样本结果。对智能体脚手架的鲁棒性我们还将RL小模型与使用不同脚手架AIDE, OpenHands, MLAgentBench的GPT-4o进行了对比。结果显示RL方法在12个任务中的9个上胜出且性能表现稳定而不同脚手架的提示效果波动较大。这表明RL提供了一种不依赖于特定提示工程或脚手架设计的、更通用的性能提升途径。学习曲线揭示本质图7的学习曲线图极具启发性。在训练初期RL小模型的性能远低于大模型提示的结果。但随着梯度更新的进行小模型的性能稳步上升最终实现反超。而大模型提示的曲线则很快进入平台期即使延长运行时间如GPT-4o运行100小时性能也几乎没有增长。这直观地展示了**“静态推理”与“持续学习”的根本区别**。4.1 消融实验每个组件有多重要为了定量评估我们提出的两个核心创新点的贡献我们进行了严格的消融实验。时长感知梯度更新的效果如图8所示在“随机披萨请求分类”任务中如果不使用时长感知梯度智能体生成代码的平均执行时间会迅速下降到1秒左右并稳定在此。其最终收敛到的方案是简单的线性逻辑回归得分约0.62。而启用了时长感知梯度后智能体愿意尝试执行时间更长如10秒以上的方案例如梯度提升树Gradient Boosting并最终获得了更高的得分约0.67。这证实了该方法有效防止了策略因动作执行速度而产生偏见鼓励了对高回报但耗时动作的探索。环境插桩的效果如图9所示我们在三个代表性任务上对比了有无环境插桩的训练曲线。以“推文情感短语抽取”任务为例没有环境插桩时平均奖励在训练初期徘徊在极低的负值接近-10因为大多数代码完全失败智能体几乎得不到任何正向信号学习进度缓慢且不稳定。而引入了环境插桩后平均奖励从早期就开始稳步上升因为即使代码最终失败智能体也能因完成了“加载数据”等步骤而获得部分信用从而更快地收敛到能生成有效代码的策略。这对于稀疏奖励任务的成功至关重要。自改进提示的增益除了从零开始生成方案我们还让智能体在50%的回合中尝试改进之前生成的方案。消融实验表明这种设置带来了平均8%的额外性能提升。图6展示了一个例子在Chatbot对战预测任务中智能体早期提出的改进是使用回复长度差作为特征在训练后期它能提出更复杂的特征工程如词数差、平均词长差等。这说明RL不仅提升了“从零创造”的能力也同步提升了“迭代优化”的能力。5. 实战陷阱、调参心得与未来展望将RL应用于实际的代码生成智能体充满了工程上的挑战。以下是我在实验过程中踩过的坑和总结的经验希望对后来者有所帮助。5.1 常见问题与排查清单问题现象可能原因排查与解决思路训练初期奖励始终为-10策略毫无改进1. 奖励设计过于苛刻成功门槛太高。2. 环境插桩失败部分信用未正确赋予。3. 初始策略预训练模型生成有效代码的概率极低。1.检查部分信用确保插桩的打印语句能被正确匹配。可以手动执行一些早期生成的插桩代码查看终端输出。调高部分信用的权重如从0.1调到0.5在初期给予更强引导。2.简化任务从一个极简单的“Hello World”式ML任务开始确保RL循环本身能跑通并学到东西。3.课程学习先从模型熟悉的、简单的任务子集开始训练再逐步扩展到全量任务。策略崩溃生成代码多样性骤降1. 学习率过高或PPO的Clip范围太小。2. 熵奖励系数太低探索不足。3. 由于时长感知梯度某个次优但稳定的动作被过度强化。1.监控策略熵如果熵值下降过快提高熵奖励系数。2.调整PPO参数适当增大clip_range(如从0.2调到0.3)降低学习率。3.动态调整时长权重如果怀疑是时长权重导致过早收敛可以尝试对Δt使用对数缩放或设置上限避免单个超长动作过度影响更新。训练不稳定奖励曲线剧烈震荡1. 梯度爆炸。2. 批次内经验差异过大混合了成功和完全失败的经验。3. 代码执行环境沙箱不稳定。1.强制梯度裁剪这是必须的尤其是结合了时长权重后。2.使用优势标准化对批次内的优势函数A(s,a)进行减均值除标准差的操作。3.隔离失败经验可以考虑对完全失败reward-10的经验进行单独处理或降低其学习率。4.加固沙箱确保代码执行环境有超时、内存限制并且每次执行后环境被彻底重置。智能体学会“欺骗”生成无意义打印语句策略模型学会了绕过环境模型直接生成奖励关键词。这是奖励黑客的典型表现。立即检查用于插桩的环境模型参数是否被意外更新确保它在整个训练过程中处于eval()模式且梯度被禁用。可以考虑定期更换或微调环境模型的提示词增加其识别“作弊代码”的能力。训练速度极慢1. 代码执行时间过长成为瓶颈。2. 模型生成或插桩的文本过长。1.设置执行超时对每个动作的执行设置硬性超时如2分钟超时即终止并给予负奖励。这既是资源保护也定义了动作空间的上界。2.优化生成长度限制模型生成的最大token数避免生成冗长无关的代码注释或计划。5.2 关键超参数调优心得学习率对于RL微调语言模型学习率通常需要比有监督微调SFT更小。我们从1e-6开始尝试最终稳定在1e-5。过大的学习率极易导致策略崩溃。批次大小由于需要足够的样本来估计梯度尤其是在分布式设置下我们使用了较大的批次大小128。这有助于稳定训练但会增加内存消耗。PPO Clip Epsilon我们使用0.2。这个值不宜过小否则会限制策略更新尤其是在训练初期策略需要较大改变时。熵奖励系数这是维持探索的关键。我们初始设置为0.01并随着训练进行缓慢衰减。如果发现策略过早收敛到单一模式可以适当调高此系数。部分信用权重每个里程碑的奖励我们设为0.1需要与最终任务奖励归一化到[-1, 1]的量级相匹配。如果部分信用权重过高智能体可能满足于只完成部分步骤如果过低则引导作用不足。这是一个需要根据任务难度调整的关键杠杆。时长权重归一化我们采用批次内归一化duration / mean(batch_durations)。也可以尝试对数归一化log(1 duration)来平滑极端值的影响。5.3 局限性与未来方向我们的工作展示了RL赋能小模型的巨大潜力但这只是一个起点。可扩展性与通用性目前我们是为每个任务单独训练一个策略。一个激动人心的方向是训练一个通用MLE智能体能够通过元学习或基于提示的条件策略快速适应新的未知Kaggle任务。这需要构建更大规模、更多样化的任务集进行训练。多步决策与规划当前框架是“单回合”的智能体一次性生成完整解决方案。更符合人类工程师工作流的是多步分解先规划再写数据加载代码调试再写特征工程再调试……将其形式化为一个序列决策过程并设计相应的奖励机制是下一步的挑战。超越代码生成MLE不仅包括写代码还包括数据探索、实验记录、结果分析和报告撰写。未来的智能体需要整合多种工具如SQL查询、图表生成、笔记软件RL框架需要能处理这种异构的动作空间和更复杂的奖励塑造。安全与评估让AI智能体自动运行代码存在安全风险。需要更强大的沙箱技术。同时如何客观、全面地评估一个MLE智能体的能力而不仅仅是看最终的Kaggle分数也是一个重要的开放问题。它是否写出了可维护的代码是否考虑了计算效率这些都需要更细致的评估体系。我个人在实际操作中最深的体会是RL训练ML智能体就像培养一个实习生你不能只在他提交最终报告时给个“优”或“差”。你需要在他查阅资料、搭建实验环境、调试第一个错误时都给予及时的、量化的反馈。时长感知梯度更新确保了你不因为他做事慢而忽视他环境插桩则让你能对他的每一步进展进行点评。这套方法的核心思想——提供细粒度的、公平的学习信号——或许能超越ML工程领域为训练解决其他复杂、长周期任务的AI智能体提供通用蓝图。这条路还很长但第一步已经迈出并且结果令人鼓舞。