扩展 DeepSeek 的强化学习蓝图路线到AI的其他方面

Nikhil Anand

                                                                  图片由GPT-4o生成

“AI 软件工程师”这个概念,其实已经不再遥远了。已经有一些技术在逐步让软件工程这件事变得越来越简单。• Devin,被宣传为世界上第一个 AI 软件工程师,是去年推出的。• Cursor,是个 VS Code 的替代方案,在做项目时能更方便接入 AI,最近越来越受欢迎。• 类似 Claude 和 GPT-4 这样的 LLM,可以帮你写代码、修代码。随着越来越多的人在研究 LLM 的推理能力,事情只会变得越来越容易。

AI 软件工程师 vs 普通 LLM

普通的 LLM 也能写代码,那它跟 AI 软件工程师有什么区别?那我们就得更精确地定义一下这些术语了:AI 软件工程师,是一种 AI 助手,它能查看一个 Git 仓库中的多个代码文件,并且根据它要执行的具体任务,判断需要修改哪些文件。比如说,你有一个 AI 项目的仓库,你需要修一个 bug——每次用户选择 Mistral 模型时,AI 助手加载失败。



作为一名软件工程师,你得找到包含这个 bug 的文件,并且修复它。(作者提供图片)

作为一名软件工程师,你首先得搞清楚要修改哪个代码文件才能修这个 bug。举个例子,你可能会去看看模型加载的那个文件,看看问题是不是出在那里。如果涉及的变量或函数是从别的文件导入的,你也得翻一翻那些文件,看看问题是不是从那里来的。一个普通的 LLM 解决不了这个问题,因为我们在提问的时候,没法把所有的文件都扔进 LLM 里。我们可能得自己先找好文件,再把它丢给 LLM 让它修 bug。



我在让 Claude 修某个代码文件里的 bug。(作者提供图片)

那我们怎么定义 AI 软件工程师呢?AI 软件工程师,就像普通的软件工程师一样,会通过不断地提交 PR(pull requests)来修复代码中的某些方面。比如我们想打造一个推理能力更强的 AI 助手,第一个 PR 可能是建立 AI 助手的基本框架,第二个 PR 是设置训练流程,以此类推。

![](https://img2024.cnblogs.com/blog/3524016/202503/3524016-20250323153742062-1192676970.webp)

                                                            每个 PR 就是一个对代码库的扩展提交。(作者提供图片)

AI 助手需要一个个顺着写这些 PR,要么自己写,要么在用户引导下完成。

                                                      AI 软件工程师在执行用户/老板提供的任务时可能会做的事。(作者提供图片)

怎么打造一个 AI 软件工程师(SWE)?

最近 DeepSeek 模型出来后,很多人可能都在想——LLM 能不能用强化学习(RL)来学会如何成为更好的软件工程师?我前不久写了一篇博客,讲 RL 训练技术有多强大,如果你还没看,建议去看看。

RL 的强大之处就在于:LLM 不用我们手把手教,也能自己学会解决问题。那我们能不能把它应用到软件工程任务上呢?

我们先来定义一下这个任务。

任务目标

我们的目标是让 AI 助手像软件工程师一样,给定仓库当前的状态和待完成的任务,自动在仓库里做出所需的修改。

如何训练 AI 成为一个 SWE

要让 AI 做到这一点,我们会用 DeepSeek 用来提升推理能力的同一个 RL 训练流程。RL 是个很强的通用技术。意思就是说,在一个场景下用它(比如提升推理),也能让它在其他场景下表现得更好。所以 DeepSeek 做的那些训练,可能也能提升 AI 在软件工程任务上的表现。但如果我们用一些专门的软件工程示例去教它,会不会效果更好?

要做到这点,第一步就是得收集一些数据,用来训练 LLM。

数据收集

为了训练 LLM,我们需要收集一些能教它在以下条件下该做出哪些修改的数据:

当前代码的状态,以及

需要被修改的函数。

那这些信息我们去哪儿找呢?

Git PR。

Git PR(Pull Request)本质上是一个提议,想把一组变更从一个分支合并到另一个分支。当你在用 GitHub 做项目时,你通常会对仓库做一些修改,然后用一条提交信息(commit message)把这些改动提交上去,说明你完成了什么任务。之后你会拉一下仓库的当前状态,然后把你的改动合并进去。

                                                        随着仓库的逐步变化,我们可以看到它在 PR 发起前的演变过程。(作者提供图片)

所以,一个 pull request 就包含了我们需要的所有信息——仓库之前的状态、要完成的任务、以及为完成这个任务所做的修改。

                                                      一个 pull request(PR)中包含的所有信息。(作者提供图片)

所以,如果我们收集互联网上开源仓库里的几百万个 PR,我们就能拿到相当不错的一批信息,来教 LLM 在给定任务和旧代码状态的情况下如何修改代码。

提示 LLM

现在我们已经有了一套数据集,接下来我们要搞清楚的是,在训练过程中或在推理时,该怎么提示 LLM。

我们想要的是:给它旧的代码状态和要完成的任务,让它输出需要做出的代码修改。

但整个代码库没法全都上传,所以我们可能只提供两种类型的文件:

提交前后发生变化的文件

没变但可能相关的其他文件

                                                    比如 helpers.py 被修改了,那 test_helpers.py 可能就被认为是个相关文件。(作者提供图片)

我们可以用 LLM 来判断哪些“未变文件”是相关的,依据是文件名。这背后的想法是:LLM 不仅得知道要改哪些文件,还得知道哪些文件不能动。所以在训练中加入这个环节是非常重要的,这能帮它更好地学习。

定义奖励

说到具体的 RL 过程,那我们怎么定义“奖励”,才能激励 LLM 去学习呢?

我们会用一个简单的方法来定义奖励:衡量 LLM 输出的代码和 PR 中实际修改后的代码之间的差距。它们越相似,奖励就越高。



奖励是由预测出来的代码和期望的代码输出之间的差距决定的。(作者提供图片)

训练过程整体流程很简单:把每一个数据点传给 LLM,获取它的输出,然后把这个输出和实际应该输出的代码作对比,根据它们之间的相似度给予奖励。LLM 再根据这个奖励来调整它的策略,以优化整体表现。

那我们还能怎么提升这个过程呢?

课程式学习(Curriculum Learning)已经有研究表明,像训练学生一样,在 RL 训练过程中逐步提高任务难度,能让 LLM 学得更有效率。



随着训练的推进,我们逐步给 LLM 更难的任务。(作者提供图片)

现在我们是从 GitHub 上随机选了一些 PR,但我们其实可以按提交的“大小”排序来安排它们的训练顺序,比如,改动越少的 commit 可能就越容易推理。

当然我们也可以想别的办法,比如找一个更科学的指标,来判断每个 PR 推理难度的高低,然后按照从易到难的顺序排列数据集。

更干净的数据集与奖励函数数据集的“干净程度”是训练结束后提升 LLM 性能的主要瓶颈之一。DeepSeek 和其他研究者已经充分说明了这一点。

数据集:我们这套方法最大的问题之一就是,数据质量本身不受控。我们理想的情况是,PR 里都体现了“优秀的软件工程技能”,但如果我们是从网上随便抓 PR,这就不现实了。

奖励函数:如果某个问题有多种解法呢?LLM 采用的方式跟 PR 中代码的方式不一样,它就会被扣分,即便它的方法其实比原始方法还要好。这就是一个错误的信号,不能正确引导 LLM。

那有没有办法改进奖励函数和数据集呢?如果你们有什么好主意,欢迎留言!我今天就先讲到这儿

总结

AI 软件工程师这个概念,其实离我们并不远。而且,很可能很快就会开源,让全球的软件开发者都能轻松使用。

我们刚刚讲了一种可行的方法,用来构建一个 AI 软件工程师。这个过程还可以通过很多方式进一步优化。用 RL 来训练 LLM 还处在初期阶段,这个领域里还有很多“低垂的果实”,研究空间巨大。

我今年也打算正式进入这个领域,如果你也感兴趣,真心建议你也来探索看看。

如何打造你自己的 AI 软件工程师(像 Devin 那样)的更多相关文章

  1. [招聘] 上海耐斯特数字招聘3D图形软件工程师

    公司介绍 上海耐斯特数字科技有限公司成立于2018年9月,致力于为中国原创动画.影视行业提供新一代核心技术解决方案和全流程技术服务.公司创始团队拥有国内外领先的行业背景与资源,在DCC软件开发方面具有 ...

  2. 连载《一个程序猿的生命周期》-《发展篇》 - 3.农民与软件工程师,农业与IT业

    相关文章:随笔<一个程序猿的生命周期>- 逆潮流而动的“叛逆者”        15年前,依稀记得走出大山,进城求学的场景.尽管一路有父亲的陪伴,但是内心仍然畏惧.当父亲转身离去.准备回到 ...

  3. 1、软件工程师要阅读的书籍 - IT软件人员书籍系列文章

    软件工程师要阅读的书籍估计是项目组内最多的.软件工程师处于项目组中最基础的人员储备阶层,与项目的关系最密切.当然,现在是大数据时代,我们无法全部看完所有相关的书籍,只能够先学习工作需要的知识,然后在项 ...

  4. [No00004D]深度思考好文:软件工程师的困境

    昨天是我一同学结婚的好日子,同学们大家聊各自的工作,有个同学突然问了我一句:我们同学中好像做软件的不多?如果再细分,好像做网络相关的更少? 回想起当时为何读计算机信息管理的专业,是因为那时听说读电脑未 ...

  5. Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结

    Atitit.  高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...

  6. CEO应向软件工程师学习的7个技能

    软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学 ...

  7. Google前工程经理王忻:如何准备软件工程师的面试

    http://t.jobdu.com/thread-368-1-1.html 导读:原文作者王忻,Google前工程经理,2003年月加入Google,是Google Lively背后的主导力量,是G ...

  8. 转载:CEO应向软件工程师学习的7个技能

    软件工程师的哪些技能是值得CEO学习的?显然,软件工程师是逻辑的,高效的,注重细节的,有计划的,并且大多数CEO也是如此.但是,软件工程师还有一些更微妙,甚至是令人懊恼的品质,那么CEO是否可以从中学 ...

  9. 软件工程师所需掌握的“终极技术”是什么?

    软件工程师所需掌握的"终极技术"是什么? http://yunli.blog.51cto.com/831344/1019990 最近,我在微博上看到@程序员邹欣老师发的一条微博 - ...

  10. net软件工程师求职简历

    Net软件工程师求职简历 姓    名: 王静静 性    别: 女 出生日期: 1991-12 籍    贯: 河北 居住地: 北京 学    历: 专科 E-mail: 335659753@qq. ...

随机推荐

  1. Github无法访问解决办法

    Github无法访问解决办法 问题描述:网速正常,但是github无法访问. 解决办法: 1.因为Github网址域名更换.查询网站https://ipchaxun.com/ ,例如输入github. ...

  2. COCI 2024/2025 #3

    T1 P11474 [COCI 2024/2025 #3] 公交车 / Autobus 愤怒,从红升橙足以说明其恶心,考场上调了半小时才过. 这道题的车能够开 \(24\) 小时,并且他能从前一天开到 ...

  3. 即时通讯技术文集(第35期):IM群聊技术合集(Part2) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第35 期. ​[- 1 -] 直播系统聊天技术(一):百万在线的美拍直播弹幕系统的实时推送技术 ...

  4. Apgar score

    Apgar score Apgar is a quick test performed on a baby at 1 and 5 minutes after birth. The 1-minute s ...

  5. Java 中toString方法在枚举中的应用:展示枚举字段信息

    在Java编程中,枚举(enum)是一种特殊的数据类型,它允许程序员定义一组固定的常量.枚举类型在Java中非常有用,尤其是在需要表示一组固定选项(如星期.月份.方向等)时.尽管枚举类型在定义时看起来 ...

  6. Harbor 共享后端高可用-简单版

    1. 主机配置 主机地址 主机配置 主机角色 软件版本 192.168.1.60 CPU:4C MEM:4GB Disk: 100GB Harbor+Keepalived Harbor 2.1.3 K ...

  7. Report -「概率数据结构」随机化骗分?我们是专业的!

    \[\mathscr{Lorain~y~w~la~Lora~blea.} \newcommand{\DS}[0]{\displaystyle} % operators alias \newcomman ...

  8. Solution Set -「LOCAL」冲刺省选 Round I

    \(\mathscr{Summary}\)   状态还行叭.   A 题又犯坏习惯,走起来就大力分讨,上了个厕所之后冷静一下开始寻找比较普适性的 DP 状态,然后几乎就切掉了,可惜复杂度写假了没发现( ...

  9. CDS标准视图:维修工单工艺数据 I_MAINTORDEROPERATIONDATA

    视图名称:维修工单工艺数据 I_MAINTORDEROPERATIONDATA 视图类型:基础 视图代码: 点击查看代码 @EndUserText.label: 'Maintenance Order ...

  10. linxux学习01

    Linux第一天 1.为什么要学习linux? 因为大数据中绝大部分核心组件都是基于linux操作系统运行的,企业中基本上都是linux系统. 2.怎么去学linux?(什么是大数据) 大数据技术组件 ...