SWE-RL源码精读(2):prompts.py提示词模板背后的3个设计巧思
【免费下载链接】swe-rl[NeurIPS'25] Official codebase for "SWE-RL: Advancing LLM Reasoning via Reinforcement Learning on Open Software Evolution"项目地址: https://gitcode.com/gh_mirrors/sw/swe-rl
SWE-RL 是 NeurIPS'25 收录的开源项目,首次把强化学习用于训练大模型解决真实软件工程问题。它的提示词模板藏在两个文件里:src/swerl/core/prompts.py和src/swerl/agentless_mini/utils/prompts.py。别小看这几段模板,它们承担着"定位 Bug → 生成补丁 → 计算奖励"全流程的沟通协议。本文不贴大段代码,只拆解 SWE-RL 提示词模板背后最值得借鉴的 3 个设计巧思。
巧思一:两阶段提示词分工——先"定位"再"修复" 🎯
SWE-RL 的提示词不是一个大而全的"万能模板",而是拆成了两个独立角色:
| 模板 | 文件位置 | 职责 |
|---|---|---|
| LOCALIZATION 定位模板 | src/swerl/agentless_mini/utils/prompts.py | 让模型根据 issue 描述和仓库结构,输出最可能涉及的文件路径 |
| AGENTLESS_REPAIR 修复模板 | src/swerl/core/prompts.py | 让模型基于定位到的文件内容,直接产出可落地的代码补丁 |
定位模板只要求模型输出"最多 n 个文件路径",按重要程度排序、用反引号包裹,格式约束极其轻量;修复模板则拿到真实文件内容后,要求模型输出结构化的 SEARCH/REPLACE 编辑块。
为什么这样拆分?因为两个阶段的上下文长度、难度、出错率完全不同。代码里也一一对应:src/swerl/agentless_mini/localize.py先跑定位,src/swerl/agentless_mini/repair.py再基于定位结果拼接文件内容跑修复。两阶段解耦后,可以分别缓存、分别并行、分别重试,这也是 Agentless Mini 能高效跑完 SWE-bench 500 个实例的原因之一。
巧思二:SEARCH/REPLACE 结构化输出,让补丁零歧义 🔧
修复模板最"硬核"的设计,是强制模型按固定六段式输出编辑:
- 文件路径
<<<<<<< SEARCH起始标记- 原代码中要查找的连续代码块
=======分隔线- 要替换成的新代码
>>>>>>> REPLACE结束标记
这看起来是"笨办法",实则一石三鸟:
- 解析零歧义:
src/swerl/core/reward.py里一行正则SEARCH_REPLACE_REGEX就能把文本里的编辑块完整提取出来,不需要任何 NLP 技巧。 - 天然可校验:应用补丁时(
apply_code_change),程序会严格检查 SEARCH 块是否真实存在于原文件中,不存在就直接报错,杜绝模型"凭空改代码"。 - 可直接转 diff:应用后的新内容可以生成统一 diff,再与 oracle(标准答案)补丁做相似度比对,算出强化学习所需的奖励分数。
模板里还特别强调"必须保留正确的缩进",甚至举例说明加一行print(x)也要原样写出全部空格。这种对细节的苛刻,正是为了让模型输出能被程序 100% 精确解析——提示词不只是"说给模型听",更是"写给程序看"的协议。
巧思三: / 标签,给模型留一条"草稿纸" ✍️
SWE-RL 的强化学习对象是推理模型,因此修复模板配套了一个思考系统提示(THINKING_SYSTEM),强制模型先输出<think>内的内心草稿,再输出<solution>内的最终答案。
这套标签设计有三层用意:
- 可开关:
src/swerl/agentless_mini/utils/envs.py通过环境变量THINKING控制是否启用思考模式,标签名也可配置,兼容不同推理模型。 - 可解析:
src/swerl/agentless_mini/utils/api.py的parse_thinking_output只抽取<solution>之间的内容,思考过程不参与后续补丁解析,避免"话痨"污染结果。 - 可校验:
src/swerl/core/reward.py的extract_thought_solution会检查四个标签各出现且仅出现一次,思考为空直接判格式错误——这给强化学习训练提供了严格的格式奖励信号。
一句话总结:让模型"先想后写",同时保证程序只认最终答案,两不耽误。
小结:提示词是"人机协议",不是"聊天话术" 📋
| 设计巧思 | 核心文件 | 最大收益 |
|---|---|---|
| 两阶段拆分 | agentless_mini/utils/prompts.py、agentless_mini/localize.py | 定位与修复解耦,可并行可缓存 |
| SEARCH/REPLACE 结构化输出 | core/prompts.py、core/reward.py | 解析零歧义、可校验、可算奖励 |
<think>/<solution>思考标签 | core/prompts.py、utils/envs.py、utils/api.py | 兼容推理模型,思考与答案分离 |
三个巧思的共同点是:把"模型要说什么"和"程序怎么解析"都写进模板。提示词模板从此不再是自由的聊天文案,而是与代码约定好的结构化协议。无论你是做提示词工程、RL 训练还是 Agent 开发,这套"模板即协议"的思路都值得直接抄作业。
下一篇源码精读,我们将继续深入src/swerl/core/reward.py,看 SWE-RL 如何用"补丁相似度"给模型打分,敬请期待。
【免费下载链接】swe-rl[NeurIPS'25] Official codebase for "SWE-RL: Advancing LLM Reasoning via Reinforcement Learning on Open Software Evolution"项目地址: https://gitcode.com/gh_mirrors/sw/swe-rl
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考