AI个人学习
和实操指南

软件工程中的智能体:调研、现状与展望

原文:https://arxiv.org/abs/2409.09030

摘要

近年来,大语言模型(LLMs)取得了显著的成功,并在各种下游任务中得到了广泛应用,尤其是在软件工程(SE)领域的任务中。我们发现,许多将 LLM 与 SE 相结合的研究中,明确或隐含地采用了智能体的概念。然而,目前缺乏一篇深入的调研来梳理现有工作的发展脉络,分析现有工作如何将基于 LLM 的智能体技术结合起来以优化各类任务,并澄清基于 LLM 的智能体在 SE 中的框架。在本文中,我们首次对 LLM 智能体与 SE 结合的研究进行了调研,并提出了一个包含感知、记忆和行动三大关键模块的 SE 中 LLM 智能体框架。我们还总结了当前在将这两个领域结合时遇到的挑战,并提出了应对这些挑战的未来机会。我们维护了一个相关论文的 GitHub 仓库,地址为:https://github.com/DeepSoftwareAnalytics/Awesome-Agent4SE

1 引言

近年来,大语言模型(LLMs)取得了显著的成功,并在许多下游任务中得到了广泛应用,尤其是在软件工程(SE)领域的各种任务中 Zheng et al.,如代码摘要 Ahmed et al. (2024);Sun et al. (2023b);Haldar 和 Hockenmaier (2024);Mao et al. (2024);Guo et al. (2023);Wang et al. (2021),代码生成 Jiang et al. (2023a);Hu et al. (2024b);Yang et al. (2023a);Tian 和 Chen (2023);Li et al. (2023e);Wang et al. (2024b),代码翻译 Pan et al. (2024, ),漏洞检测与修复 Zhou et al. (2024);Islam 和 Najafirad (2024);de Fitero-Dominguez et al. (2024);Le et al. (2024);Liu et al. (2024b);Chen et al. (2023a) 等。许多将 LLM 与 SE 相结合的研究中,从人工智能领域引入了智能体的概念,或明或暗。明确使用意味着论文直接提及了智能体相关技术的应用,而隐含使用则表明虽然使用了智能体的概念,但可能使用了不同的术语或以其他形式呈现。

智能体 Wang et al. (2024c) 代表了一种能够感知、推理和执行动作的智能实体。它通过感知环境状态,根据其目标和设计选择行动,以最大化特定的性能指标,作为完成各种任务和目标的重要技术基础。基于 LLM 的智能体通常使用 LLM 作为智能体的认知核心,并在自动化、智能控制和人机交互等场景中表现出色,利用 LLM 在语言理解与生成、学习与推理、情境感知与记忆、多模态等方面的强大能力。随着各个领域的发展,传统和基于 LLM 的智能体概念逐渐明晰,并广泛应用于自然语言处理(NLP)领域 Xi et al. (2023)。然而,虽然现有工作在 SE 中明确或隐含地使用了这一概念,但目前仍没有对智能体进行清晰的定义。缺乏一篇深入的调研来分析现有工作如何结合智能体技术优化各类任务,梳理现有工作的发展脉络,并澄清 SE 中智能体的框架。

在本文中,我们对基于大语言模型(LLM)的代理与软件工程(SE)相结合的研究进行了深入分析,总结了将两者结合时面临的当前挑战,并针对现有挑战提出了未来研究的可能机会。具体来说,我们首先收集了基于LLM的代理技术在SE中应用的相关论文,并在过滤和质量评估后得到115篇论文。接着,受传统代理定义的启发(Wang等人2024c;Xi等人2023),我们提出了基于LLM的代理在SE中的通用概念框架(见第 2 节),包括感知、记忆、行动三个关键组件。我们首先介绍了感知模块(见第 2.1 节),该模块可以处理不同模态的输入,如文本输入、视觉输入、听觉输入等。接着,我们介绍了记忆模块(见第 2.2 节),该模块包括语义记忆、情节记忆和程序记忆,帮助代理做出推理决策。最后,我们介绍了行动模块(见第 2.3 节),该模块包括推理、检索和学习等内部行动,以及与环境交互等外部行动。

随后,我们详细介绍了基于LLM的代理在SE中的挑战与机遇(见第 3 节)。具体来说,我们针对LLM代理在SE领域当前的挑战提出了以下未来研究机会:

  • 现有大多数研究主要探讨基于Token的文本输入感知模块,而缺乏对其他模态的探索。
  • 许多新任务仍处于LLM的学习范围之外,SE领域的复杂任务需要具备多种能力的代理。因此,探索基于LLM的代理如何扮演新角色,并有效平衡多重角色的能力至关重要。
  • SE领域缺乏一个包含丰富代码相关知识的权威且公认的知识库,作为外部检索基础。
  • 缓解LLM代理的幻觉可以提高代理的整体性能,而代理优化反过来也能缓解LLM代理的幻觉问题。
  • 多代理协作过程需要大量计算资源,以及由于同步和共享各种信息而产生的额外通信开销。探索提高多代理协作效率的技术也是未来工作的一个机会。
  • SE领域的技术也可以促进代理领域的发展,未来需要更多的工作来探讨如何将SE领域的先进技术融入代理,推动代理和SE领域的进步。

此外,SE中的技术,尤其是与代码相关的技术,也可以推动代理领域的发展,表明这两个截然不同领域之间的相互促进关系。然而,目前很少有工作探讨SE技术在代理中的应用,研究重点仍然停留在SE的简单基础技术上,如函数调用、HTTP请求等工具。因此,本文主要关注SE领域中与代理相关的工作,并在第 3.6 节中简要讨论了SE技术在代理中的应用,作为未来研究的一个机会。

软件工程中的智能体:调研、现状与展望-1

2 基于大语言模型(LLM)的 SE 代理

我们在整理和分析数据收集期间获得的研究后,提出了一个基于大语言模型(LLM)的软件工程(SE)代理框架。如图 2 所示,单个代理包含三个关键模块:感知、记忆和行动。具体来说,感知模块接收来自外部环境的多种模态信息,并将其转换为 LLM 可以理解和处理的输入形式。行动模块包括内部和外部动作,分别负责根据 LLM 的输入进行推理决策,并基于与外部环境交互获得的反馈优化决策。记忆模块包括语义、情景和程序性记忆,能够提供额外的有用信息,帮助 LLM 做出推理决策。同时,行动模块还可以通过学习动作来更新记忆模块中的不同记忆,为推理和检索操作提供更有效的记忆信息。此外,多代理协作由多个单代理组成,它们负责部分任务,并通过协作合作共同完成任务。本节将介绍基于 LLM 的 SE 代理框架中各模块的详细信息。

软件工程中的智能体:调研、现状与展望-2

图 2: SE 中代理框架概述。

2.1 感知

感知模块将基于 LLM 的代理与外部环境连接起来,是处理外部输入的核心。它可以处理不同模态的输入,如文本、视觉和听觉输入,并将其转换为 LLM 代理可以理解和处理的嵌入格式,为 LLM 代理的推理和决策行为奠定基础。接下来,我们将介绍感知模块中不同模态输入的细节。

2.1.1 文本输入

与自然语言处理(NLP)中的文本输入格式不同,考虑到代码的特点,SE 中的文本输入格式包括基于 Token 的输入、基于树/图的输入以及混合输入。

基于 Token 的输入。基于 Token 的输入 (Ahmed 等, 2024; Al-Kaswan 等, 2023; Arakelyan 等, 2023; Beurer-Kellner 等, 2023; Alqarni 和 Azim, 2022; Li 等, 2022b; Gu 等, 2022; Du 等, 2021) 是最主流的输入方式,它将代码直接视为自然语言文本,并直接使用 Token 序列作为 LLM 的输入,忽略了代码的特性。

基于树/图的输入。与自然语言相比,代码具有严格的结构和语法规则,通常按照特定编程语言的语法编写。基于代码的特点,基于树/图的输入 (Ma 等, 2023ba; Zhang 等, 2023g; Ochs 等, 2023; Bi 等, 2024; Shi 等, 2023a2021; Wang 和 Li, 2021) 可以将代码转换为抽象语法树等树结构,或控制流图等图结构,以建模代码的结构化信息。然而,当前与基于 LLM 的 SE 代理相关的工作尚未探索此类模态,这既是挑战也是机遇。

混合输入。混合输入 (Niu 等, 2022; Hu 等, 2024a; Guo 等, 2022) 结合了多种模态,为 LLM 提供不同类型的信息。例如,包含基于 Token 和基于树的混合输入可以结合代码的语义和结构信息,从而更好地建模和理解代码。然而,与 SE 中基于 LLM 的代理相关的工作同样尚未探索这种模态。

2.1.2 视觉输入

视觉输入使用视觉图像数据,如 UI 草图或 UML 设计图,作为模型输入,并通过对图像的建模和分析做出推理决策。许多 NLP 相关工作探索了这种模态。例如,Driess 等人(2023)提出了 PaLM-E,这是一种具身的多模态语言模型,其输入是交织了视觉、连续状态估计和文本输入编码的多模态句子。传统的软件工程领域也有可视化输入的任务,如 UI 代码搜索(Behrang 等人,2018;Reiss 等人,2014;Xie 等人,2019),它使用 UI 草图作为查询来查找有用的代码片段。然而,作为 LLM 输入的视觉模态工作仍然较少。

2.1.3 听觉输入

听觉输入通过语音形式与 LLM 交互,使用诸如音频等听觉数据作为输入。传统的软件工程领域有听觉输入的任务,例如编程视频搜索(Bao 等人,2020),它使用视频作为有用代码片段的来源。然而,LLM 的听觉输入相关工作也较为缺乏。

2.2 记忆

记忆模块包括语义记忆、情景记忆和程序性记忆,这些模块可以提供额外的有用信息,帮助 LLM 做出推理决策。接下来,我们将分别介绍这三种记忆的详细内容。

2.2.1 语义记忆

语义记忆存储 LLM 代理的公认世界知识,通常以外部知识检索库的形式存在,这些库包括文档、库、API 或其他知识。许多研究探讨了语义记忆的应用(Wang 等人,2024b;Zhang 等人,2024;Eghbali 和 Pradel,2024;Patel 等人,2023;Zhou 等人,2022;Ren 等人,2023;Zhang 等人,2023d)。具体而言,文档和 API 是外部知识库中最常见的信息。例如,Zhou 等人(2022)提出了一种名为 DocPrompting 的新型自然语言到代码生成方法,该方法通过检索相关文档片段,根据自然语言意图明确地利用文档。Zhang 等人(2024)构建了一个名为 CODEAGENTBENCH 的手动整理基准,专门用于代码库级别的代码生成,包含文档、代码依赖和运行时环境信息。Ren 等人(2023)提出了一种名为 KPC 的新型基于知识驱动的 Prompt 链式代码生成方法,利用从 API 文档中提取的细粒度异常处理知识来辅助 LLM 进行代码生成。除了文档,API 也是外部知识库中的常见信息。例如,Eghbali 和 Pradel(2024)提出了一种名为 De-Hallucinator 的基于 LLM 的代码补全技术,它自动识别与代码前缀和模型初始预测相关的项目特定 API 引用,并将这些引用的信息添加到提示中。Zhang 等人(2023d)将 API 搜索工具集成到生成过程中,使模型能够自动选择 API,并使用搜索工具获取建议。此外,一些工作也涉及其他信息。例如,Patel 等人(2023)检查了不同 LLM 基于上下文生成代码时的能力和局限性。Wang 等人(2024b)使用增强函数及其对应的文档字符串对选定的代码 LLM 进行微调。

2.2.2 情景记忆

情景记忆记录与当前案例相关的内容以及以往决策过程中获得的经验信息。与当前案例相关的内容(例如在搜索数据库中找到的相关信息、通过 In-context learning(ICL)技术提供的样本等)可以为 LLM 推理提供额外的知识,因此许多研究将这些信息引入 LLM 的推理过程(Zhong 等人,2024;Li 等人,2023c;Feng 和 Chen,2023;Ahmed 等人,2023;Wei 等人,2023a;Ren 等人,2023;Zhang 等人,2023b;Eghbali 和 Pradel,2024;Shi 等人,2022)。例如,Li 等人(2023c)提出了一种名为 AceCoder 的新提示技术,该技术选择类似的程序作为提示中的示例,提供了大量与目标代码相关的内容(例如算法、API)。Feng 和 Chen(2023)提出了 AdbGPT,这是一种无需训练和硬编码的轻量化方法,能够自动利用 In-context learning 技术根据错误报告复现错误。Ahmed 等人(2023)发现,加入语义事实可以帮助 LLM 提升代码摘要任务的性能。Wei 等人(2023a)提出了一种名为 Coeditor 的新模型,它在多轮自动代码编辑设置中,基于最近对同一代码库的更改预测代码区域的编辑。此外,引入历史交互信息等经验信息可以帮助基于 LLM 的代理更好地理解上下文并做出正确决策。有些工作使用过去推理和决策过程中的经验信息,通过迭代查询和修改答案,获得更准确的答案。例如,Ren 等人(2023)提出了 KPC,这是一种基于知识驱动的 Prompt 链式代码生成方法,将代码生成分解为具有迭代检查-重写步骤的 AI 链。Zhang 等人(2023b)提出了 RepoCoder,这是一种简单、通用且有效的框架,在迭代检索生成管道中有效利用代码库级别的信息进行代码补全。Eghbali 和 Pradel(2024)提出了一种基于 LLM 的代码补全技术 De-Hallucinator,该技术通过逐步增加提示中的上下文信息来检索适合的 API 引用,并迭代查询模型,使其预测更加准确。

2.2.3 程序性记忆

软件工程中的代理的程序性记忆包含存储在大语言模型(LLM)权重中的隐式知识和写入代理代码中的显式知识。

隐式知识 存储在 LLM 的参数中。现有的研究通常通过使用大量数据训练模型,提出具有丰富隐式知识的新 LLM,以完成各种下游任务。Zheng 等人(2023)根据其所属类型(包括公司、大学、研究团队&开源社区、个人&匿名贡献者)对 SE 领域的代码 LLM 进行了整理。

显式知识 写入到代理的代码中,使代理能够自动运行。几项工作,Patel 等人(2023);Shin 等人(2023);Zhang 等人(2023a)探讨了构建代理代码的不同方式。具体而言,Patel 等人(2023)使用三种上下文监督类型来指定库函数,包括演示、描述和实现。Shin 等人(2023)研究了三种不同的提示工程技术(即基本提示、上下文学习和任务特定提示)与微调 LLM 在三种典型 ASE 任务上的有效性。Zhang 等人(2023a)探讨了通过不同的提示设计(即基本提示、辅助信息提示和链式思维提示)使用 ChatGPT 进行软件漏洞检测的性能。

2.3 动作

动作模块包括两种类型:内部动作和外部动作。外部动作与外部环境交互以获取反馈信息,包括与人类/代理对话以及与数字环境的交互,而内部动作根据 LLM 的输入进行推理并作出决策,并根据获得的反馈优化决策,包括推理、检索和学习动作。接下来,我们将详细介绍每种动作。

2.3.1 内部动作

内部动作包括推理、检索和学习动作。分别来看,推理动作负责分析问题、推理并基于 LLM 代理的输入作出决策。检索动作可以从知识库中检索相关信息,帮助推理动作做出正确决策。学习动作则通过学习和更新语义、程序性和情景记忆,持续学习并更新知识,从而提高推理和决策的质量与效率。

推理动作。 严格的推理过程是 LLM 代理完成任务的关键,链式思维(CoT)是有效的推理方式。在 CoT 的帮助下,LLM 可以深入理解问题,分解复杂任务,并生成高质量的答案。如图 3 所示,现有研究探索了不同形式的 CoT,包括简单 CoT/计划、SCoT、头脑风暴、树形 CoT 等。具体而言,简单 CoT/计划是指提示中的一段文字描述问题的推理过程。在早期的工作中,在提示中加入了一句简单的句子,以指导 LLM 生成链式思维,从而更好地解决问题。例如,Hu 等人(2024b)提出了一种使用“打印调试”方法引导 LLM 进行调试的上下文学习方法。随着 LLM 技术的发展,CoT 的设计变得更加复杂。受到开发人员验证测试场景可行性过程的启发,Su 等人(2023)设计了链式思维(CoT)推理,以从 LLM 中提取类人知识和逻辑推理。Le 等人(2023)提出了一种名为 CodeChain 的新框架,该框架生成由前几次迭代生成的一些代表性子模块指导的自我修正链。Huang 等人(2024)提出了 CodeCoT,即生成测试用例来验证代码在执行过程中是否存在语法错误,然后通过自我检查阶段将链式思维与代码生成的自我检查过程结合起来。Tian 和 Chen(2023)提出了一种新颖的提示技术,设计了复杂的思维引导提示和基于提示的反馈,并首次探索了如何提高 LLM 的代码生成性能。

考虑到代码的特点,一些研究提出了结构化的CoT(Chain of Thought)来引入代码的结构信息。如图 3 中的 (b) 所示,结构化 CoT 以类似伪代码的形式呈现推理过程,涉及循环、分支等结构。例如,Li 等人 (2023a) 提出了结构化 CoT (SCoTs),能够有效利用源代码中的丰富结构信息,并提出了一种新的代码生成提示技术 SCoT 提示。Christianos 等人 (2023) 提出了一种通用框架模型,利用内在和外在函数的构建来增加对推理结构的理解,将结构化推理融入 AI 智能体的策略中。此外,还有一些研究提出了其他形式的 CoT,如头脑风暴和树状 CoT,如图 3 中的 (c) 和 (d) 所示。头脑风暴是基于输入生成相关的关键词。例如,Li 等人 (2023e) 提出了一个新颖的头脑风暴框架用于代码生成,它利用头脑风暴步骤来生成和选择不同的想法,促进在生成代码之前的算法推理。树状 CoT 是 Feng 和 Chen (2023) 提出的,它动态地探索并更新 CoT,树中的节点包括已完成、新节点、新推导出的节点和待处理节点等多种状态。

此外,还有一些研究探索了其他技术,以提高基于大语言模型的智能体的推理能力和推理效率。例如,Wang 等人 (2024a) 提出了 TOOLGEN,它包括触发器插入和模型微调阶段(离线),以及工具集成代码生成阶段(在线)。TOOLGEN 利用给定代码语料中的增强功能,推断出触发自动完成工具的位置,并标记特殊的标记 Token。Yang 等人 (2023a) 设计了一种新方法 COTTON,该方法可以利用轻量级语言模型自动生成代码生成的 CoT。Zhang 等人 (2023c) 提出了自推理解码,这是一种新颖的推理方案,它生成草稿 Token,然后通过一次前向传递使用原始的大语言模型验证这些草稿输出的 Token。Zhou 等人 (2023) 引入了自适应求解框架,该框架根据问题的难度策略性地调整求解策略,不仅提高了计算效率,还提高了整体性能。

软件工程中的智能体:调研、现状与展望-3

图 3: 不同方法的不同 CoT,其中 (a) 是原生的 CoT/计划,通过让大语言模型在提示中逐步思考获得,包含了分析问题和解决步骤的详细过程。(b) 是结构化 CoT (SCoT),它结合了代码特性,生成了包含图中分支和循环结构的代码框架。蓝色字体抽象概括了大语言模型基于 SCoT 生成具体代码的描述。(c) 是头脑风暴的结果,它通过分析问题描述并利用算法、数据结构和数学知识来提供解决思路。(d) 是树状 CoT 的一个例子,它动态地探索并迭代更新 CoT,逐步分解并完成问题。

检索操作。检索操作可以从知识库中检索相关信息,以帮助推理操作做出正确决策。用于检索的输入和通过检索获得的输出内容类型各不相同。如表 1 所示,输入和输出可以是文本、代码,或包含文本和代码的混合信息。具体可分为以下几类: (1) 文本-代码。通常,将需求作为输入来检索相关的代码或已使用的 API,添加到提示中以生成响应代码。例如,Zan 等人 (2022a) 提出了一个包含 APIRetriever 和 APICoder 模块的新框架。具体而言,APIRetriever 检索有用的 API,随后 APICoder 使用这些检索到的 API 生成代码。De-Hallucinator Eghbali 和 Pradel (2024) 通过提示检索合适的 API 引用,并使用获得的提示进行迭代查询模型。(2) 文本-文本。有时,也将需求作为输入来检索相关文档或类似问题,以帮助完成任务。例如,Zhou 等人 (2022) 介绍了 DocPrompting,一种自然语言到代码的生成方法,明确通过检索相关文档片段来响应给定的 NL 意图。Zhang 等人 (2024) 提出了 CodeAgent,一种基于大语言模型的新型代理框架,集成了外部工具来检索相关信息,以有效进行代码库级别的代码生成,支持与软件工件交互以进行信息检索、代码符号导航和代码测试。(3) 代码-代码。代码也可以用作输入来检索类似或相关的代码,为生成目标代码提供参考。例如,Zhang 等人 (2023b) 提出了 RepoCoder,这是一个简单、通用且有效的框架,采用迭代检索生成流程,检索基于相似性的代码库级别信息。(4) 混合-代码。除了使用单一类型的信息(如文本或代码)作为输入检索相关代码外,还可以将多种类型的信息组合成混合信息,以提高检索的准确性。例如,Li 等人 (2022a) 利用强大的代码生成模型,通过将生成模型生成的代码片段(生成对等部分)增强文档查询,然后使用增强后的查询来检索代码。ToolCoder Zhang 等人 (2023d) 使用在线搜索引擎和文档搜索工具来获得合适的 API 建议,辅助 API 选择和代码生成。此外,检索内容不限于单一类型的信息。(5) 代码-混合。它使用代码作为输入并检索各种相关信息。例如,Nashid 等人 (2023) 提出了一个名为 CEDAR 的新技术,用于提示创建,自动检索与开发者任务相关的代码演示,基于嵌入或频率分析。Geng 等人 (2023) 采用上下文学习范式,为代码生成多意图注释,通过从示例池中选择不同的代码-注释示例。(6) 文本-混合。它使用需求作为输入来检索相关代码和类似问题供参考。例如,Li 等人 (2023b) 提出了 LAIL(LLM-Aware In-context Learning),一种基于学习的新选择方法,用于选择用于代码生成的示例。Li 等人 (2023c) 引入了一种名为 AceCoder 的新机制,该机制使用需求检索类似程序作为提示中的示例,提供大量相关内容(例如算法、API)。

根据之前的研究 Li 等人 (2022c);Zhao 等人 (2024);Hu 等人 (2023a),现有的检索方法可以分为稀疏检索、密集检索 Wang 等人 (2024e),以及其他方法 Hayati 等人 (2018);Zhang 等人 (2020);Poesia 等人 (2022);Ye 等人 (2021);Shu 等人 (2022)。图 4 显示了稀疏检索和密集检索的流水线。密集检索方法将输入转换为高维向量,并通过比较语义相似度来选择相似度最高的 k 个样本,而稀疏检索方法则通过计算 BM25 或 TF-IDF 等指标来评估样本之间的文本相似度。此外,还探索了各种替代检索方法。例如,一些研究集中于计算自然语言文本之间的编辑距离 Hayati 等人 (2018),或代码片段的抽象语法树 (AST) Zhang 等人 (2020);Poesia 等人 (2022)。还有一些方法利用知识图谱进行检索 Ye 等人 (2021);Shu 等人 (2022)。

密集检索和稀疏检索方法是两种最主流的检索方法。其中,密集检索技术通常比稀疏检索方法表现更佳。然而,稀疏检索往往更高效,并且在某些情况下可以达到与密集检索相当的性能。因此,许多研究由于效率原因选择使用稀疏检索方法。

软件工程中的智能体:调研、现状与展望-4

表 1:根据输入和输出分类的不同类型的检索操作。

软件工程中的智能体:调研、现状与展望-5

图 4:不同检索方法的流程图。左侧部分是密集检索方法的流程,它可以使用不同的模型将文本转换为高维嵌入向量,并通过比较语义相似度来检索相似度最高的样本。右侧部分是稀疏检索方法的流程,仅比较文本相似度而忽略语义。

学习行为。学习行为是通过学习和更新语义与程序记忆来不断学习和更新知识,从而提高推理和决策的质量与效率。(1) 使用知识更新语义记忆。语义记忆主要存在于知识库中,存储着基础世界知识,可以通过使用已识别的代码知识更新知识库或构建新知识库来更新。例如,Liao 等人 (2023) 提出了一个新颖的代码生成框架,称为 A3-CodGen,通过利用从检索库中获取的三类信息(来自当前代码文件的局部意识信息、来自其他代码文件的全局意识信息、第三方库信息)生成更高质量的代码。Du 等人 (2024) 提出了一个新颖的基于大语言模型的漏洞检测技术 Vul-RAG,它通过 LLM 从现有 CVE 实例中提取多维度知识,构建漏洞知识库。(2) 更新隐性知识。由于隐性知识存储在大语言模型的参数中,可以通过微调模型来更新 LLM 参数。早期的工作通常构建新数据来监督微调预训练模型,从而更新模型的全参数 Xia 等人 (2023b);Wei 等人 (2023ab);Tao 等人 (2024);Wang 等人 (2024d);Liu 等人 (2023a);Wang 等人 (2023d);Shi 等人 (2023b)。然而,随着参数规模的增加,微调模型的成本也在增加。一些工作尝试探索参数高效微调技术 Weyssow 等人 (2023);Shi 等人 (2023c)。例如,Weyssow 等人 (2023) 针对自动代码生成场景,对大语言模型的参数高效微调 (PEFT) 技术进行了全面研究。Wang 等人 (2023b) 插入并微调了高效微调结构 adapter,而不是微调预训练模型。目前的大多数工作使用高效的微调技术对模型进行微调 Guo 等人 (2024);Shi 等人 (2023d)。

(3) 更新代理代码。代理代码指的是代理运行的程序或算法,用于指导其行为和决策过程。基于大语言模型的代理通过构造相应的提示作为代理代码,以规范如何感知环境、进行推理和决策,并执行操作。许多工作使用指令调整技术来使大语言模型的输出与输入指令对齐。例如,Muennighoff 等(2023)利用 Git 提交的自然结构,将代码更改与人类指令配对,并使用这些指令进行调整。Hu 等(2023b)构建了第一个指令调整数据集 InstructCoder,旨在使大语言模型适应通用代码编辑。这些高质量的数据可以为更大的语言模型带来新知识并更新语义记忆。Zan 等(2023)在 StarCoder 上进行了 8 种流行编程语言的广泛实验,以探索编程语言是否可以通过指令调整相互提升。

2.3.2 外部行动

与人类/代理对话 代理可以与人类或其他代理进行互动,并在互动过程中获得丰富的信息作为反馈,扩展代理的知识并使大语言模型的回答更加准确。具体来说,许多工作使用大语言模型作为代理进行互动,例如 Lu 等(2024);Jain 等(2023);Paul 等(2023);Shojaee 等(2023);Liu 等(2023b);Wang 等(2023e);Mu 等(2023);Madaan 等(2023)。Jain 等(2023)提出了 RLCF,利用来自不同大语言模型的反馈,将生成的代码与参考代码进行比较,以通过强化学习进一步训练预训练的大语言模型。REFINER Paul 等(2023)是一个框架,可以与提供自动反馈的批评模型进行互动。Yang 等(2023b)研究并阐明了大语言模型如何从判别模型中受益。Moon 等(2023)构建了一个专门为代码修复设计的新数据集,并使用该数据集获取一个可以通过 Preference-Optimized Tuning 和 Selection 自动生成有用反馈的模型。PPOCoder Shojaee 等(2023)由两个部分组成,即批评者和执行者,并通过这两个模型之间的交互使用 PPO 进行优化。RLTF Liu 等(2023b)与利用真实数据和通过与编译器互动生成的在线缓存数据的其他模型进行互动,以计算损失并通过梯度反馈更新模型权重。Wang 等(2023e)提出了 ChatCoder,一种通过与大语言模型聊天来完善需求的方法。Sun 等(2023a)提出了 Clover,该工具检查代码、文档字符串和正式注释之间的一致性。ClarifyGPT Mu 等(2023)提示另一个大语言模型生成有针对性的澄清问题,以完善用户输入的模糊需求。Reflexion Shinn 等(2023)可以与人类和其他代理互动以生成外部反馈。Self-Refine Madaan 等(2023)使用单一的大语言模型作为生成器、修正器和反馈提供者,而不需要任何监督训练数据、额外训练或强化学习。Repilot Wei 等(2023c)通过大语言模型和 Completion Engine 之间的互动合成候选修补程序。具体来说,Repilot 根据大语言模型提供的建议修剪不可行的 Token。Wang 等(2023c)引入了 MINT,一个基准测试,可以通过利用 GPT-4 模拟的用户自然语言反馈来评估大语言模型解决多轮互动任务的能力。Hong 等(2023b)提出了 MetaGPT,这是一种创新的元编程框架,将高效的人类工作流程纳入基于大语言模型的多代理协作中。Huang 等(2023a)介绍了 AgentCoder,这是一种新颖的代码生成解决方案,包括一个多代理框架,其中包含专门的代理:程序员代理、测试设计师代理和测试执行代理。

数字环境 代理可以与数字系统互动,例如 OJ 平台、网页、编译器和其他外部工具,在互动过程中获得的信息可以作为反馈来优化自身。具体来说,编译器是最常见的外部工具,例如 Jain 等(2023);Shojaee 等(2023);Liu 等(2023b);Wang 等(2022);Zhang 等(2023e)。例如,RLCF Jain 等(2023)通过使用编译器衍生的反馈来训练预训练的大语言模型,检查其生成的代码是否通过了一组正确性检查。PPOCoder Shojaee 等(2023)可以将编译器反馈和结构对齐作为额外知识纳入模型优化,通过深度强化学习(RL)对代码生成模型进行微调。RLTF Liu 等(2023b)与编译器互动生成训练数据对,并将其存储在在线缓存中。Wang 等(2022)提出了 COMPCODER,该方法利用编译器反馈进行可编译代码生成。Zhang 等(2023e)提出了 Self-Edit,一种生成并编辑的方法,利用来自大语言模型生成代码的执行结果来改善竞争性编程任务中的代码质量。此外,许多工作构建了工具,如搜索引擎、补全引擎等,以扩展智能代理的能力,Wang 等(2024a);Zhang 等(2024);Agrawal 等(2023);Wei 等(2023c);Zhang 等(2023f)。Wang 等(2024a)引入了 TOOLGEN,一种将自动补全工具集成到代码大语言模型生成过程中的方法,以解决未定义变量和成员缺失等依赖错误。Zhang 等(2024)介绍了 CodeAgent,这是一个新颖的大语言模型代理框架,集成了五种编程工具,使其能够与软件文档进行交互,以获取信息、代码符号导航和代码测试,以实现有效的仓库级代码生成。Agrawal 等(2023)提出了 MGD,一种监控引导解码方法,其中监控器使用静态分析来指导解码。Repilot Wei 等(2023c)通过大语言模型和 Completion Engine 之间的互动合成候选修补程序。具体来说,Repilot 根据 Completion Engine 提供的建议完成 Token。

3挑战与机遇

在分析了与基于大语言模型(LLM)的代理在软件工程中的工作相关的内容后,可以明显看出,目前这两个领域的集成仍面临许多挑战,这限制了它们的发展。在本节中,我们将详细讨论当前基于LLM的代理在软件工程中面临的挑战,并根据对现有挑战的分析,讨论未来工作的机会。

3.1 感知模块探索不足

如第 2.1 节所述,目前对基于LLM的代理在软件工程中的感知模块的探索还不够。与自然语言不同,代码是一种特殊的表示,可以被视为普通文本,也可以转换为具有代码特征的中间表示,例如抽象语法树(AST)、控制流图(CFG)等。现有的工作,如 Ahmed 等人(2024);Al-Kaswan 等人(2023);Arakelyan 等人(2023);Beurer-Kellner 等人(2023);Alqarni 和 Azim(2022)通常将代码视为文本,且在基于LLM的代理在软件工程中的工作中,探索树/图形基础的输入模态的研究仍然不足。此外,对视觉和听觉输入模态的探索也仍然不足。

3.2 角色扮演能力

基于LLM的代理通常需要在各种任务中扮演不同的角色,每个角色都需要特定的技能。例如,当代理被要求生成代码时,它可能需要充当代码生成器,而在进行代码测试时,它则需要充当代码测试器。此外,在某些场景下,这些代理可能需要同时具备多种能力。例如,在代码生成场景中,代理需要同时扮演代码生成器和测试器,因此需要具备生成和测试代码的能力(Huang 等人, 2023b)。在软件工程领域,有许多细分任务,LLM学习还不够,复杂任务需要代理具备多种能力,例如测试生成场景、前端开发、仓库级问题解决等。因此,推进研究如何使代理有效地采用新角色并管理多角色表现的需求,代表了未来工作中一个有前景的方向。

3.3 知识检索基础不足

外部知识检索基础是代理记忆模块中语义记忆的重要组成部分,也是代理可以交互的重要外部工具。在自然语言处理(NLP)领域,有如 Wikipedia 这样的知识库作为外部检索基础(Zhao 等人, 2023)。然而,在软件工程领域,目前尚无权威和公认的知识库,包含丰富的代码相关知识,例如各种编程语言的基本语法、常用算法、与数据结构和操作系统相关的知识等。在未来的研究中,可以努力开发一个全面的代码知识库,作为代理的外部检索基础。这个知识库将丰富可用的信息,从而提高推理和决策过程的质量和效率。

3.4 基于LLM的代理的幻觉现象

许多与基于LLM的代理相关的研究将LLM视为代理的认知核心,代理的整体表现与底层LLM的能力密切相关。现有研究(Pan 等人, 2024;Liu 等人, 2024a)表明,基于LLM的代理可能会产生幻觉,例如在完成软件工程任务时生成不存在的 API。减少这些幻觉可以提高代理的整体表现。同时,对代理的优化也可以反向缓解基于LLM的代理的幻觉,突显了代理表现与幻觉缓解之间的双向关系。尽管一些研究已经对LLM的幻觉现象进行了探讨,但解决基于LLM的代理中的幻觉问题仍面临重大挑战。探索基于LLM的代理中存在的幻觉类型,深入分析这些幻觉的原因,并提出有效的幻觉缓解方法是未来研究中的重要机会。

3.5 多智能体协作的效率

在多智能体协作的过程中,每个单独的智能体需要扮演不同的角色以完成特定任务,然后将每个智能体决策的结果结合起来,共同应对更复杂的目标 Chen et al. (2023b); Hong et al. (2023a); Huang et al. (2023b); Wang et al. (2023a)。然而,这一过程通常需要每个智能体大量的计算资源,导致资源浪费和效率降低。此外,每个单独的智能体还需要同步和共享各种信息,这会增加额外的通信成本,并影响协作的实时性和响应速度。有效地管理和分配计算资源、最小化智能体之间的通信成本以及减少单个智能体的推理开销是提升多智能体协作效率的关键挑战。解决这些问题为未来的研究提供了重要机会。

3.6 软件工程技术在基于大语言模型的智能体中的应用

软件工程领域的技术,特别是编码技术,具有显著推动智能体领域发展的潜力,表明这两个领域之间存在互利关系。例如,软件测试技术可以被调整以识别基于大语言模型的智能体中的异常行为和潜在缺陷。此外,软件工具(如 API 和库)的改进也能提升基于大语言模型的智能体的性能,特别是对于具有工具使用能力的智能体。进一步,软件包管理技术可以被调整以有效管理智能体系统。例如,版本控制可以应用于监控和协调智能体系统中不同智能体的更新,增强兼容性和系统完整性。

然而,这方面的研究仍然有限。因此,探索将更复杂的 SE 技术纳入智能体系统代表了未来研究的一个有前景的方向,可能会推动两个领域的进展。

4 结论

为了深入分析将基于大语言模型的智能体与软件工程结合的工作,我们首先收集了许多将基于大语言模型的智能体与软件工程领域任务结合的研究。然后,我们在整理和分析数据收集期间获得的研究后,提出了一个软件工程中基于大语言模型的智能体框架,该框架包含三个关键模块:感知、记忆和行动。最后,我们介绍了框架中每个模块的详细信息,分析了基于大语言模型的智能体在软件工程领域面临的当前挑战,并指出了一些未来工作的机会。

AI轻松学

普通人的AI入门指南

帮助你以低成本、零基础学会如何利用AI工具。AI就像办公软件一样,是每个人的必备技能。 掌握AI会让你在求职中占据优势,在未来的工作和学习中事半功倍。

查看详情>
未经允许不得转载:首席AI分享圈 » 软件工程中的智能体:调研、现状与展望
分享到

首席AI分享圈

首席AI分享圈专注于人工智能学习,提供全面的AI学习内容、AI工具和实操指导。我们的目标是通过高质量的内容和实践经验分享,帮助用户掌握AI技术,一起挖掘AI的无限潜能。无论您是AI初学者还是资深专家,这里都是您获取知识、提升技能、实现创新的理想之地。

联系我们