生成式人工智能问答:在软件工程中的应用

作者:JOHN E. ROBERT AND DOUGLAS SCHMIDT (WILLIAM & MARY)

美国软件工程研究所(SEI)最近举办了一场关于生成式人工智能的问答网络直播。本次网络研讨会邀请了 SEI 的多位专家,他们回答了观众提出的问题,并讨论了生成式人工智能和大型语言模型(如 ChatGPTClaude)有效且可靠应用所需的技术进步和实际考虑因素。这篇博客文章包含了我们的回复,为了提高原始网络直播的清晰度,我们对回复内容进行了重新排序和编辑。这是一个两部分系列文章的第一部分,探讨了生成式人工智能在软件工程中的影响,特别是在国防以及对服务质量有严格要求的领域。在这部分内容中,我们讨论了生成式人工智能对软件工程的变革性影响,以及它在关键任务环境中的实际影响和适应性。

生成式人工智能对软件工程的变革性影响

问:与传统软件工程相比,生成式人工智能有哪些优势

John Robert : 在软件工程领域,生成式人工智能有许多令人兴奋的应用。现在我们很多人都有用过像 ChatGPT 这样的生成式人工智能工具以及其他流行的大型语言模型来创建代码的经历,通常是在浏览器窗口中根据提示来进行操作。然而,诸如 GitHub Copilot亚马逊 Code Whisperer 等生成式人工智能代码助手,正越来越多地与像 IntelliJ、安卓开发工作室(Android Studio)、Visual Studio 和 Eclipse 等流行的集成开发环境相融合。在这两种情况下,根据提示创建代码可以提高开发人员的工作效率。此外,这些人工智能代码助手在其他方面也表现出色,比如代码重构和代码转换,它们可以修改现有代码, 或将其翻译成不同的编程语言、编程语言版本或平台。

使用生成式人工智能工具来创建评估代码质量和性能的测试用例是另一个新兴的有趣领域。尽管这些工具可以像传统的静态分析工具那样检查代码,但它们也能让软件工程师和分析师进行广泛的互动。有很多软件工程师使用大型语言模型以全新的互动方式探索代码的例子,比如要求对代码进行总结、检查代码是否符合编码标准,或者进行对话以探讨代码与特定因素(如安全性、可靠性或性能)之间的关系。在这些以及其他用例中,经验丰富的软件工程师的知识对于避免过度依赖生成式人工智能工具至关重要。新的特点在于这种互动性,它使软件工程师能够探索问题的答案,并以迭代的方式开发问题的解决方案。

生成式人工智能并不局限于仅增强软件生命周期中的代码层面活动,实际上,它还为软件工程实践提供了其他潜在的好处。例如,软件工程师除了编码之外还执行许多其他任务,包括参加会议、检查文档或与不同的利益相关者互动。如今,所有这些活动都需要人工检查和总结大量的文档。生成式人工智能非常适合帮助人们更高效、准确地执行这些活动,同时也有助于提高参与美国国防部(DoD)和政府软件采购活动及政策的人员的工作质量和效率。

我想强调的一个关键点是,人类是生成式人工智能过程中不可或缺的一部分,不应该被这些工具完全取代。此外,鉴于第一代生成式人工智能工具尚处于发展初期,拥有熟练的软件和系统工程师以及主题专家至关重要,他们能够发现生成的文档或代码哪里不准确,并确保关键背景信息不丢失。即使生成式人工智能工具提供了强大的新功能,这些人类技能仍然是重要且必要的。

问:你如何看待使用生成式人工智能与一种或多种其他技术相结合来生成代码的 混合方法?混合方法的例子可能包括将大型语言模型与模型驱动开发(MDD)或符号人工智能结合使用?

John :在回答这个问题时,我假设 "MDD" 代表模型驱动开发,它是更广泛的基于模型的软件工程(MSBE)领域的一部分。人们对使用模型生成代码以及在软件生命周期内帮助降低维护软件(尤其是大规模依赖软件的系统)的成本有相当大的兴趣。因此,将生成式人工智能应用于基于模型的软件工程是一个活跃的研究领域。

然而,将基于模型的软件工程与像 ChatGPT 这样的大型语言模型相结合引发了各种担忧,比如生成的代码是否不正确或是否包含像缓冲区溢出这样的漏洞。因此,另一个令人感兴趣且活跃的研究领域是使用混合方法,这种方法不仅利用大型语言模型,还利用其他技术,如基于模型的软件工程、开发安全运维(DevSecOps)或基于组件的软件工程(CBSE),来解决这些缺点或风险。重要的是评估在软件工程中应用大型语言模型的机会和风险,并将大型语言模型与现有技术相结合。

在美国软件工程研究所(SEI),我们已经开始应用生成式人工智能从较低层次的代码语料库中反向工程基于模型的表示。我们早期的实验表明,在许多情况下这种结合可以产生相当准确的结果。展望未来,美国软件工程研究所看到了这个领域的许多机会,因为遗留软件在很多情况下往往缺乏准确的模型表示,甚至没有良好的文档。此外,确保强大的 "双向工程"(即持续同步软件模型及其相应的代码库)一直是基于模型的软件工程中的一个长期挑战。因此,一个很有前景的研究领域是将基于模型的软件工程和生成式人工智能技术相结合的混合方法,以尽量减少孤立地应用生成式人工智能进行代码生成的风险。

问:有没有可能让开源的大型语言模型适应其从未见过的不熟悉的专有编程语言?

John: 大型语言模型已经显示出了显著的可扩展性,尤其是在通过精心设计的提示工程和提示模式进行优化时。虽然大型语言模型在像 Python、Java 和 C++ 等主流语言方面最为精通,但它们对于像 JOVIAL、Ada 和 COBOL 等不太知名的语言也能提供令人惊讶的实用性,而这些语言对于美国国防部的长期项目至关重要。使大型语言模型适应并支持这些小众语言的一个有效策略是使用专门的数据集对它们进行微调,这与 Hugging FaceCodeGen 计划所采用的方法类似。提示工程可以进一步利用这种经过微调的知识,将其转化为对遗留应用领域和全新应用领域都可行的见解。

然而,在充满热情的同时也必须保持谨慎。大型语言模型为重塑各种任务提供了大量新的机会,但它们的有效性取决于具体情境。因此,至关重要的是要明白,虽然这些工具功能强大,但它们也有局限性。并非所有问题都最适合用人工智能模型来解决,所以美国软件工程研究所正在开发一些方法,以辨别何时传统方法能提供更可靠的解决方案。

总之,虽然让开源的大型语言模型适应不熟悉的专有编程语言有一些很有前景的途径,但这些努力的效果并不能得到保证。进行全面的评估以确定大型语言模型在特定用例和领域中的适用性和局限性是至关重要的。此外,随着大型语言模型不断发展,保持开放的心态并定期重新审视那些目前可能不是有效解决方案但未来可能变得有用的领域也很重要。

生成式人工智能在关键任务环境中的实际影响与适用性

问:生成式人工智能目前在国防部能有哪些应用?

**Douglas Schmidt:**生成式人工智能为国防部提供了广泛的应用场景,可解决遗留和当下的各种挑战。一个紧迫的问题在于维持遗留软件系统,正如约翰之前提到的,这些系统通常是用如今已不太常见的语言开发的,比如Ada或JOVIAL。精通这些语言的开发人员数量不断减少,这给国防部的自主维护工作带来了重大障碍。然而,大语言模型(LLMs)可以通过训练、微调以及(或)提示工程来理解这些较古老的语言,从而有助于理解和演进现有代码库。与云服务提供商(如微软的Azure等)的合作,进一步确保了对这些专业代码库的安全访问,且符合政府规定,从而加强了软件维护策略。

LLM 在美国国防部的另一个前景广阔的应用领域是大规模采购项目,这些项目拥有大量的监管文件、安全规范和安全协议。鉴于这些数据量巨大,人类分析师要全面理解所有这些文件实际上是不可行的。幸运的是,许多 LLM 擅长文本分析,能够快速筛选海量资料库,找出不一致之处、空白和特定信息--有助于 "大海捞针"。这种能力对于确保国防部的采购项目及时、经济高效地遵守必要的准则和要求是非常宝贵的。

国防部内部的业务活动也可以从当今的 LLM 功能中获益。例如,拥有多诺万平台的 Scale 公司或拥有人工智能平台的 Palantir 公司正在开辟新的途径,帮助国防部分析人员和操作人员处理大量不同的信息,并将其转化为可操作的行动方案。这些平台正在利用经过微调的 LLM 来综合来自各种信号和传感器的数据,从而实现更有效的协调、信息融合以及情报收集和任务规划的资产提示。我预计在不久的将来,我们将看到更多此类平台被部署到国防部的项目中。

总之,生成式人工智能不仅是国防部的未来前景,也是一个新兴的现实,其应用范围从软件维护到采购项目监督和运营支持。随着人工智能技术的不断进步,我预计其在军事领域的应用范围将更加广泛,从而加强人工智能能力在国防领域的战略重要性。

问:在部署前、生产环境、高风险场景以及国防部用例中,使用生成式人工智能产品生成的代码时,你如何评估风险?对传统的验证和确认方法或形式化方法有什么看法?

**John:**这个问题很有趣,因为人们越来越多地计划在这类场景和环境中利用生成式人工智能。将生成式人工智能应用于软件工程生命周期,是迈向人工智能增强软件工程这一更大趋势的一部分,软件工程研究所(SEI)在2021年秋季的一份出版物中对此有所阐述。过去十年中,这种智能自动化趋势已经出现,越来越多的人工智能增强工具进入市场,并应用于软件开发、测试和部署。然而,在这种背景下,一系列新的挑战也随之出现。

例如,如今生成代码的 LLM 都是在 GitHub、Stack Overflow 等不完善代码的基础上训练出来的。毫不奇怪,它们生成的代码也可能不完美(例如,可能存在缺陷、漏洞等)。因此,在整个软件工程生命周期(包括规划、架构、设计、开发、测试和部署阶段)中,利用人工洞察力和监督至关重要。

然而,如果使用得当,生成式人工智能工具也能以新的方式加速许多这些阶段(例如,创建新的测试用例、静态分析代码等)。此外,软件工程界需要考虑如何应用大语言模型来加速整个软件生命周期,而不仅仅是专注于生成代码。例如,软件工程研究所正在探索如何将大语言模型与形式化方法和架构分析相结合,并在生命周期的更早阶段应用这些技术。

Doug: 我想补充一下John刚才提到的几件事。几十年来,我们一直在通过各种高层抽象生成代码,最早可以追溯到用于编译器构建的 lex 和 yacc 等工具。长期以来,我们也一直通过 AADL 和 GME 等元建模框架,从模型驱动工程工具和特定领域建模语言生成代码。

随着 LLM 的出现,主要的变化是人工智能现在可以生成更多传统上由人工编写的工具所生成的代码。然而,同样的基本原则和实践仍然适用(例如,我们仍然需要单元测试、集成测试等)。因此,我们所熟知和喜爱的关于确保软件有效性和验证可信度的所有内容仍然适用,但我们现在希望人工智能生成工具能够完成更多的工作。

第二点,在John之前回答的基础上,我们不应该指望人工智能从零开始生成完整无缺的软件依赖系统。相反,我们应该从生成增强智能(即开发人员与人工智能工具一起工作)的角度来看待 LLM。如今,我在教学、研究和编程过程中一直在进行这种合作。特别是,我与 ChatGPT 和克劳德携手合作,但我并不指望他们生成所有代码。相反,我负责大部分的设计、分解和部分实现任务,然后让 LLMs 帮我完成一些任务,否则我就会觉得手动完成这些任务很乏味、容易出错和/或无聊。因此,我使用 LLM 来补充我作为程序员的技能,而不是取而代之。

生成式增强智能和生成式人工智能之间的这种区别很重要。当我阅读那些对使用生成式人工智能进行编程的好处持怀疑态度的同事的文章时,我发现他们通常会犯同样的错误。首先,他们只是使用早期版本的大语言模型(如ChatGPT - 3.5)尝试几个例子。接下来,他们没有花时间思考如何进行有效的提示工程或应用合理的提示模式。然后,当他们没有得到预期的结果时,就会举手说"看,皇帝没穿衣服"或"人工智能对程序员没有帮助"。我把这种修辞策略称为"反生成式人工智能",即人们从几个不起作用的简单案例中过度概括,没有任何额外的思考或努力,然后诋毁整个范式。然而,我们这些花时间学习有效的提示工程模式,并在日常编程和软件工程实践中实际应用大语言模型的人已经意识到,如果使用得当,它们的效果相当不错。

总结性思考

**John:**我非常享受这些问题以及我们的讨论。我认同,亲自动手进行实验对于理解大型语言模型(LLMs)能做什么、不能做什么,以及在实际应用生成式人工智能时会出现哪些机遇和风险来说至关重要。从软件工程的角度来看,我主要的收获是,大型语言模型不仅仅对与代码相关的活动有用,还能卓有成效地应用于前期的活动,包括采购规划、计划制定以及管理工作。

在软件项目中,除了代码之外,还存在许多有价值的信息,无论是在你喜欢的开源 GitHub 代码库中,还是在你自己公司内部的文档版本控制系统里。例如,可能会有测试用例、文档、安全策略等等。因此,应用生成式人工智能来协助采购人员和软件工程师的机会是相当多的。美国软件工程研究所(SEI)才刚刚开始探索这些机会,同时也在研究并降低相关风险。

**Doug:**几十年来,我们许多在教育领域和政府部门工作的人一直都在关注数字鸿沟问题,从历史上看,数字鸿沟指的是能够使用互联网和计算机的人与无法使用的人之间的差距。虽然我们在缩小数字鸿沟方面取得了稳步进展,但我们即将面临数字断层的问题,当一些人知道如何有效地使用生成式人工智能工具,而另一些人却不知道时,这种情况就会出现。因此,虽然人工智能本身可能不会直接抢走你的工作,但比你更有效地利用人工智能的人却有可能取代你。这一趋势凸显了熟练掌握人工智能技术对于在未来的职场中保持竞争优势的重要性。

如果你不是计算机科学家,而又想熟练掌握网页开发技术,你可以参加一个为期 24 周的编程训练营,学习使用 JavaScript 和相关的网页技术进行一些编码。然而,毕业后,你将与拥有数十年经验的开发人员竞争,可能很难与他们抗衡。相比之下,很少有人拥有超过大约六到八个月的提示工程经验以及有效使用大型语言模型的经验。因此,如果你想抢占先机,现在是一个全新开始的好时机,因为你所需要的只是网络连接、一台装有网页浏览器的电脑以及学习的热情。

此外,如果你愿意投入时间和精力,甚至不需要成为一名程序员或软件工程师,也能大幅提高工作效率。把大型语言模型当作我们大脑的 "外骨骼"------ 而不是批判性思维的替代品 ------ 这样,作为一个社会和劳动群体,我们将更具生产力和效率。当然,我们还有很多工作要做,以使大型语言模型更值得信赖、更符合伦理道德且更有效,这样人们就能以正确的方式使用它们,而不是把它们当作逃避思考的拐杖。我对未来非常乐观,但我们都需要共同努力,帮助教育每一个人,让大家都能更加熟练地使用这项新技术。

相关推荐
柳鲲鹏1 小时前
OpenCV: DNN超采样,性能差,只能整数
人工智能·opencv·dnn
林林宋1 小时前
speech/music/sing 分离
人工智能
siliconstorm.ai1 小时前
全球人形机器人产业现状与技术挑战:AI与云计算如何驱动下一波发展
人工智能
Fleshy数模2 小时前
Sklearn实战KNN:快速实现分类任务的入门指南
人工智能·分类·sklearn
犀思云2 小时前
出海SaaS全球分布式部署:流量调度的六大核心挑战与破局思考
运维·网络·人工智能·系统架构·机器人
老蒋每日coding2 小时前
AI Agent 设计模式系列(二十一)—— 探索和发现设计模式
人工智能·设计模式
格林威2 小时前
Baumer相机铁轨表面裂纹巡检:提升铁路安全监测能力的 7 个关键技术,附 OpenCV+Halcon 实战代码!
人工智能·数码相机·opencv·算法·安全·计算机视觉·分类
想你依然心痛2 小时前
AI 音效新征程:HunyuanVideo-Foley 视频配音实战
人工智能·音视频·智能电视
天天代码码天天2 小时前
lw.PPOCRSharp_GPU_Test paddle_inference v3.3
人工智能·深度学习·paddle