科研快讯丨软件工程智能体最新综述来了!《Agents in SE: Survey, Landscape, and Vision》
本篇综述的作者包括565net必赢客户端的郑子彬教授、王焱林助理教授、陈嘉弛助理教授、研究生黄炎贤、钟宛君、华为云的王千祥、马宇驰老师、中科院杨敏副研究员、厦门大学李辉副教授、以及西安交通大学博士研究生石恩升。
近年来,大语言模型(LLM)取得了令人瞩目的成就,并被广泛应用于各种下游任务,尤其是在软件工程(SE)领域的各个任务中。许多将大模型与软工领域相结合的研究都显式或隐式地涉及到了智能体的概念。基于大模型的智能体能够感知外界环境信息并将其转化成大模型能够理解和处理的模式,借助其记忆、推理、检索、学习、交互等能力,大模型能够在各类下游任务中取得更好的表现。目前还缺乏相关的工作对软工领域中基于大模型的智能体发展现状进行梳理。
565net必赢客户端联合华为云、中科院、厦门大学以及西安交通大学共同对115篇相关的文献进行梳理,构造了软工领域中基于大模型的智能体框架。该综述深入探讨了软件工程与智能体技术融合所面临的主要挑战,同时总结了未来研究中潜在的机遇。
论文地址:
https://arxiv.org/abs/2409.09030
论文列表:
https://github.com/DeepSoftwareAnalytics/Awesome-Agent4SE
01软工领域中基于大语言模型的智能体框架
如Figure 2所示,基于大模型的智能体包含三个关键模块:感知、记忆和动作。其中,感知模块接收各种模态的外部环境信息,并将其转换为大模型可以理解和处理的输入形式。动作模块包括内部动作和外部动作,分别负责根据大模型的输入做出推理决策和根据与外部环境交互获得的反馈优化决策。记忆模块包括语义记忆、情景记忆和程序记忆,可以提供额外的有用信息来帮助大模型做出推理决策。同时,动作模块还可以通过学习动作来更新记忆模块中的不同记忆,为推理和检索动作提供更有效的记忆信息。此外,多智能体协作由多个负责部分任务的单个智能体组成,通过协作合作共同完成同一复杂任务。
感知模块
感知模块连接基于大模型的智能体与外部环境,是处理外部输入的核心模块。它可以处理文本、视觉、听觉等不同模态的输入,并将其转换为基于大模型的智能体能够理解和处理的嵌入向量格式,为基于大模型的智能体的推理和决策行为奠定基础。与自然语言处理(NLP)领域中的文本输入格式不同,考虑到代码的特点,软工中的文本输入格式除了基于代码序列的输入以外,还有如抽象语法树(AST)、控制流图(CFG)等基于树或图结构以及混合类型的输入。
记忆模块
记忆模块包括语义记忆、情景记忆和程序记忆,它们可以提供额外的有用信息来帮助大模型进行推理决策。
(1)语义记忆(Semantic Memory)
语义记忆指基于大模型的智能体的常识或公认的世界知识等,通常存储在外部知识检索库中。外部知识检索库中可存储文档、库、API等其他类型的信息。其中,文档和API是外部知识库中最常见的信息类型。通过增加相关的文档和API知识,智能体能够更好地理解问题和做出推理决策。
(2)情景记忆(Episodic Memory)
情景记忆指的是与当前问题相关的内容以及来自先前决策过程的经验信息等。与当前问题相关的内容(例如在搜索数据库中找到的相关信息、上下文学习(ICL)技术提供的样本等)可以为基于大模型的智能体推理提供额外的知识来更好地理解问题,先前决策过程的经验信息则能够为基于大模型的智能体进行推理决策提供参考。因此,许多工作将此类信息引入到基于大模型的智能体的推理过程中,提高推理效率和质量。
(3)程序记忆(Procedural Memory)
程序记忆包括隐性知识和显性知识。其中,隐性知识存储在大模型参数中。现有的工作通常通过大量数据训练模型,得到具有丰富隐性知识的预训练大模型来完成各种下游任务显性知识;或者,用高质量的数据预料对已有的预训练大模型进行微调得到表现更好的微调模型。显性知识主要存储在预先定义的智能体代码(Agent code)中,使得智能体能够自动运行,进行独立推理和决策。智能体代码指的是驱动智能体运行、指导其行为和决策的程序或算法。
动作模块
(1)内部动作
内部动作包括推理、检索和学习动作。其中,推理动作负责根据基于大模型的智能体的输入进行问题分析、推理和决策。检索动作可以从知识库中检索相关信息,辅助推理动作做出正确决策。学习动作则是通过学习和更新语义、程序和情景记忆,不断学习和更新知识,从而提高推理和决策的质量和效率。
推理动作:严谨的推理过程是基于大模型的智能体完成任务的关键,而思维链(CoT)是最主流的有效推理方式。借助思维链,大模型可以深入理解问题,分解复杂任务,并生成高质量的答案。如Figure 3所示,现有工作探索了不同形式的思维链,包括朴素思维链/计划)(Native CoT/Plan)、结构化的思维链(SCoT)、头脑风暴(Brainstorming)、树形思维链(Tree CoT)等。具体地,朴素思维链/计划是在提示(prompt)中让大模型逐步思考,生成的回答中给出分析问题的具体过程并逐步解决问题(如Figure 3中(a)所示)。考虑到代码的特性,一些工作提出了结构化的推理模式来引入代码的结构信息,得到结构化的思维链。结构化的思维链以伪代码的形式呈现推理过程,涉及循环、分支等逻辑结构(如Figure 3中的(b)所示)。在提示中让智能体进行头脑风暴,利用算法、数据结构以及数学等知识给出解决问题的关键词,例如Figure 3中(c)给出了解决问题可行的算法作为头脑风暴的结果。树形的思维链动态地探索和更新思维链,树中的节点涉及已完成、新建、新推断、待定等多种状态(如Figure 3中(d)所示)。
检索动作:检索动作可以从知识库中检索相关信息,以辅助推理动作做出正确的决策。检索所用的输入和检索得到的输出内容有不同的类型。如Table 1所示,输入和输出可以是文本、代码,也可以是同时包含文本和代码的混合信息。现有的检索方法可分为基于稀疏的检索(sparse-based)、基于密集的检索(dense-based)和其他方法。Figure 4分别展示了基于稀疏的检索和基于密集的检索流程。基于密集的检索方法将输入转换为高维向量,然后比较语义相似度以选择具有最高相似度的k个样本;而基于稀疏的检索方法计算BM25或TF-IDF等指标来评估样本之间的文本相似度。此外,还有计算自然语言文本之间的编辑距离或代码片段的AST等其他的检索方法。
基于密集和基于稀疏的检索方法是两种最主流的检索方法。其中,密集型检索技术通常比稀疏型检索方法具有更好的性能。但稀疏型检索可以在达到与密集型检索相当的性能水平的基础上获得更高的检索效率。因此,更多的工作选择采用稀疏型检索方法。
学习动作:学习动作是通过学习和更新语义和程序记忆,不断地学习和更新知识,从而提高推理和决策的质量和效率。(1)用知识更新语义记忆。语义记忆主要存在于存储基本世界知识的知识库中,可以通过利用已识别的代码知识更新知识库或构建新的知识库来更新语义记忆。(2)更新隐性知识。由于隐性知识存储在大模型参数中,因此可以通过微调模型来更新大模型参数,从而更新隐性知识。(3)更新智能体代码。基于大模型的智能体将相应的提示构建为智能体代码,以规范智能体如何感知环境、推理和决策以及执行动作。许多工作使用指令调优技术将大模型的输出与输入指令对齐。
(2)外部动作
与开发者或其他智能体交互:智能体可以与开发者或其他智能体进行交互,并在交互过程中获得丰富的信息作为反馈,扩展智能体的知识范围并对生成的回答进行优化和修正。
与数字系统交互:智能体可以与数字化系统(比如OJ平台、网页、编译器等外部工具)进行交互,交互过程中获得的信息可以作为反馈来优化自身。其中,编译器是最常见的外部工具之一,已有许多工作用编译器编译基于大模型的智能体生成的代码,并将编译得到的错误信息作为反馈信息对代码进行优化。
02挑战和未来研究方向
本文中进一步分析了软工技术与智能体技术结合的现有挑战并总结了一些未来研究中存在的机遇。
对感知模块探索的缺乏
在介绍感知模块时提到,软工领域中探索基于大模型的智能体感知模块的工作还很缺乏。与自然语言不同,代码是一种特殊的表示,可以作为普通文本处理,也可以转换为具有代码特征的中间表示,例如 AST、CFG 等。现有工作通常将代码视为普通文本,忽略了代码特性,建模得到的代码表示中的信息不足,限制了基于大模型的智能体在代码相关的下游任务上的表现。此外,软工领域中目前还缺乏对视觉和听觉输入模态的探索。探索如何高效建模感知模块中基于树/图、视觉或听觉等输入模态是未来研究可行的方向之一。
基于大模型的智能体的角色扮演能力
一方面,基于大模型的智能体通常需要在不同任务中扮演不同的角色,每个角色都需要特定的技能。例如,智能体在生成代码时扮演代码生成器的角色,测试代码时则扮演代码测试员的角色。另一方面,智能体有时可能需要同时扮演多个不同角色,具备多种不同能力。例如,在代码生成场景中,智能体需要同时扮演代码生成器和代码测试员两个角色,具备生成和测试代码的能力。软工领域中存在各种已有大模型学习得不够充分的小众任务和需要智能体具备多种能力的复杂任务,例如测试生成场景、前端开发、仓库级代码生成等。因此,研究如何使智能体有效地适应新角色和管理多角色性能需求也是未来工作的一个可行方向。
公认知识检索库的欠缺
外部知识检索库既是智能体语义记忆模块中的重要组成部分,也是智能体交互的重要外部工具之一。在NLP领域,有维基百科(Wikipedia)等公认的大型知识库作为外部检索库。但在软工领域,目前尚无权威的、公认的包含丰富代码相关知识(如各类编程语言的基本语法、各类常用算法、数据结构、操作系统相关知识等)的知识库。未来研究中的一个可行方向是开发一个大型的权威代码知识库,并将其作为智能体的外部检索库,为智能体推理决策提供额外的信息,从而提高推理和决策过程的质量和效率。
基于大模型的智能体中的幻觉问题
大模型作为基于大模型的智能体的认知核心,其整体性能影响着智能体在各种任务中的表现。已有的工作表明基于大模型的智能体中可能会存在幻觉问题,例如,在做代码生成任务时生成不存在的API。智能体性能和幻觉缓解之间存在双向关系:幻觉问题的缓解可以提高智能体的整体表现,同时智能体的优化也能够反向缓解基于大模型的智能体的幻觉。虽然目前已有一系列工作致力于研究大模型的幻觉,但解决基于大模型的智能体中的幻觉问题仍然存在挑战。探索基于大模型的智能体中存在哪些类型的幻觉、深入分析这些幻觉的原因以及提出有效的幻觉缓解方法是未来研究中存在的机遇之一。
多智能体协同合作的效率问题
在多智能体协作过程中,各个智能体需要扮演不同的角色来完成特定的任务,然后将各个智能体的决策结果结合起来,共同解决更为复杂的目标。但这一过程往往需要每个智能体投入大量的计算资源,造成资源的浪费和效率的降低。此外,各个单智能体之间各种信息的同步和共享也引入了额外的通信成本,影响协作的实时性和响应速度。有效管理和分配计算资源、最小化智能体间通信成本、减少各个智能体的推理开销是提升多智能体协作效率的关键挑战,这些问题的解决为未来的研究提供了重要的机会。
基于大模型的智能体中软工技术的应用
智能体与软工领域之间存在互惠互利的关系,不仅智能体技术能够应用于软工领域,软工领域的技术(尤其是编码技术)也可以应用到智能体中,推动智能体领域的发展。例如,软件测试技术可以用于识别基于大模型的智能体中的异常行为和潜在缺陷。软件工具(如 API 和库)的改进也可以提高基于大模型的智能体(尤其是对于那些具有工具使用能力的智能体)的性能。此外,智能体系统的管理可以借鉴软件包管理技术。例如,可以应用版本控制来监视和协调智能体系统中不同智能体之间的更新,从而增强兼容性和系统完整性。目前这方面的研究仍然有限,探索将更复杂的软工技术融入智能体系统有助于推动这两个领域的进步,是未来研究的可行方向之一。
综上,本综述对智能体技术与软工领域结合的相关工作进行了分析和梳理,构造了包含感知、记忆、动作三个核心模块的软工领域智能体框架,总结软工技术与智能体技术结合存在的挑战并给出了一些未来研究中存在的机遇。相信本综述能够为智能体和软工领域的发展起到促进作用。