由于日益增长的系统复杂性和严格的监管要求,开发安全关键的汽车软件面临着重大挑战。
一种将生成式人工智能集成到软件开发生命周期中的新颖框架被介绍,该框架使用大语言模型自动化生成诸如C++等语言的代码,并融入以安全为重点的实践,如静态验证、测试驱动开发和迭代优化。一个反馈驱动的流程确保了测试、仿真和验证的集成,以符合安全标准。该框架通过开发一个自适应巡航控制系统进行了验证。对大语言模型的比较基准测试确保了在准确性和可靠性方面选择最佳模型。结果表明,该框架能够实现自动代码生成,同时确保符合安全关键要求,系统地将生成式人工智能集成到汽车软件工程中。这项工作推动了人工智能在安全关键领域的应用,弥合了最先进的生成模型与现实世界安全需求之间的差距。
汽车领域的最新进展正在推动从硬件定义到软件定义智能车辆的范式转变,其中软件复杂性和安全关键性已显著增加。传统的线性流程,如V模型或瀑布模型,在适应动态变化的需求方面灵活性有限。随着汽车软件数量的增长,需求的每一次变更都需要对代码库进行大量修改和重复的验证周期,从而增加了开发时间和成本。
因此,软件架构师和开发人员在确保安全合规性方面面临着越来越大的挑战,特别是考虑到监管框架和标准的持续扩展,其复杂性现已达到难以手动跟踪和实施的水平。大语言模型,如Chat GPT-3 ,最近在应对这种复杂性方面显示出潜力,它将开发人员的角色从代码作者转变为生成流程的协调者。工程师无需手动编写所有应用层软件,而是可以利用LLM进行自动代码生成,将曾经阻碍快速开发的相同标准用作合规性的结构化数据源。
在这项工作中,我们提出了一个将生成式人工智能集成到软件开发生命周期中的新颖框架。通过在测试驱动开发和静态分析中使用LLM,我们的方法能够实现模块化系统架构,可以快速适应不断变化的需求,同时确保符合关键安全标准。所提出框架的一个核心要素是其在测试和集成阶段专注于软件生成,使LLM成为迭代优化循环中的积极参与者。在这种范式下,测试套件和集成脚本通过引导自动代码生成来满足指定需求,从而协助LLM。自动化流程减少了系统需求变更时手动重新编码和重新测试的需要。
因此,我们的方法论将工程工作转移到创建规范工件和强大工具上,而不是传统的的手动编码。我们详细介绍了该框架如何通过最大限度地减少代码生产和合规性检查中的人为干预来提高开发速度,并通过一个汽车案例研究来说明其节省时间和降低错误率的能力。
因此,我们提出以下:
-
集成GenAI的SDLC: 一种新颖的LLM驱动开发周期,结合了TDD、静态分析和迭代优化,用于安全关键的汽车软件。
-
安全监控流程: 一个统一的框架,用于静态分析、形式化验证和自动集成验证,以确保汽车软件系统的安全合规性。
-
LLM处理: 评估LLM的基准性能,并优化其在汽车软件开发中自动代码生成和优化的实现。
-
基于ISO的ACC案例研究: 通过自动生成基于ISO的C++ ACC系统并在CARLA模拟器[4]上进行测试来进行验证。
软件工程的基本原理基于软件开发中的关键设计决策。为了将安全作为优先事项,对稳健设计能力的关注可以通过有效的测试和验证方法以及软件验证工具的使用来补充。这使得GenAI能够创建可扩展且安全关键的应用,同时确保符合汽车标准。
通过设计选择降低软件复杂性
管理软件工程中的复杂性需要一种系统化的设计选择方法,旨在约束自由度,从而减少错误的可能性。因此,保持算法和流程控制的逻辑一致性对于验证正确性至关重要。系统与其环境之间的结构化交互减少了歧义并改善了集成。数据的有效组织支撑着性能和可扩展性,而模块化架构确保了可扩展性和适应性。测试驱动开发将正确性集成到开发过程中,而计算精度则减轻了数值不稳定性。依赖管理和平台兼容性确保了跨环境的一致行为。解决安全漏洞对于证明系统安全性至关重要,而有效管理并发对于处理动态和并行系统至关重要。
设计原则和标准为管理软件开发中固有的自由度提供了一个形式化框架,最终使得能够创建健壮、可扩展和可扩展的系统。战略性地控制每个自由度可以最小化出错的可能性,从而提高软件的整体安全性和可靠性。
安全关键软件
安全关键软件需要一种系统化的方法,将编程视为一门精确的科学,在所有条件下都具有可预测和可证明的行为。实现这一点需要仔细选择编程语言、健壮的编译器验证以及全面的验证和测试方法。
C++因其在高性能、精确内存控制和确定性资源管理之间的平衡而被广泛应用于安全关键设计,这使得能够满足严格的实时性和可靠性约束。编译器验证通过正确翻译代码进一步强化了这些保证。像GCC和Clang这样的C++编译器针对性能和可靠性进行了高度优化,提供了高级静态分析、代码优化和诊断功能。
除了语言和编译器选择之外,静态代码分析对于确保逻辑一致性至关重要。诸如cppcheck for C++ 之类的工具可以识别内存泄漏、竞争条件和准则违规,从而显著减少意外行为的可能性。在完全集成之前,系统行为通过单元测试进行验证。
像Google Test 这样的框架通过调整测试前提条件和边界情况来验证功能正确性。通过集成语言安全性、经过认证的编译器、静态分析和严格测试,这种方法提高了安全关键应用中的正确性、符合安全标准性和鲁棒性。
汽车系统需求工程和软件开发的基础
汽车软件开发将复杂的安全和功能需求与健壮的代码设计联系起来。软件需求规范定义了功能(例如,系统行为)和非功能(例如,性能、安全性)需求,指导开发过程。通过用例、用户故事和原型实现利益相关者对齐,确保清晰度并从一开始就解决安全问题。安全和质量标准是核心。
ISO 26262 定义了道路车辆的功能安全要求,而汽车软件过程改进和能力判定 提供了一个评估软件质量和过程的框架。MISRA指南标准化了编程实践,通常在其可靠性和安全关键系统性能的C或C++中实现。详细的测试,包括静态分析和单元测试,确保符合安全标准。通用需求与ISO 26262等框架保持一致,而功能特定需求则解决独特的系统需求。
通过集成这些原则,汽车软件开发将复杂的需求转化为可靠、可维护且符合安全标准的系统。
将生成式人工智能集成到软件工程中
注意力机制的引入彻底改变了自然语言处理,通过创新的Transformer架构使得开发大语言模型成为可能。该架构促进了非顺序数据处理,克服了早期循环模型的局限性,并引入了更高的效率和可扩展性。

图 1:在用于代码生成的大语言模型中引入注意力机制和Transformer架构。
在图1所示的框架中,作为文本输入提供的给定需求被标记化,并通过输入嵌入进行处理,在那里通过位置编码进行丰富以保留顺序上下文。然后,标记通过一堆自注意力层和前馈多层感知器进行迭代传递。这些机制确保模型捕获输入需求中的局部和全局依赖关系。随后,处理后的标记经过线性投影和后处理步骤以生成序列中的下一个标记。这个迭代过程使得能够以连贯且与上下文相关的文本形式生成软件。利用大规模数据集进一步增强了在特定任务上训练或微调基础模型(如llama3 )的能力。例如,专为代码生成设计的LLM,如Qwen2.5-Coder ,从特定于任务的训练数据集中受益匪浅。LLM的性能在很大程度上受训练数据质量、提示设计和系统规范的影响。
有效使用LLM的一个关键方面是上下文大小的管理,这本质上受到架构的限制。为了最大化可用上下文的效用,已经开发了有效的提示技术,确保关键信息在有限的输入空间内简洁地呈现。诸如零样本或少样本提示、思维链和基于角色的提示等策略使LLMS能够为各种任务生成准确和高质量的输出。与进一步的验证和形式化验证方法相结合可以提高生成代码的整体质量。
为了将生成式人工智能集成到软件开发生命周期中,我们提出了一种将测试驱动开发与先前介绍的验证方法和静态代码分析相结合的方法,通过快速反馈和一致性确保安全。
架构设计和软件版本控制
图2所示的框架展示了集成GenAI的SDLC。用户输入,包括详细规范,是基础。LLM处理器将此输入转换为可执行代码,并根据后续阶段的反馈对其进行迭代优化。静态验证模块分析生成的代码是否符合安全标准和设计原则。最后,集成测试模块在动态测试环境中评估系统,确保鲁棒的性能和功能正确性。
自动代码优化和再生的使用高度依赖于软件当前的开发阶段和版本。在安全关键系统中,版本控制遵循一种结合集成监控、

图 2:代码生成架构由三个组件组成:LLM处理器(浅蓝色)、静态验证模块(灰色)和集成测试模块(深蓝色)。用户(浅黄色)提供规范,LLM处理器生成可执行代码,该代码通过静态检查和集成测试进行迭代优化,以确保安全性和功能性。

图 3:软件版本按安全分类进行分类,经历三个主要状态。"已验证状态"在成功完成静态测试后达到。"安全状态"在满足静态和集成测试标准后达到。LLM处理器根据软件的当前状态动态管理LLM的生成。
静态代码分析和迭代优化(图3)的方法论。最终目标是达到"安全状态",其中所有预定义的功能和安全要求都得到满足。
每次迭代 ISIS 都涉及由静态验证模块管理的静态分析,以检测和解决逻辑不一致性和设计违规。成功完成后,代码从静态状态 (siSsiS) 转移到仿真环境中的集成状态 (siIsiI),在那里进行迭代验证和优化 (IIII)。只有当静态和集成标准都最终满足时,才能实现向安全状态的转换。
这种静态和集成迭代的循环过程确保了软件的持续改进。每个后续状态都以其前一个状态为基础逐步建立,并以经过验证的安全和集成协议为基础。重要的是,只有当集成阶段成功且所有静态检查都解决后,才会生成新的已验证状态,从而确保对安全性和正确性的坚定不移的承诺。
基于LLM的生成:规范和用户输入
用户输入分为两个不同的类别:系统设计规范和系统行为规范。系统设计规范侧重于系统的输入和输出,使用精确的数学语言定义算法前提条件和后置条件。系统行为规范描述了系统的整体结构和行为。为了提示LLM,结构化文本作为输入提供。JSON因其标准化和兼容性而广泛应用于软件工程。YAML的人类可读特性,例如空格结构、可选引号和对内联注释的支持,增强了规范阶段的可用性和可解释性。为了最大化提示效率,系统设计规范使用JSON,而系统行为规范使用YAML。这种双格式策略确保了有效的上下文管理和提示空间的最佳利用,以生成准确且可解释的输出。
该框架集成了零样本和少样本提示以优化LLM性能。零样本提示建立基线输出,然后进行迭代的少样本优化以提高准确性并解决错误。这个过程从探索性提示过渡到基于输出质量的精确调整。思维链推理通过向LLM提供先前的最佳解决方案来改进版本控制,从而实现向安全状态的迭代改进,如图3所示。基于角色的提示将LLM的角色定义为"用于安全关键汽车代码生成的专门AI助手",确保输出符合框架的要求。每次迭代都建立在先前结果的基础上,推动持续改进并与规范保持一致。
选择合适的LLM对于实现最佳结果至关重要。我们使用 McEval:大规模多语言代码评估 ,这是一个旨在评估LLM在40种编程语言(包括Rust和C++)中性能的基准,使用了16,000个测试用例。这为评估多语言代码生成提供了一个全面的框架。对于推理和迭代代码优化,我们采用Aider的代码编辑基准。它评估根据自然语言指令修改函数、实现缺失功能和重构代码的精确性和一致性。通过优先考虑编辑而非生成,Aider基准评估了在各种编程挑战中代码审查和优化的准确性和一致性,这对于需要强大迭代开发能力的框架至关重要。我们还包含了广为人知的HumanEval基准。

表I总结了各种大语言模型在这些基准测试中的表现,突出了它们的多语言代码生成和迭代优化能力。我们评估了最先进的开源LLM,包括Qwen2.5-Coder-7B-Instruct、Llama-3-8B-Instruct、DeepSeek-Coder-V2 Lite Instruct 、DeepSeek-Coder 33B Instruct 和CodeStral-22B ,并使用GPT-4o作为比较基准。
考虑到数据的敏感性以及汽车领域严格的数据保护要求,我们的用例需要一个可本地部署的LLM,能够处理复杂的编程任务而不损害数据安全。在令牌大小小于10B的模型中,Qwen2.5-Coder-7B-Instruct被证明是最有效的选择,在提供出色性能的同时,是该类别中最小的。
一旦LLM生成输出,下一步就是提取代码并安装必要的库。此阶段包括依赖项管理,确保所有必要的库和工具都正确定义并集成到软件环境中。通过自动化这些任务,该框架在保持精确性和可靠性的同时加速了开发周期。这种基于LLM的生成的结构化方法弥合了用户提供的输入和可操作的软件工件之间的差距。
待续
文章转译自:
Generating Automotive Code: Large Language Models for Software
Development and Verification in Safety-Critical Systems
苏文·基尔希纳¹,阿洛伊斯·C·克诺尔¹
¹ 德国巴伐利亚州加兴慕尼黑工业大学