综述:从LLM到基于LLM的软件工程智体

261 篇文章 0 订阅
216 篇文章 0 订阅

24年8月来自悉尼大学等的论文“From LLMs to LLM-based Agents for Software Engineering: A Survey of Current, Challenges and Future”。

随着大语言模型 (LLM) 的兴起,研究人员越来越多地探索其在软件工程等各种垂直领域的应用。LLM 在代码生成和漏洞检测等领域取得了显著成功。然而,它们也表现出许多限制和缺点。基于 LLM 智体是一种具有人工通用智能 (AGI) 潜力的新技术,它将 LLM 结合为决策和采取行动的核心,解决了 LLM 的一些固有局限性,例如缺乏自主性和自我完善。

尽管有大量研究和调查探索在软件工程中使用 LLM 的可能性,但 LLM 和基于 LLM 智体之间缺乏明确的区别。本文广泛调查软件工程中 LLM 和基于 LLM 智体的当前实践和解决方案。具体来说,总结六个关键主题:需求工程、代码生成、自主决策、软件设计、测试生成和软件维护。从这六个主题回顾并区分 LLM 和基于 LLM 智体的工作,研究了它们在任务、基准和评估指标方面的差异和相似之处。最后,讨论所使用的模型和基准,全面分析它们在软件工程中的应用和有效性。

GPT [3] 和 Codex [4] 等 LLM 在处理软件工程(SE)中的下游任务(包括代码生成、调试和文档编制)方面表现出色。这些模型利用大量训练数据来生成类似人类的文本,提供前所未有的流畅度和连贯性。研究表明,LLM 可以通过提供智能代码建议、自动执行重复任务,甚至根据自然语言描述生成整个代码片段来提高软件项目的生产力 [5]。

尽管 LLM 具有巨大潜力,但将其应用于 SE 仍面临重大挑战。一个主要问题是其有限的上下文长度 [6],这限制了模型理解和管理大量代码库的能力。幻觉是另一个主要问题,即模型生成的代码看似合理,但实际上不正确或毫无意义 [7]。此外,LLM 无法使用外部工具,这限制了它们对实时数据的访问,并阻止它们执行训练范围之外的任务。在复杂的项目中,LLM 的静态性质可能会阻碍其适应不断变化的需求或有效整合新信息的能力。此外,LLM 通常不能与外部工具或数据库交互,进一步限制了它们在动态和不断发展 SE 环境中的实用性。

为此,基于 LLM 智体应运而生 [9] [10],将 LLM 的优势与外部工具和资源相结合,实现更加动态和自主的操作。这些智体利用人工智能领域的最新进展,如检索增强生成 (RAG) 和工具利用率,来执行更复杂、更具上下文-觉察的任务 [11]。例如,OpenAI 的 Codex 已集成到 GitHub Copilot [12] 中,可在开发环境中实现实时代码建议和完成。与静态 LLM 不同,基于 LLM 智体可以执行各种任务,例如通过识别和修复错误来自主调试代码、主动重构代码以提高效率或可读性,以及生成与代码库一起发展的自适应测试用例。这些特性使基于 LLM 智体成为 SE 的强大工具,能够处理比传统 LLM 更复杂和动态的工作流程。

在软件工程中,基于 LLM 智体在自主调试、代码重构和自适应测试生成等领域显示出良好的前景,展示了接近通用人工智能 (AGI) 的能力。

传统的 LLM 通常仅根据给定的自然语言描述生成响应,缺乏独立思考和判断的能力。基于LLM的智体能够通过多轮交互和定制提示来收集更多信息,从而使模型能够自主思考和决策。2023年,Zhao提出ExpeL框架[35],该框架利用ReAct作为规划框架,并结合经验池[36]。这使得LLM能够从过去的记录中提取见解,以帮助后续的相关查询,让LLM分析以前的答案不正确的原因,它从经验中学习以识别问题。

与此同时,基于LLM的具身智体的应用也成为近年来的热门研究领域。基于LLM的具身智体是将LLM与具身智体集成的智能系统[37]。这些系统不仅可以处理自然语言,还可以通过对物理或虚拟环境中的感知和动作来完成任务。通过将语言理解与实际动作相结合,这些智体可以在更复杂的环境中执行任务。这种集成通常涉及使用视觉领域技术来处理和理解视觉数据,并使用强化学习算法来训练智体在环境中采取最佳行动。这些算法通过奖励机制引导智体学习如何在不同情况下做出最佳决策,而 LLM 则充当大脑,理解用户指令并生成适当的反馈。2023 年,Wang推出了 VOYAGER,这是一个具有大语言模型的开放式具身智体 [38]。它使用 GPT-4 结合输入提示、迭代提示机制和技能库,使基于 LLM 智体能够自主学习和玩 Minecraft 游戏,成为该游戏中第一个终身学习的智体。

一项值得注意的技术是检索增强生成 (RAG),输入问题与索引库中的文档进行相似性匹配,尝试找到相关的结果。如果检索到类似的文档,则将它们与输入问题一起组织起来生成新的提示,然后将其输入到大语言模型中。目前,大语言模型具备长文本记忆能力,许多研究已经将 Gemini v1.5 与大海捞针 (NIAH) 评估进行了比较,探索 RAG 是否已经过时 [41]。然而,从成本和费用等各个角度来看,RAG 仍然具有显著的优势(RAG 比使用所有 tokens 便宜 99%)。此外,长文本会对响应性能产生负面影响,当输入文本过长时,会导致 LLM 响应更慢。因此,LLM 在上下文长度方面的进步不会完全取代 RAG 的作用,而应被视为相互补充。

单智体系统利用 LLM 的功能来执行各种任务,通常使用单个 LLM 来理解和响应用户查询、生成内容或根据预定义指令执行自动化任务。单智体通常用于任务接受一般答案且不需要复杂决策的场景。示例包括客户服务聊天机器人、用于调度的虚拟助手和自动内容生成工具。但是,智体可能难以处理长上下文输入,从而导致不一致或不相关的响应。在处理需要大量知识或上下文的任务时,这些系统的可扩展性也受到限制,这个问题通常会因长文本而加剧,因为大语言模型无法在一次轮回中完全理解和分析过长的信息。大语言模型的主要问题之一是幻觉 [7]。幻觉是指 LLM 生成虚构的信息或定义,并以看似合乎逻辑和合理的语言呈现给用户。虽然提示工程或工具干预可以减轻幻觉造成的影响,但不能完全消除。 2023 年,Ji对自然语言生成中的幻觉进行了深入研究 [42]。该研究回顾了自然语言生成中解决幻觉问题的进展和挑战,对不同任务中的幻觉现象进行了全面的分析,包括其定义和分类、原因、评估指标和缓解方法。

多智体系统涉及多个 LLM 或智体的协作,有效处理复杂任务。这些系统充分利用多个模型的优势,每个模型专注于任务的特定方面,减少单个智体中多进程造成的开销,智体之间的协作可以实现更复杂、更强大的问题解决能力。由于其卓越的能力,越来越多的研究人员开始探索基于多个 LLM 智体领域,并开始将其应用于软件工程领域。2024 年,许多研究人员将多智体系统应用于实际实验 [43] [44]。

多智体系统通过以下方式解决了单智体系统的局限性:
增强上下文管理:多智体可以维护和共享上下文,在长时间交互中生成更连贯、更相关的响应。
专业化和分工:不同智体可以专注于特定任务或问题的各个方面,从而提高效率和效力。
稳健性和错误纠正:协作的智体可以交叉检查和验证彼此的输出,从而降低出错的可能性并提高整体可靠性。
上下文一致性:多智体系统可以在长时间对话中更好地管理上下文。多智体的协作提高了事件缓解的效率。
可扩展性和灵活性:这些系统可以集成专业化智体来扩展和处理更复杂的任务。通过多智体之间的分工,可以提高代码生成的质量。
动态问题解决:通过集成具有不同专业知识的智体,多智体系统可以适应更广泛的问题并提供更准确的解决方案。

需求工程

需求工程是软件工程中的一个重要领域,在软件开发过程中起着至关重要的作用,其主要任务是确保软件系统满足所有相关利益相关者的需求。通常,项目开发中的需求工程涉及许多步骤,开发人员需要充分了解用户的需求和期望,以确保软件系统的开发方向与实际需求一致。然后,开发小组对收集的需求进行整理和评估。需求规范是将分析的需求正式记录下来,规范必须准确、简洁,并且必须进行需求验证,以确保开发人员构建的是用户需要的并且符合规范。需求工程还包括需求管理,这是一项涵盖整个软件开发生命周期的任务,开发人员需要持续跟踪、控制和响应开发过程中发生的任何变化,确保这些变化不会对项目的进度和整体质量产生负面影响。

如图所示:基于 LLM 智体和 LLM 在用户故事细化中的比较框架

请添加图片描述

代码生成和软件开发

代码生成和软件开发是软件工程的核心领域,在软件开发过程中起着至关重要的作用。LLM 在代码生成中的应用主要目的是通过自动化流程提高开发效率和代码质量,从而满足开发者和用户的需求。

近年来,LLM 在代码生成和软件开发中的应用取得了重大进展,改变了开发者的工作方式,并揭示了自动化开发流程的转变。与需求工程相比,LLM 和基于 LLM 智体在代码生成和软件开发中的应用研究更加广泛和深入。利用自然语言处理和生成技术,LLM 可以理解和生成复杂的代码片段,帮助开发者自动化从代码编写、调试到软件优化的各个阶段。基于解码器的大语言模型(如 GPT-4)通过提供准确的代码建议和自动调试,在代码生成方面显示出巨大的潜力,大大提高了开发效率。近来,基于 LLM 的智体在软件开发中的应用也受到关注,这些智体不仅可以执行复杂的代码生成任务,还可以自主学习和持续改进,从而在动态开发环境中提供灵活的帮助。集成 LLM 的 GitHub Copilot [12] 等工具已在提高编程效率和代码质量方面展现出优势。

如图所示:基于 LLM 智体和 LLM 在代码生成和软件开发中的比较框架

请添加图片描述

自主学习与决策

自主学习与决策是现代软件工程中一个至关重要且不断发展的领域,尤其是在人工智能和大数据的影响下。自主学习与决策的核心任务是通过机器学习算法和智能系统实现自动化的数据分析、模型构建和决策优化,从而提高系统的自主性和智能性。

在此过程中,LLM 和基于 LLM 智体带来了无数的可能性,随着 NLP 技术的发展,LLM 在该领域的应用也取得了很多成果。这些模型可以处理复杂的语言任务,同时还具有强大的推理和决策能力,对使用多个 LLM 调用进行投票推理的研究揭示了优化性能的新方法,其中最常用的方法是多数投票 [89],这提高了推理系统的准确性并确保选择最优的可能性。此外,LLM 在自动调试和自我纠正等任务中的表现增强了系统的自主学习能力,实现了高效的错误识别和纠正。同时,基于LLM的智体在自主学习与决策中的应用也是一个新颖而又热门的课题,这些智体可以借助 LLM 完成复杂的推理与决策任务,并通过不断学习和优化提高其在动态环境中的适应能力。

在学习和适应机制方面,LLM 的适应和学习通常局限于模型的训练数据和参数范围,虽然可以通过新数据更新进行适应,但缺乏从实时反馈中不断学习的能力,更专注于利用现有知识解决问题并产生响应。相比之下,基于 LLM 智体通常配备体验式学习和实时反馈适应机制,使它们能够根据持续的交互优化策略和响应。基于 LLM 智体框架的一个很好的例子是 Expel [35],它利用了先前研究的 ReAct [36] 和 Reflexion [98],如图所示。该框架利用记忆池和洞察池,使 LLM 能够从过去的知识中学习,从而辅助后续决策。这种自主决策能力是传统 LLM 框架无法实现的。

请添加图片描述

软件设计和评估

下一个是关于LLM 在软件设计和评估中的应用。软件设计是软件开发的早期阶段,设计的质量直接影响未来开发的质量。现代软件工程方法强调设计和开发的一体化,以确保设计阶段做出的决策无缝地转化为高质量的代码。因此,软件设计研究通常利用具有一定框架和特殊架构设计的 LLM 进行软件开发,探索与代码生成和开发相关的方面。软件设计框架通常涉及多个阶段的持续改进以达到最佳结果,这可以被视为 LLM 在软件开发中应用的一部分 [83]。同样,[85] 和 [84] 强调在使用 LLM 协助开发和设计时经常使用工具或 API 接口,这表明与代码生成和软件开发主题有重叠。

软件设计和评估中的 LLM 也与自主学习和决策有广泛的交叉,这两个主题是相互关联的领域。软件设计需要考虑系统的适应性和学习能力以应对动态环境,因此涉及自主学习和决策的设计评估自然成为这两个主题的交叉焦点。许多LLM技术和方法在这两个领域都有类似的应用,例如基于强化学习的LLM可用于自动设计决策和评估,也可用于自学习和优化。LLM在软件工程中的常见应用,包括利用提示工程技术对模型进行微调以不断提高性能;特别是在软件设计和评估中,通常需要更多的样本学习来确保模型输出符合用户期望[93][102][44][111][105][96]。此外,需求工程中的需求获取与规范,也可以看作是软件设计和评估的一部分[51][112]。

总体而言,LLM 在软件设计和评估中的应用通常侧重于特定任务的自动化,例如代码生成和日志汇总,并且倾向于在设计阶段评估能力而不是实现。基于 LLM 智体通过智能决策和任务执行来处理更复杂的工作流,从而扩展了 LLM 的功能,可以协作、动态调整任务并收集和利用外部信息。在软件设计和评估中,单一模型通常无法全面考虑设计和评估方面。基于 LLM 智体通过协同工作和更精细的角色分工,可以高效地完成设计任务并适应各种应用场景。然而,基于 LLM 智体在软件设计中的应用通常包含在软件开发中,如前所述,在软件设计阶段进行行动前的自我反思和推理。Chatdev [121] 框架使用角色分配来创建一个单独的软件设计阶段,这大大提高了后期开发阶段的灵活性和准确性,如图所示。在效率和成本方面,LLM 在文本生成和漏洞检测方面仍然略优于基于 LLM 智体。然而,处理类似于软件维护和根本原因分析的任务需要更复杂的架构,例如多轮对话、知识图和 RAG 技术,这可以进一步使设计和评估阶段受益。

请添加图片描述

软件测试

在软件开发中,一个至关重要的部分是软件测试,需要从最初的系统开发到最终部署持续进行。在行业中,通常使用敏捷开发,即在每个阶段持续测试系统以确保整个系统的稳健性,每当新代码提交到 GitHub 时,都会进行测试以确保更新版本的可用性。一种常见的方法是使用 Jenkins 实现持续集成和持续部署(CI/CD)。Jenkins 会自动挂钩开发人员将代码推送到 GitHub 的操作,并针对新版本运行测试套件。虽然整个过程倾向于自动化开发,但创建和改进测试用例仍然需要大量的人力。

开发中的典型角色涉及软件测试,例如编写单元测试、集成测试和模糊测试。自 2000 年之前以来,研究人员一直在尝试使用 AI 来帮助生成测试用例。最初的实现通常涉及更简单形式的 AI 和机器学习,以自动化部分测试用例生成过程。随着时间的推移,人们已经应用了更复杂的方法(例如自然语言处理和机器学习模型)来提高测试用例生成的精度和范围。Sofy 等在线工具也可用于帮助生成测试套件,其使用机器学习在应用程序中生成基于上下文的路径。使用大语言模型生成测试用例是一种相对较新的尝试,但发展迅速。2020 年,研究人员利用在标记数据上进行微调的预训练语言模型来生成测试用例。其开发一种基于序列-到-序列 transformer的模型“ATHENATEST”,并将其生成的结果与 EvoSuite 和 GPT-3 进行比较,结果显示测试覆盖率更高 [131]。越来越多的研究和模型致力于测试套件生成实验,例如,前面在代码生成部分提到的 Codex 模型 [67],结合思维链(CoT)提示,即使在零样本场景中,也能使用 CodeCoT 实现高质量的测试套件生成。引入LLM的目的,是使测试过程自动化和简化,使其更加严格,并且能够解决人类容易忽视的方面。

如图所示:基于 LLM 智体和 LLM 在软件测试中的比较框架
请添加图片描述

软件安全和维护

在软件工程中,软件安全与维护是LLM应用的热门领域,主要旨在通过现有技术增强软件系统的安全性和稳定性,以满足用户和开发者的需求。这些模型提供了有希望的漏洞检测和修复方法,同时还支持自动化安全测试和创新维护流程。LLM在软件安全和维护中的应用,涵盖漏洞检测、自动修复、渗透测试和系统鲁棒性评估等多个方面。与传统方法相比,LLM利用自然语言处理和生成技术来理解和生成复杂的代码和安全策略,从而自动执行检测和修复任务。例如,LLM可以通过分析代码结构和上下文信息准确识别潜在漏洞并生成相应的修复建议,从而提高漏洞恢复的效率和准确性。

此外,LLM不仅在漏洞检测方面表现出强大的能力,而且在渗透测试和安全评估等任务中也发挥作用。自动渗透测试工具,如PENTEST-GPT [143]。 LLM 还通过模拟各种攻击场景来评估系统在不同条件下的性能,在评估系统鲁棒性方面表现出显著的优势,帮助开发人员更好地识别和解决潜在的安全问题。基于 LLM 智体在软件安全和维护方面的研究也在不断发展,这些智体可以执行复杂的代码生成和漏洞修复任务,并具有自学习和优化能力,可以处理动态开发环境中遇到的问题。RITFIS [144] 和 NAVRepair [145] 等工具已显示出使用基于 LLM 智体提高程序修复精度和效率的潜力。

如图所示:基于 LLM 智体和 LLM 在软件安全和维护的比较框架

请添加图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值