大型模型在软件工程前期工作中的应用

发表时间: 2024-04-02 16:41

最近打算开发用于软件工程的LLM和Agent用于工作流,又看了一些软件工程的书。

目前的原则是,人不能深刻理解的东西,也不要依赖于LLM去实现,因为这样将导致失控。而tob业务客户关心的是对AI算法能力的控制。

因为本人是算法出身,所以也算是通过复习学习到了一些东西,整理一下给大家分享。

学到的两个知识点,就是1何为抽象?2为什么把问题分解可能让情况变好?

1 何为抽象?

经常有一个常见的例子就是

依赖倒置原则(Dependency Inversion Principle, DIP)

  • 定义:高层模块不应该依赖于低层模块,两者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。
  • 举例:在一个电子商务系统中,ShoppingCart类依赖于具体的支付网关PaymentGateway。根据依赖倒置原则,ShoppingCart应该依赖于一个抽象的支付接口IPaymentGateway,而PaymentGateway实现这个接口。这样,如果未来需要更换支付网关,只需要提供一个新的实现类即可,而不需要修改ShoppingCart。
  • 上文中ShoppingCart依赖的interface是一个抽象,抽象到底是什么,它提供的“功能”就是,就是支付。我们忽略支付的具体实现方式,这里抽象就是一个“名”。“名”就是一种抽象,它是一种简化。在认知的角度,喊一个人的名字,大脑中会出现一个人音容笑貌。一个人的长相,他给你带来了什么,组成他的身体的所有分子,他脑子里的信念、习惯,这都是具体给你带来的实现方式。而现在,“名”就是仅仅是一个名字,是一个填到表格里的字符串,或者需要在其后打对钩表示签到的东西。

    这就是抽象,就是对事物的整体(不限于认知意义上、物理意义上、和环境交互意义上的)做删除和剥离。剥离后留下的一部分东西,真正需要的,在这里就是payment支付功能的interface了。而它的实现,就由更复杂的代码来完成(来implement)。

    依赖于抽象就是依赖于具体的事物的某一个方面。

    其实这个例子可以方便的帮助我们理解何为抽象,何为接口。那么其实,例子也是一种抽象,因为它以偏概全,以后我们遇到本质上相同的模式,都可以用这个例子去套,看在那种情况下,什么是Shoppingcart,什么是payment。以偏概全有错吗?它降低了认知的负荷。同时使得认知过程更精确,更有目的性,删掉了不必要的部分,也就是implementation中和Shoppingcart的不直接相关的细节。

    2 为什么需要分解?

    这里直接引用那本《软件工程实践者的研究方法》这本书的说法。解决问题,假设需要认知任务h1和h2。h1和h2同时去解决消耗的认知资源,就大于h1单独解决+h2单独解决的资源以及单独解决后组合的资源

    这很容易理解,举一个例子,比如看到一个新闻,你可能觉得很震惊,这个过程消耗脑力。但是反过来你可以去考虑,这个新闻不是真的,然后又平复了震惊。这里就分成了两个步骤,首先又第一反应,其次有第二反应(思考,快与慢)。如果强行合并,那么每次你就要同时判定新闻真假同时针对内容作反应,如果你的脑子是一个大模型,这个输入的提示词长度就很长,或者我们的脑子其实就很“累”。这里需要注意的是上面提到的单独解决后组合的资源。这一点非常重要,整合本身也是消耗资源的。

    3 净室软件工程

    这个是高精度的软件工程研发方法(航天、医疗、军工领域的精确度可靠性等质量指标很高的软件工程开发方法),这个其中的方法论,我也是准备引入到大模型的方法中。

    严格的开发环境: 净室软件工程要求在受控的环境中进行软件开发,这个环境应该尽可能地减少外部干扰和潜在的错误源。这包括对开发人员的工作空间、工具和过程的严格控制。

  • 定义良好的过程: 净室方法强调遵循一套定义明确、严格的过程来开发软件。这些过程包括需求分析、设计、编码、测试和维护等阶段,每个阶段都有明确的输入、输出和质量标准。
  • 高度的自动化: 为了减少人为错误,净室软件工程倡导使用自动化工具来执行重复性任务,如代码生成、测试和文档编制。自动化可以提高效率并减少因人为操作导致的错误。
  • 形式化方法: 净室方法鼓励使用形式化方法来描述和验证软件系统的行为。这包括使用数学模型和逻辑来精确定义需求和设计,以及使用形式化验证技术来确保软件的正确性。
  • 严格的质量控制: 净室软件工程要求在整个开发过程中实施严格的质量控制措施。这包括代码审查、设计评审、单元测试和系统测试等,以确保每个开发阶段的输出都符合预定的质量标准。
  • 统计测试: 净室方法使用统计测试方法来评估软件的可靠性。这意味着通过大量的测试用例来估计软件中缺陷的概率,并根据这些统计数据来指导测试过程和改进软件设计。持续的过程改进: 净室软件工程认为软件过程是一个持续改进的过程。通过收集和分析开发过程中的数据,不断优化和调整开发方法,以提高软件质量和开发效率。