AIGC 生成代码正流行,对程序员是好还是坏?( 三 )


今天,我们生成代码需要进行多轮对话 。ChatGPT 令人惊讶的地方在于能够跟随对话,我们可以继续提问,可以在对话中指代之前提到的内容,而它也能理解我在指代什么 。当我提供描述并生成代码后,可以运行该代码并将结果反馈给它,告诉它哪里出错了,然后它可以继续生成下一轮代码,通过多次迭代,生成的代码会越来越符合预期 。
我认识一个 CTO,他有大约 10 年没有写过代码了,最近他想要创建一个 Discord 机器人,但对于如何使用 Python 处理他并不熟悉 。于是,他向 ChatGPT 描述了想要实现的功能,然后 ChatGPT 生成了一段代码 。初次生成的代码并不能正常工作,他就将错误信息反馈给了模型,然后重新生成了一段代码 。经过几轮的交互,他花了大约半天的时间在一个不熟悉的领域中生成了大致能够运行的代码 。我觉得这展示了 ChatGPT 的能力,尽管并不能完全理解需求,但通过不断交互就能够逐渐实现想要的结果 。
这并不是说只需简单的描述,大语言模型就能完全理解 。实际上很多时候,我们自己都并不清楚究竟想要什么,我们可能需要先看到一些代码,然后逐渐明确自己的需求 。这个过程可能需要花费相当长的时间 。尽管如此,我仍然觉得这是一项令人印象深刻的技术 。
这也给编程工具的用户界面带来了很大的挑战 。Copilot 的使用非常简单,你只需在其中编写注释,然后让它将注释转化为相应的代码 。这是一次性的代码生成过程,然而要实现更复杂的功能,就需要一个能够支持对话的用户界面了 。
生成代码的质量与安全问题
吴少杰:AI 生成代码的质量高低与哪些因素有关?如何消除 AI 生成代存在的安全隐患?
邓明轩:这里涉及两个问题:质量和安全性 。质量与我们对 Prompt 工程的学习和掌握有关 。而安全性则有两个方面需要考虑:首先是工具本身提供的安全辅助功能,另一方面是作为代码使用者,我们如何考虑安全问题 。
我想提一下亚马逊云科技推出的 Code Whisperer 工具,它实际上对代码的安全性进行了检查和提示 。当然,尽管可以使用工具来辅助我们更好、更快速地发现安全问题,但我们仍然需要对项目的代码负责 。例如,我们需要考虑是否可能泄露敏感信息或者代码是否可能被错误使用,尤其是在涉及对外服务的方面,我们还需要考虑这些服务是否会对其他系统造成重大损害 。
大型语言模型的多轮对话会受限于容量,可能只有几十 KB,因此档面对复杂的项目,或者一个由 10 人或 20 人组成的团队时,其容量可能远远不够 。此外,还有整个软件环境,包括软件设计和需求描述等方方面面的考虑 。因此,作为程序员,我们需要对这个领域有全面了解,从头到尾清楚了解相关结构 。在这种情况下,我们会将其中的细微问题拆分出来,与大型语言模型进行交互,一定程度上避免由于容量限制而无法处理复杂的逻辑跟踪 。当然,这也涉及到安全性的问题 。
回到质量问题,我认为质量同样是程序员的责任 。在这方面,工具也对我们提出了一些要求,如果你的代码质量较高,那它将更容易理解,生成代码的可用性也会更高 。最终代码质量的责任仍然在于代码的拥有者,也就是我们自己,我们需要真正对此负责 。
Michael Yuan:对于代码质量,有一些简单的方法可以采用,例如将代码与编译器进行链接,使生成的代码立即进行自动编译,并通过编译器提供的错误信息进行修复 。此外,还可以与数据库等工具结合使用,自动扫描检测常见的问题 。所以,代码质量并不是一个无法解决的科学问题,而是一个工程问题,我们可以通过各种工具的结合来不断接近最优解 。
不过,目前对代码质量的控制问题可能会有一些争议 。目前,从个人角度来评判代码质量的一个重要标准是可扩展性,也就是代码编写后是否容易修改 。然而,现在有一些流派认为,未来尤其是对于前端框架而言,这种代码质量可能并不重要 。
可以设想一个未来的场景,整个应用程序都是由大型模型生成的,不存在需要人为修改的问题,如果需求发生变化,只需重新生成代码即可 。某些场景下,每次生成的代码都只使用一次,不存在扩展代码的问题 。当然,现在可能还无法实现这一点,但这是一个可能出现的未来,如果成为现实,那么会对代码质量的评价产生重大影响 。因此,我认为在架构上编写可扩展且优雅的代码并不重要,至少在某些场景中不重要 。
我们再谈谈第二点,即安全问题 。我认为,人类编写的代码在某种程度上也是相对安全的,否则就不会存在那么多问题,也不会有像 Rust 这样的语言出现 。对于安全问题的解决,人们在编写代码时已经用了很多工具,例如 Rust 通过编译器解决内存安全问题、JAVA 通过运行时方法解决内存安全问题等 。


推荐阅读