如何打造你自己的 AI 软件工程师(像 Devin 那样)

扩展 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 还处在初期阶段,这个领域里还有很多“低垂的果实”,研究空间巨大。

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

原创作者: jellyai 转载于: https://www.cnblogs.com/jellyai/p/18787935
03-21
关于 Devin 的 IT 背景,目前并没有直接的信息表明其具体的领域贡献或技术成就。然而,在提及的相关引用中可以推测一些间接线索[^1]。 从引用的内容来看,“Devin AI software engineer?” 提到的是知乎上的讨论主题,这可能意味着 Devin 是一位与人工智能软件工程相关的工程师或者研究者。尽管如此,这一信息并未提供明确的技术背景或项目经历支持。 进一步分析可知,如果将 Devin 放置在整个行业背景下考察,则可联想到当前热门的人工智能开发方向以及多模态模型的应用场景。例如 Gato 这样的通用代理展示了现代 AI 技术如何跨越不同任务边界实现统一框架下的多样化功能[^2]。虽然这些内容未直接涉及 Devin ,但它反映了当下 AI 工程师所需具备的核心能力——即跨学科知识融合和技术实践创新能力。 另外值得注意的是,在企业数字化转型过程中,像 Mr.K 黄哲铿这样的专家强调了技术和业务相结合的重要性[^4]。对于任何从事 IT 行业尤其是专注于人工智能领域的个人而言,理解并应用这种理念将是职业发展中不可或缺的一部分。 综上所述,基于现有资料无法确切得出 Devin 在 IT 方面的具体背景;但从整体行业发展角度来看,作为一位自称 “AI software engineer” 的人士,很可能正在探索诸如多模态学习、算法优化等领域前沿课题,并努力推动技术创新应用于实际问题解决之中。 ```python # 示例代码展示了一个简单的机器学习训练过程 import tensorflow as tf model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(32,)), tf.keras.layers.Dense(10) ]) optimizer = tf.keras.optimizers.Adam() loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) @tf.function def train_step(inputs, labels): with tf.GradientTape() as tape: predictions = model(inputs, training=True) loss_value = loss_fn(labels, predictions) gradients = tape.gradient(loss_value, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables)) # 假设这是 Devin 可能会参与的一个基础实验部分 train_data = ... # 加载训练数据集 for epoch in range(num_epochs): for step, (inputs, labels) in enumerate(train_data): train_step(inputs, labels) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值