虽然本书主要讨论将生成式人工智能(尤其是LLMs)集成到软件应用程序中,但在本章中,我们将讨论如何利用LLMs来帮助软件开发。这是一个庞大的主题;软件开发已被几家咨询公司(如毕马威和麦肯锡)的报告强调为受生成式人工智能影响最大的领域之一。
首先,我们将讨论LLMs如何在编码任务中发挥作用,并提供一个概述,看看我们在自动化软件开发方面取得了多大的进展。然后,我们将尝试使用几个模型,定性评估生成的代码质量。接下来,我们将实现一个完全自动化的软件开发任务代理。我们将详细介绍设计选择,并展示使用LangChain编写的仅有几行Python代码的代理实现的一些结果。我们将提到许多可能的扩展方法。
在整个章节中,我们将致力于自动软件开发的不同实用方法,您可以在书籍的GitHub存储库(github.com/benman1/gen...)中的software_development目录中找到这些方法。
简而言之,本章的主要部分包括:
- 软件开发与人工智能
- 使用LLMs编写代码
- 自动化软件开发
我们将通过对目前在使用人工智能进行软件开发的当前状态进行广泛概述开始本章。
软件开发与人工智能
强大的AI系统如ChatGPT的出现引起了在使用AI作为辅助软件开发工具的兴趣。KPMG于2023年6月发布的一份报告估计,约有25%的软件开发任务可以通过自动化完成。同月,麦肯锡的一份报告强调了软件开发作为一项能够在成本和效率方面产生显著影响的功能,其中生成式AI可以发挥重要作用。
软件开发的历史一直以来都在努力提高从机器代码中抽象出来的程度,以便更多地专注于问题解决。上世纪50年代早期的过程化语言(如FORTRAN和COBOL)通过引入控制结构、变量和其他高级构造,实现了这一目标。随着程序规模的扩大,结构化编程的概念出现,通过模块化、封装和逐步细化来改进代码组织。上世纪60-70年代的面向对象语言(如Simula和Smalltalk)通过对象和类引入了模块化的新范 paradigm。
随着代码库的扩大,保持质量变得更加具有挑战性,于是敏捷开发等方法学应运而生,引入了迭代周期和持续集成的概念。集成开发环境发展起来,为编码、测试和调试提供智能辅助。静态和动态程序分析工具帮助识别代码中的问题。随着神经网络和深度学习在20世纪90年代和2000年代的进展,开始将机器学习技术应用于改进程序合成、漏洞检测、漏洞发现以及自动化其他编程任务的能力。
今天的AI助手集成了预测性输入、语法检查、代码生成等功能,直接支持软件开发工作流程,实现了自动编程的早期愿望。
新的代码LLMs,如ChatGPT和Microsoft的Copilot,是非常受欢迎的生成式AI模型,拥有数百万用户和显著提高生产力的能力。LLMs可以处理与编程相关的不同任务,例如:
- 代码完成:该任务涉及基于周围代码预测下一个代码元素。在集成开发环境(IDE)中,通常用于帮助开发人员编写代码。
- 代码摘要/文档:该任务旨在为给定的源代码块生成自然语言摘要或文档。这个摘要帮助开发人员了解代码的目的和功能,而不必阅读实际代码。
- 代码搜索:代码搜索的目标是根据给定的自然语言查询找到最相关的代码片段。该任务涉及学习查询和代码片段的联合嵌入,以返回代码片段的期望排名顺序。
- 找BUG/修BUG:AI系统可以减少手动调试工作,增强软件的可靠性和安全性。许多程序员很难找到的错误和漏洞,虽然存在用于代码验证的典型模式。作为替代方案,LLMs可以在代码中发现问题并在提示时进行纠正。因此,这些系统可以减少手动调试工作,帮助提高软件的可靠性和安全性。
- 测试生成:与代码完成类似,LLMs可以生成单元测试(Codet: Code Generation with Generated Tests;Bei Chen等人,2022)和其他类型的测试,提高代码库的可维护性。
AI编程助手结合了早期系统的互动性和创新的自然语言处理。开发人员可以用简单的英语查询编程问题或描述所需的功能,得到生成的代码或调试提示。然而,仍然存在与代码质量、安全性和过度依赖有关的风险。在保持人类监督的同时找到计算机增强的平衡是一项持续的挑战。
让我们来看看当前用于编码的AI系统的性能,特别是代码LLMs。
Code LLMs
出现了许多AI模型,每个模型都有其优点和缺点,它们不断竞争以改进并提供更好的结果。性能随着模型的不断发展而持续提高,例如StarCoder,尽管数据质量也可以起到关键作用。研究表明,LLMs可以提高工作流效率,但需要更强的鲁棒性、集成性和沟通能力。
像GPT-3和GPT-4这样的强大预训练模型使其能够提供上下文感知、会话支持。这些方法还赋予了bug检测、修复建议、自动化测试工具和代码搜索等功能。
近期里程碑:
- OpenAI的Codex模型(2021年)能够根据自然语言描述生成代码片段,显示了对程序员的协助潜力。
- GitHub的Copilot(2021年推出)是LLMs早期集成到IDE中以进行自动补全的案例,取得了迅速的采纳。
- DeepMind的AlphaCode(2022年)匹配了人类的编程速度,展示了生成完整程序的能力。
- OpenAI的ChatGPT(2022年)展示了在编码方面具有异常连贯的自然语言对话。
- DeepMind的AlphaTensor和AlphaDev(2022年)展示了AI发现新颖、与人类竞争的算法的能力,实现了性能优化的突破。
微软的GitHub Copilot基于OpenAI的Codex,利用开源代码实时提供完整的代码块建议。根据GitHub在2023年6月的一份报告,开发者大约有30%的时间接受了AI助手的建议,这表明该工具能够提供有用的建议,而经验较少的开发者从中受益最多。
Codex是由OpenAI开发的模型。它可以解析自然语言并生成代码,驱动着GitHub Copilot。作为GPT-3模型的后继者,它经过对来自GitHub的公开可用代码进行了微调,包括来自5400万个GitHub仓库的159千兆字节的Python代码,用于编程应用。
为了说明在创建软件方面取得的进展,让我们看一下基准测试中的定量结果:HumanEval数据集,该数据集由Codex论文引入(《评估基于代码的大型语言模型,2021》),旨在测试LLM根据函数的签名和docstring完成的能力。它评估了从docstrings中合成程序的功能正确性。该数据集包括涵盖语言理解、算法和简单数学等各个方面的164个编程问题。其中一些问题与简单的软件面试问题相当。HumanEval上的一个常见指标是pass@k(pass@1)-这是指在生成每个问题的k个代码样本时正确样本的比例。
此图总结了HumanEval任务上的AI模型(参数数量与HumanEval上的pass@1性能之间的关系)。一些性能指标是自行报告的:
你可以看到标记有封闭源模型性能的线,如GPT-4、GPT-4 with reflection、PaLM-Coder 540B、GPT-3.5和Claude 2。这主要基于Big Code Models Leaderboard,该榜单托管在Hugging Face上,但我添加了一些模型进行比较,并省略了参数超过700亿的模型。一些模型具有自行报告的性能,因此您应该对此持谨慎态度。
所有模型都能在某种程度上进行编码,因为训练大多数LLM所使用的数据包括一些源代码。例如,《The Pile》中至少约11%的代码(由EleutherAI的GPT-Neo策划,用于训练GPT模型的开源替代品)来自GitHub(102.18 GB)。《The Pile》被用于Meta的Llama、Yandex的YaLM 100B等模型的训练。
尽管HumanEval广泛用作代码LLM的基准测试,但还有许多用于编程的基准测试。以下是一个示例问题及其在一个向Codex提供的高级计算机科学考试中的回答(来源:James Finnie-Ansley等人的《My AI Wants to Know if This Will Be on the Exam: Testing OpenAI's Codex on CS2 Programming Exercises, 2023》):