能自我修复的代码是软件开发的未来 [译]
开发者喜欢用自动化的方法来解决他们的问题,鉴于生成式 AI 的崛起,这种概念可能会在代码的创建,维护,以及改进等方面得到全新应用。
大语言模型中最引人入胜的一点是,它们能够通过自我反思来改善输出效果。将模型自身的回答反馈给它,然后让它改进回答或识别错误的部分,它就有更高的几率生成事实准确或令用户感到满意的结果。当要求模型通过展示一步步的过程来解决问题时,系统提供的答案往往比不展示一步步过程的系统提供的答案更准确。
尽管这一领域仍在迅速发展,而且许多由大语言模型驱动的聊天机器人仍存在被称为“幻觉”的事实错误,但越来越多的研究成果显示,采用更有指导性、自回归的方法能够带来更优的结果。
将这种方法应用到软件开发和 CI/CD 领域时,得到的结果格外引人注目。大部分开发者都已经熟悉那些有助于自动化编写代码、侦测漏洞、测试解决方案及记录创意的流程。关于自我修复代码的概念,曾有一些开发者在过去撰写过文章。你可以在Stack Overflow 的 CI/CD Collective找到众多实例,展示了技术专家如何把这些想法付诸实际操作。
当代码出错时,系统通常会显示错误信息。如果你的软件设计得当,那么这个错误信息将精准的反映出问题所在,并指引你找到解决方案。先前的自我修复代码程序通过巧妙的自动化减少错误、实现优雅的故障回退,并进行警报管理。例如,当你收到使用率达到 90% 的警报时,你可能会想要增加一些磁盘空间或删除一些文件。或者,有没有尝试过重启系统呢?
开发者热衷于用自动化手段解决问题,随着生成式 AI 的崛起,这种理念有望在代码的创建、维护和改进方面达到一个全新的层次。
编写更多代码需加强质量控制
随着大语言模型 (LLMs) 能快速生成大量代码,开发者乃至非开发人员未来可能会为公司代码库贡献更多代码,这自然带来了一系列挑战。
谷歌云的开发者媒体负责人 Forrest Brazeal 表示:“我听到很多软件工程师都在说,现在几乎任何人都能利用这些工具快速生成代码,但我们更关心的是这些代码的质量问题。”这些系统产出代码的速度和数量可能让人难以应对。“想象一下,你需要审查团队成员提交的长达 7000 行的代码合并请求,这非常困难,很难提供有价值的反馈。当 AI 产生大量代码时,这个问题并没有得到缓解。因此,我们迫切需要制定软件工程的最佳实践,确保我们能高效利用生成式 AI。”
麻省理工学院计算机科学与人工智能实验室的教授 Armando Solar-Lezama 在接受华尔街日报采访时谈到了“技术债务”这一概念。他说:“长期以来我们一直在讨论技术债务,如今我们拥有了一张全新的‘信用卡’,使我们能够以前所未有的方式积累技术债。我认为,有一种风险是大量由机器编写的劣质代码。”他补充道,公司需要重新考虑如何与这些新工具的功能相结合,以避免此类问题的发生。
我们最近与 Google 的一些工程师进行了一次交谈,他们参与了在 Bard 等工具中引入新 AI 模型以提供代码建议功能的构建和测试工作。Paige Bailey,Google 生成式模型的项目经理(PM),她在将 DeepMind 和 Google Brain 合并后成立的新部门工作。Bailey 表示:“你可以把 AI 生成的代码想象成由一个 L3 SWE(三级软件工程师)助手制作的,这个助手服从于你的指令,但你需要非常仔细地进行审核。”
不过,Bailey 认为,未来检查代码的准确性、安全性和运行速度这些工作的一部分也将由 AI 来承担。“我确实期待随着时间的推移,大语言模型(LLM)会开始将自己的技术反复应用到代码产出中。Google Brain 的研究已经展示了这一点,你可以让大语言模型反复检查生成的代码,比如指令它确认代码中没有错误,性能优良,运行迅速,然后输出这些代码,最终展示给用户。所以我希望这种能力会随着时间进步。”
如今人们在构建和尝试什么新技术?
Google 已经在利用这项技术来加速处理代码审查中的评论。一篇探讨这种方法的最新论文作者指出:“目前,在 Google,许多代码更改的作者通过采用机器学习(ML)推荐的编辑来回应审查者的评论。我们预计,这将每年为 Google 节省数十万小时的代码审查时间。我们收到了很多积极的反馈,这些未经请求的反馈表明,ML 推荐的代码编辑显著提高了 Googlers 的工作效率,使他们能够专注于更富创造性和复杂的任务。”
Google 的 Duet 编码助手项目经理 Marcos Grappeggia 说:“在代码审查过程中,经常会遇到审查者要求修正某些问题或为了提高代码可读性而重构代码。我们认为,一个能够响应这些请求的 AI 代理(AI Agent)就像一个高级的审查工具。”他补充说:“我们看到这种做法在缩短修复时间上很有潜力。”这些建议的修复并不会取代人工操作,“但它们确实有所帮助,为你的思考提供了一个起点。”
最近,我们见证了一些引人注目的实验,这些实验将这种审查能力应用到即将部署的代码中。例如,当你的代码推送触发 CI 流程中的构建失败警报时,一个插件会触发 GitHub 操作,自动把代码发送到一个沙盒环境,由 AI 审查代码及相关错误信息,然后提交更新修正错误。这个新代码会再次经过测试流程,如果测试通过,就会被部署上线。
“我们对重试循环的机制进行了几项改进,避免出现异常情况,这就是其核心原理,”Calvin Hoenes这样解释道,他是这个插件的创造者。为了提高智能体的准确性,他将代码说明文档加入到了自己使用Pinecone创建的向量数据库中。这使得智能体能够学习到基本模型可能无法获取的信息,并且可以根据需要进行定期更新。
他目前的工作是在 CI/CD 流程中进行,但他梦想有一天这样的智能体能够帮助修正已在现实世界中运行的代码错误。Hoenes 提出了这样的问题:“特别有意思的是,如果你的代码在生产环境中运行时出现了错误,它能否实时自我修复?”他继续说道:“比如,在你的 Kubernetes 集群中,如果某个部分发现了故障,它会立即开始修复流程。”
当一个容器因故障被移除进行修复,另一个容器会暂时替代它的位置,待原始容器准备就绪后,它将重新投入使用。Hoenes 表示,目前我们仍然需要人类的参与。他提出了这样的疑问:将来是否会有那么一天,计算机程序在被设计和发展的过程中能够自动实现自我修复?“我的意思是,如果你的代码有非常全面的测试覆盖,比如说达到了百分之百,而且代码库非常干净,我认为这是有可能实现的。但就目前可预见的未来而言,我们还是更倾向于让人类参与其中。”
薪火相传:代码审查者、维护者与永无休止的技术债斗争
在持续集成和持续交付(CI/CD)过程中及时发现并处理问题固然重要,但我们可以做得更深入。设想你在一家代码库庞大且日益增长的公司工作,你们不可避免地面临着一定程度的技术债。如果有一个 AI 智能体能够回顾旧代码,并提出它认为可以提高代码效率的改进建议会怎样呢?它可能会提醒你关于某些库的最新更新,这些更新对你的系统架构大有裨益。或者它可能在最近的技术博客或文档中了解到一些改进特定功能的新方法。AI 提供的建议每天早上以合并请求 (pull requests) 的形式提交给人类审查。
CodiumAI 的首席执行官 Itamar Friedman 当前正尝试在编码过程中解决这一问题。他的公司开发了一款 AI 机器人,它像开发人员的编程伙伴一样工作,提示他们关于失败的测试、潜在的边界情况,并在他们编写代码时指出潜在漏洞,旨在确保最终产品尽可能完美无缺。他表示,很多衡量代码质量的工具都专注于性能、可读性和避免重复等方面。
Codium 正在研发允许测试底层逻辑的工具,Friedman 认为这是对功能代码质量更精确的定义。他相信,基于这种方法,代码的自动改进不仅可能,而且很快就会变得普遍。“如果你能够验证代码逻辑,那么你很可能也能帮助自动化合并请求,并确保这些请求遵循最佳实践。”
Itamar,作为 AutoGPT 的贡献者,曾与其创造者共同演讲,他展望了一个人类与 AI 相互指导的未来。“一台机器将审查你的整个代码仓库,并告诉你它发现的所有最佳(以及一般)实践。然后,一些技术主管可以对此进行审查,并说,天啊,这正是我们想要的,或者不是我们想要的做法。这是我们的测试最佳实践,这是我们调用 API 的最佳实践,这是我们喜欢的队列处理方式,这是我们的缓存策略等等。它将是可配置的,规则将是 AI 建议与人类定义的结合,之后由 AI 机器人使用,以协助开发人员。这将是一项了不起的创新。”
Stack Overflow 如何在探索生成式 AI 领域?
正如我们的 CEO 最近所宣布,Stack Overflow 成立了一个专门的团队,专注于探索 AI 技术(包括最新的生成式 AI)如何能够提升我们的平台和产品的质量。我们计划在公众视野中进行这项建设,以便将用户反馈融入我们的开发过程中。为了体现这一精神,我们展示了一项实验,这个实验协助用户构思更佳的问题标题。我们的目标是简化提问者和审核者的任务,激励更多人参与到我们公共平台上的知识分享中。
可以想象一个更加迭代的过程,它依赖于多步提示和链式思维推理技术。这些技术根据研究 表明 可以 显著提升大语言模型(LLM)输出的质量和精确性。
一个 AI 系统可以分析一个问题,提出改善标题可读性的建议,并给出如何更优化问题正文中代码格式的想法,以及在最后添加几个额外标签来改进分类。另一个系统,即审核者,会检查更新后的问题并对其进行评分。如果问题达到一定标准,就可以交回用户复审。如果不达标,系统会根据之前的建议进行改进,并重新提交其改进后的内容以供审批。
我们很荣幸能与 Prosus 的同事们合作,他们中许多人在机器学习领域有着几十年的经验。我最近与 Prosus AI 的数据科学主管 Zulkuf Genc 进行了交流。他曾专注于自然语言处理(NLP),并共同开发了一种基于大语言模型(LLM)的模型,用于分析金融情绪的 FinBert,这个模型在 HuggingFace 的同类模型中一直是最受欢迎的之一。
“我以前在学术研究中尝试使用自动智能体,但效果并不理想,它们需要依靠更多规则引导的启发式方法,所以并不是真正的自动化,”他在本月的采访中向我透露。但是,最新的大语言模型 (LLMs) 彻底改变了这一状况。他解释说,现在我们可以让智能体自行执行任务并取得不错的成果,特别是当任务定义得很明确时。“以 Stack Overflow 为例,那里有很好的质量指南指导我们判断何为优质的问题和答案,因为它们明确定义了好的问题和答案应该具备的特点。”
你的看法呢?
开发者们对这类自动化技术给行业带来的影响既感到好奇又有所担忧。但目前来看,这些工具更多的是提升和增强现有技能,而不是完全替代人类。有些机器人似乎已经学会了如何自动陷入无尽的循环中。这些不知疲倦的智能体总在努力维护代码的清洁。我们可以说目前为止,他们似乎和普通开发者一样,很容易就被分散注意力。
虽然科技日新月异,但拖延的习性始终难以克服。
我们正在整理开发者调查的结果,准备分享大量关于开发者如何看待这些工具以及他们在多大程度上已经将其融入工作流程的有趣数据。
如果你也在探索类似的想法,从自我修复的代码到 Roboblogs,请留言告诉我们,我们会努力将你的经历纳入我们下一篇文章。如果你想深入了解 Stack Overflow 在 AI 方面的最新动态,请查看我们在 Meta 上分享的一些实验。