在生成式 AI 的浪潮中,代码生成正成为开发者们最兴奋的领域之一。Anthropic 的首席科学家 Jared Kaplan 认为,生成式 AI 在理解代码错误和调试方面展现出巨大潜力。
微软支持的 GitHub 在 2022 年推出的 Copilot,基于 OpenAI 的大型语言模型,现已成为全球数百万开发者的得力助手。与此同时,Anthropic 的 Claude、OpenAI 的 ChatGPT 和 Google DeepMind 的 Gemini 等通用聊天机器人也为开发者提供了日常帮助。
Alphabet 首席执行官 Sundar Pichai 在 10 月份的财报电话会议上宣称,目前 Google 超过四分之一的新代码是由 AI 生成的,并经过工程师审查和确认。预计其他科技公司也将紧随其后。
除了科技巨头,一批新兴公司也涌入这个充满活力的市场。Zencoder、Merly、Cosine、Tessl(成立几个月后估值达到 7.5 亿美元)和 Poolside(在发布产品之前估值达到 30 亿美元)等新玩家都在争夺市场份额。投资公司 Air Street Capital 的分析师 Nathan Benaich 表示,开发者愿意为代码助手付费,代码生成成为 AI 最容易变现的领域之一。
这些公司承诺将生成式代码助手提升到新的水平。与现有的工具不同,新一代代码助手能够为开发者进行代码原型设计、测试和调试。这意味着开发者可以将更多精力投入到代码审查和修正,而不是从头开始编写代码。
更重要的是,许多生成式代码助手开发者认为,它们可能是通向通用人工智能(AGI)的快速通道。AGI 是一种假设的超人类技术,许多顶尖公司都将其视为目标。
Poolside 的首席执行官兼联合创始人 Eiso Kant 表示,软件开发将成为第一个实现人类水平能力并带来巨大经济价值的领域。OpenAI 已经宣称其最新的 o3 模型在编码竞赛中击败了公司自己的首席科学家。
欢迎来到 AI 代码生成的第二波浪潮。
代码的正确性
软件工程师谈论两种类型的正确性。一种是程序语法(语法)的正确性,即所有单词、数字和数学运算符都处于正确的位置。这比自然语言中的语法正确性重要得多。在数千行代码中,只要一个微小的错误,整个程序就无法运行。
第一代代码助手在生成语法正确的代码方面已经相当出色。它们接受了数十亿行代码的训练,已经掌握了许多类型程序的表面结构。
但还有一种正确性,即程序功能的正确性:程序可以运行,但它是否真正做到了你想要它做的事情?新一代生成式代码助手正致力于实现这种更深层次的正确性,这将真正改变软件开发的方式。
Cosine 的联合创始人 Alistair Pullen 表示,大型语言模型可以编写可编译的代码,但它们并不总是能编写出你想要的程序。要做到这一点,你需要重新创建人类程序员在获得最终结果时所经历的思维过程。
问题在于,大多数代码助手接受训练的数据——从在线代码库中获取的数十亿行代码——并没有捕捉到这些思维过程。它代表的是最终产品,而不是制作过程。Kant 表示,代码很多,但这些数据并不代表软件开发。
Pullen、Kant 和其他人发现,要构建一个能够超越自动完成的模型——一个能够生成有用的程序、测试它们并修复错误的模型——你需要向它展示的不仅仅是代码。你需要向它展示代码是如何组合在一起的。
目标是构建能够模仿生成这种代码过程的模型,而不是仅仅模仿好的代码的外观——无论它是否有效。
面包屑
要做到这一点,你需要一个能够捕捉到这个过程的数据集——人类开发者在编写代码时可能采取的步骤。将这些步骤想象成机器可以遵循的用来生成类似代码的“面包屑”轨迹。
首先,你需要确定要从哪些材料中获取:哪些现有的代码库部分——以及任何其他信息来源——是特定编程任务所需要的?Zencoder 的创始人 Andrew Filev 表示,上下文至关重要。第一代工具在上下文方面做得非常糟糕,它们基本上只查看你的打开标签。但你的代码库可能包含 5000 个文件,它们会错过大部分内容。
Zencoder 招募了一批搜索引擎专家,帮助它构建一个能够分析大型代码库并确定哪些内容相关、哪些内容无关的工具。Filev 表示,这种详细的上下文减少了幻觉,提高了大型语言模型生成的代码质量。他们称之为“代码库理解”。
Cosine 也认为上下文是关键。它正在收集所有可以找到的“面包屑”,并利用它们创建一种新的数据集。该公司要求数十名程序员记录他们在完成数百种不同编程任务时的操作。Pullen 表示,他们要求程序员记录下所有内容:为什么你打开那个文件?为什么你滚动到一半?为什么你关闭它?他们还要求程序员对完成的代码进行标注,标记需要其他代码或特定文档知识才能编写的部分。
然后,Cosine 将所有这些信息整合在一起,生成一个大型合成数据集,该数据集映射了程序员通常采取的步骤以及他们所依赖的信息来源,以生成完成的代码。他们使用这个数据集来训练模型,以便确定它可能需要遵循哪些“面包屑”轨迹来生成特定程序,以及如何遵循这些轨迹。
总部位于旧金山的 Poolside 也正在创建一个合成数据集,该数据集捕捉了编码过程,但它更多地依赖于一种称为 RLCE(从代码执行中进行强化学习)的技术。(Cosine 也使用这种技术,但程度较低。)
RLCE 与用于使 ChatGPT 等聊天机器人成为流畅对话者的技术类似,称为 RLHF(从人类反馈中进行强化学习)。在 RLHF 中,模型接受训练,以生成更接近人类测试者认为他们喜欢的文本。在 RLCE 中,模型接受训练,以生成更接近于运行(或执行)时应该执行其预期功能的代码。
玩转系统
Cosine 和 Poolside 都表示,它们受到了 DeepMind 在其游戏模型 AlphaZero 中采用的方法的启发。AlphaZero 被赋予了可以采取的步骤——游戏中的动作——然后被允许反复与自己对战,通过反复试验找出哪些动作序列是获胜的动作,哪些动作序列不是获胜的动作。
Poolside 的创始科学家 Pengming Wang 表示,他们让 AlphaZero 在每个可能的回合都探索动作,模拟尽可能多的游戏——这最终导致了它在 2016 年击败了韩国围棋大师李世石。在加入 Poolside 之前,Wang 在 Google DeepMind 工作,研究 AlphaZero 在棋盘游戏之外的应用,包括 FunSearch,一个经过训练可以解决高级数学问题的版本。
当这种 AlphaZero 方法应用于编码时,生成代码所涉及的步骤就变成了游戏中可用的动作,而正确的程序就变成了赢得这场游戏。模型被允许自己玩,它可以比人类更快地提高。“人类程序员一次尝试一次失败,”Kant 表示。“模型可以同时尝试 100 次。”
Cosine 和 Poolside 之间的一个关键区别在于,Cosine 使用了 OpenAI 提供的 GPT-4o 的自定义版本,这使得它能够在比基础模型所能处理的更大的数据集上进行训练,而 Poolside 则从头开始构建自己的大型语言模型。
Poolside 的 Kant 认为,从一开始就用代码训练模型会比调整现有的模型效果更好,现有的模型不仅吸收了数十亿行代码,还吸收了大部分互联网内容。“我完全可以接受我们的模型忘记蝴蝶的解剖结构,”他表示。
Cosine 声称,其名为 Genie 的生成式代码助手在 SWE-Bench 上排名第一,SWE-Bench 是一个用于测试代码模型的标准测试集。Poolside 仍在构建其模型,但声称其目前已经达到了 GitHub 的 Copilot 的性能水平。
Kant 表示,我个人坚信,大型语言模型最终将使我们拥有与软件开发人员一样的能力。
然而,并非所有人都认同这种观点。
非逻辑性的 LLM
Merly 的首席执行官兼创始人 Justin Gottschlich 认为,大型语言模型根本不适合这项工作。他以自己的狗为例:无论对我的狗进行多少训练,它都永远无法编写代码,这根本不可能。它可以做很多其他事情,但它就是没有这种深层次的认知能力。
Gottschlich 在代码生成领域工作了十多年,他对大型语言模型也有类似的看法。编程需要能够以坚定不移的精度解决逻辑难题。他表示,无论大型语言模型如何学习模仿人类程序员的行为,它们本质上仍然是统计上的老虎机:我无法训练一个非逻辑性的系统变得逻辑性。
Merly 并没有向其系统展示人类编写的代码,而是通过训练大型语言模型来生成代码,而是通过向其提供大量示例。Gottschlich 认为,要真正构建一个能够生成代码的模型,你需要在代码所代表的底层逻辑级别进行工作,而不是代码本身。因此,Merly 的系统接受了中间表示的训练——类似于大多数编程语言在运行之前被翻译成的机器可读符号。
Gottschlich 不会透露这到底是什么样子,以及这个过程是如何运作的。但他举了一个类比:数学中有一个概念,即唯一必须存在的数字是素数,因为你可以只使用素数来计算所有其他数字。他表示,将这个概念应用于代码。
这种方法不仅直接针对编程的逻辑,而且速度很快,因为数百万行代码在系统分析它们之前被简化为几千行中间语言。
转变思维方式
你对这些竞争方法的看法可能取决于你希望生成式代码助手是什么。
11 月,Cosine 禁止其工程师使用除其自身产品以外的任何工具。现在,它正在看到 Genie 对其自身工程师的影响,这些工程师经常发现自己正在观看该工具为他们生成代码。“你现在向模型提供你想要的结果,它会为你处理实现细节,”Cosine 的另一位联合创始人 Yang Li 表示。
Pullen 承认,这可能令人困惑,需要改变思维方式。他表示,我们的工程师同时执行多个任务,在窗口之间来回切换。当 Genie 在一个窗口中运行代码时,他们可能在另一个窗口中提示它做其他事情。
这些工具还使得能够同时对系统的多个版本进行原型设计。假设你正在开发一个需要内置支付系统的软件。你可以让代码助手同时尝试几种不同的选项——Stripe、Mango、Checkout——而不是必须手动逐个编写代码。
Genie 可以全天候修复错误。大多数软件团队使用错误报告工具,允许人们上传他们遇到的错误的描述。Genie 可以阅读这些描述并提出修复方案。然后,人类只需要在更新代码库之前审查这些方案。
Li 表示,没有一个人能够理解当今最大软件系统中数万亿行代码,随着越来越多的软件由其他软件编写,代码量只会越来越大。
这将使能够维护这些代码的代码助手变得至关重要。Li 表示,瓶颈将变成人类审查机器生成的代码的速度有多快。
Cosine 的工程师对此有何感想?至少根据 Pullen 的说法,他们感觉很好。他表示,如果你给我一个难题,你仍然会思考如何向模型描述这个问题。你不需要编写代码,而是需要用自然语言编写。但这个过程中仍然需要大量的思考,所以你并没有真正剥夺工程的乐趣。这种渴望仍然得到满足。
有些人可能比其他人适应得更快。Cosine 喜欢邀请潜在的雇员与他们的团队一起进行为期几天的编码。几个月前,它要求一位这样的候选人构建一个部件,让员工能够将他们正在开发的酷炫软件片段分享到社交媒体上。
这项任务并不简单,需要对 Cosine 数百万行代码的多个部分有深入的了解。但这位候选人在几个小时内就完成了任务。Li 表示,这位从未见过我们代码库的人星期一出现,星期二下午就发布了东西。我们以为这需要他一整周的时间。(他们雇佣了他。)
但还有另一个角度。许多公司将使用这项技术来减少他们雇佣的程序员数量。Li 认为,我们很快就会看到软件工程师的分层。在一端将是年薪百万的精英开发者,他们能够在 AI 出错时诊断问题。在另一端,由 10 到 20 人组成的较小的团队将完成曾经需要数百名程序员才能完成的工作。Li 表示,这将类似于自动柜员机改变银行业务的方式。
他表示,你想要做任何事情都将由计算能力而不是员工数量决定。我认为,普遍认为在你的组织中增加几千名工程师的时代已经结束了。
曲速引擎
事实上,对于 Gottschlich 来说,能够比人类更好地编写代码的机器将是必不可少的。对他来说,这是我们最终构建庞大而复杂的软件系统的唯一途径。与硅谷的许多人一样,他预计未来人类将移居其他星球。他表示,只有当我们让 AI 构建所需的软件时,这才能实现:Merly 的真正目标是让我们登上火星。
Gottschlich 更喜欢谈论“机器编程”,而不是“代码助手”,因为他认为这个词语以错误的方式构建了问题。他表示,我不认为这些系统应该辅助人类——我认为人类应该辅助它们。它们可以以 AI 的速度前进。为什么要限制它们的潜力?
Gottschlich 表示,有一部名为《摩登原始人》的动画片,他们有这些汽车,但只有当司机用脚踩踏板时它们才会移动。这就是我感觉大多数人如何使用 AI 来构建软件系统的方式。
他补充说,但 Merly 正在构建的本质上是宇宙飞船。他不是在开玩笑。他表示,我认为宇宙飞船不应该由骑自行车的宇航员提供动力。宇宙飞船应该由曲速引擎提供动力。
如果这听起来很疯狂——确实如此。但关于构建这项技术的人们认为最终目标是什么,有一个严肃的观点需要提出。
Gottschlich 的这种“星际大脑”的想法并非特例。尽管他们专注于开发者今天想要使用的产品,但这些公司中的大多数都将目光投向了更大的回报。访问 Cosine 的网站,该公司将自己介绍为“人类推理实验室”。它将编码视为迈向更通用模型的第一步,该模型能够在多个领域模仿人类的解决问题的能力。
Poolside 也有类似的目标:该公司明确表示,它正在构建 AGI。Kant 表示,代码是形式化推理的一种方式。
Wang 提到了代理。他表示,想象一个能够随时启动自己的软件来完成任何任务的系统。如果你能够让你的代理真正通过软件手段解决你想要的任何计算任务——这本质上就是 AGI 的表现。
在地球上,这样的系统仍然是一个梦想。与此同时,软件工程正在以前所未有的速度发生变化。
Cosine 的 Pullen 表示,我们还没有达到所有事情都由机器完成的阶段,但我们肯定正在摆脱传统的软件工程师角色。我们正在看到这种新工作流程的火花——成为未来软件工程师意味着什么。