AI 可以通过在整个软件开发生命周期中生成、优化和翻译代码来彻底改变应用程序开发。采用生成式 AI 可以实现软件创建的一致性、开发人员创造力的最优利用以及开发人员技能的提升。 例如:
将生成式 AI 应用于应用程序开发具有主要的潜在优点:
应用生成式 AI 来审查、重构并将企业编码标准应用于软件,结果是软件更加一致,例如,解决重复问题的通用方法、通用代码结构、自文档化代码等,而无论代码由哪个开发人员编写。这样一来,生成的应用更易于排查和维护,因为维护人员无需先去理解代码不同部分的结构与独特特性。
与其他领域一样,生成式 AI 有潜力将应用开发人员从编写简单 / 机械代码、定位复杂漏洞来源等低价值工作中解放出来。开发人员便可将更多时间专注于高价值任务,从而缩短开发周期,在每次软件版本中实现更多功能,并进行更小规模、更频繁的更新。
最后,将生成式 AI 应用于应用程序开发可以增强开发人员的技能,使初级开发人员能够达到高级甚至专家水平。高级开发人员可以将模型训练纳入其发布周期,在代码优化过程中融入最佳实践。生成式 AI 可作为初级员工的专业导师,释放高级开发人员的精力以专注于其他任务,并提升整个开发团队的技能水平。
生成式 AI 可在多个广泛场景中应用于应用开发。许多通用模型(如 Llama 2)均基于多种现代编程语言编写的应用代码进行训练,同时也提供用于代码生成的专项优化模型。
我们认为可从生成式 AI 中受益的应用场景包括:
下面将分别介绍这些使用场景。
大型语言模型 (LLM) 自带的文本生成能力,可用于根据自然语言提示生成新代码。例如,开发人员可输入提示词:“编写一条 SQL 查询语句,从 customer 表中获取客户的名字和姓氏”,并得到对应的 SQL 查询结果。
使用大语言模型生成代码,可大幅提升初级开发者甚至非开发人员的应用开发能力。但随着所需输出愈发复杂,或提示词的详细程度接近待生成代码本身时,其收益会快速递减。
代码优化与重构(即改进代码以提升性能、优化结构的过程)可被视为大语言模型两项能力的结合:文本生成与文本摘要。使用通用或调整的 LLM,开发人员可以提示优化或重构一段代码,以提高性能和/或消除重复代码。
大语言模型擅长优化和重构处于其上下文窗口内的小型代码片段;但要在更大代码块或完整软件系统上取得理想效果,则需要能维护整个软件元数据的更大规模解决方案。
与代码优化类似,大语言模型可用于应用并执行企业编码规范,例如函数与变量命名、代码结构及企业编码约定等方面。大语言模型通常在代码仓库层面,作为代码审查与提交流程的一部分使用;基于企业编码规范微调后的模型,可将提交的代码转换为符合企业标准的形式。这些规范还可包含安全加固约定,帮助企业满足监管合规要求。
编程语言与其他语言类似,大语言模型原生的文本翻译能力可将一种编程语言编写的软件翻译为另一种,例如将 C# 转换为 Java。
与代码优化类似,仅靠大语言模型就能很好地转换处于其上下文窗口内的小型代码片段;但要转换更大代码块或完整软件系统,则需要能维护元数据与其他重要上下文信息的更大规模解决方案。
借助代码转换能力,生成式 AI 还可实现不同编程语言之间的代码转换,例如将 COBOL 代码转换为 Java。这在多语言环境或系统迁移期间特别有用,可以为开发人员节省手动重写代码的时间和精力。
代码理解与代码生成互为对应过程。代码理解并非将自然语言提示转换为代码,而是以一段代码作为输入,生成关于该代码功能的自然语言说明。例如,输入 “解释这段 Python 代码的功能” 这样的提示词并附上一段 Python 代码,模型便能生成对该代码逐行及整体功能的总结说明。
这一能力也可用于检测代码中的错误(也称作错误搜寻),具体方式是向模型输入提示词:“找出这段代码运行失败的原因”。
API 和库选择是检索增强生成 (RAG) 在企业 API 和软件库管理中的应用。开发者在搜索适用于某应用程序的 API 时,可构建检索增强生成 (RAG) 提示词,对包含 API 名称、说明、接口端点等信息的企业数据库进行查询,以回答诸如“我们是否具备实现某类功能的 API?”这类问题。只要 API 和代码库描述以高质量和关键词维护,这样的应用程序就可以被调整为提供一致响应,从而加快应用程序开发和开发者上手速度。
架构师在设计使用 LLM 的应用开发解决方案时,必须做出许多重要的架构决策。
该模型是否提供损害赔偿/版权保护?你们如何判断生成的代码是否受许可条款限制?即使是基于宽松许可协议训练的模型,也可能受到授权条款的约束,例如要求注明原版权所有者的署名权。
设计用于执行和应用企业编码规范的架构师,必须考虑对大语言模型进行微调以使其“理解”企业规范所需投入的工作量,并审慎判断类似代码检查工具 (linting tools) 等其他方法是否能更有效地实现同类功能。
自动完成式代码辅助必须快速响应,以免干扰开发人员的培训。架构师必须考虑开发者辅助模型的部署位置与连接方式,以确保对开发者的支持切实有效且不造成干扰。
大语言模型无法保证生成功能正确的代码,尤其是当生成或修改的代码需要集成到更大的软件系统中时。虽然这个问题没有直接的解决方案(随着 LLM 的发展,这个问题会越来越少),但架构师需要意识到,LLM 生成的代码需要接受与人类开发人员生成的代码相同的质量保证和安全控制。
通用大语言模型通常仅基于少数主流编程语言进行训练,例如 Python、JavaScript、C# 等。需要支持老旧或小众编程语言的解决方案架构师可能会发现,可选模型十分有限,或者可能需要对通用模型进行深度微调才能满足其特定需求。