让AI替代50%的工作 ——1. AI辅助编程基础

让AI替代50%的工作 ——1. AI辅助编程基础


chinese AI

本文以及本专栏正在参加豆包 Marscode 专栏征文活动,如何喜欢欢迎投票支持,这将对我们意义非凡
投票链接

在我们正式开始 AI 辅助编程的旅程之前,先来聊一聊总体性的观察和思考。

我们将讨论AI 辅助编程的现状,了解它在哪些问题上具有优势,在哪些问题面前束手无策,从而在当前 AI 不足以完全取代程序员的场景下,充分利用其优势,提高生产效率,提升工作产出。

AI 辅助编程的原理是什么?

市面上有诸多 AI 编程工具,LLM、Transformer、微调、训练、模型、数据、GPU…… 其底层一般是针对代码场景进行微调的大模型。

因为大模型正在风口之上,大家时刻被各种 AI 相关的名词轰炸。但根据我实践总结的经验,对于 AI 的使用者和 AI 应用层产品的开发者来说,并不需要深入了解其原理的细节和数学公式,仅了解其本质即可。因此,这里先用简单直白的语言,让大家对大模型的原理有一个粗略的理解。

模型是什么?

如果打个不恰当的比方,大模型就是一个基于概率的模型。想象一下你在写一篇文章,每次你想写下一个词时,会根据前面已经写的内容来预测下一个最合适的词。例如,如果你写了“今天的天气真”,接下来的词很可能是“好”或者“糟糕”,因为这两个词在这个上下文中出现的概率较高。如果前面的内容多涉及下雨和刮风,那么下一个词是“糟糕”的可能性就更大。大模型就会预测下一个词是“糟糕”,最终生成“今天的天气真糟糕”这句话。

大模型就是通过类似的方式,基于前文的内容,预测下一个最可能的词或代码。

模型训练是什么?

模型训练就是通过海量的人类数据,让模型学会人类文字表达中的概率信息。在上面的例子中,如果模型在训练过程中接触到了大量包含“天气真好”或“天气真糟糕”的句子,它就能学会在不同的上下文中选择合适的词语。

具体来说,模型训练包括以下几个步骤:

  1. 数据收集:收集大量的文本或代码数据,这些数据可以来自书籍、文章、代码库等多种来源。
  2. 数据预处理:对收集到的数据进行清洗和整理,确保数据的质量和一致性。
  3. 模型训练:利用高性能的计算资源(如 GPU),通过复杂的算法(如梯度下降)调整模型内部的参数,使其能够更准确地预测下一个词或代码片段,从而实现更接近人类语言的表达效果。

通过这样的训练过程,模型逐渐掌握了语言或编程语言中的各种模式和规则,从而在遇到新的任务时,生成符合上下文和语法的内容。

大模型是什么?

我们对模型有了基本认识,那么大模型又是什么呢?
LLM(Large Language Model)即大型语言模型。在前面描述的模型原理中,人们发现模型只能在部分场景下展现出出色的补全能力,无法发挥更高级别的价值。而 LLM 正是在模型的各个维度进行扩大,如更大的数据集、更大的模型参数量等。在“大力出奇迹”的思路下,大模型竟然展现出相当的智能程度,因此我们称其为“涌现的智能”。也就是说,我们并不知道为什么会有智能,也不知道其产生智能的完整原理,只是当数据和模型达到一定规模后,它表现出了类似智能的表象。

这里有一个哲学的思想实验很适合帮助大家理解大模型的“涌现的智能”,这个思维实验叫做——“中文房间”:

一个只说英语、对中文一窍不通的人被关在一间只有一个开口的封闭房间中。房间里有一本用英文写成的手册,指示该如何处理收到的中文信息及如何用中文作出相应回复。房外的人不断向房间内递进用中文写成的问题,房内的人便按照手册的说明,查找合适的指示,将相应的中文字符组合、形成答案,并将答案递出房间。 如果房内的人查询手册的速度飞快,手册涉及中文的所有应用情形,那么对于房间外的人来说,是否可以认为这个房间里的人懂中文?

当然,这是一个没有答案的哲学思维实验,但大模型与其十分类似。大模型基于概率原理,依靠巨大的模型规模和训练数据,展现出智能的表象。

Fine-tune(微调)是什么?

微调是指在一个已经预训练的大模型基础上,针对特定任务或领域进行进一步训练。例如,一个通用的语言模型可以通过微调,变成专门用于代码生成或特定编程语言的辅助编程。

Fine-tune 的核心在于,人们发现针对某个特殊场景(如编程),应用在巨大通用数据集上训练的模型,再针对新的较小的数据集(如编程语言数据集,肯定小于人类通识)进行二次训练(Fine-tune),其表现出的智能效果更好,明显优于仅在较小数据集上训练的小模型。这种方法不仅节省了训练时间,还能显著提升模型在特定任务上的表现。 目前大多数代码辅助编程工具,都是基于通用大模型,使用大量的代码训练数据微调而成。

这个发现意味着,无论是人类通识还是编程语言,对模型来说,都具有某种隐含且相似的逻辑。
虽然听起来有些玄妙,但我认为对于 Fine-tune,大家了解其思想和原理即可。

因此,如果用一句话粗略地总结大模型:
它是一个基于概率和海量数据训练的模型,能够在部分任务中表现出近似甚至超越人类的智能,但这只是“涌现的智能”,而不是真正的智能。

我们应该如何应用 AI 进行辅助编程

诸如 MarsCode 等 AI 编程模型,是在海量人类代码之上训练而来,其底层如上文所述,依旧是基于概率的模型。那么我们来分析其在编码场景下的优势和劣势。

优势

  1. 见多识广:由于经历了大量数据集的训练,它在多数领域都达到了入门级及以上的能力。
  2. 劳动力廉价,阅读和理解速度快:相比我们费力的思考,大模型进行思考和反馈的速度相当快。
  3. 学习和应用速度快:上下文窗口足够大,我们可以把新技术的文档整个塞进去让其进行思考,生成新技术的代码。

劣势

  1. 不具备真正的智能:这点一定要时刻铭记,它本质上是一个更好用的辅助工具,并不具备真正的智能。
  2. 不与时俱进:一个比较经典的错误是,如果让它用 JavaScript 写一个日期转换功能,它可能会使用 Moment.js,这是一个过时、在任何场景下都不再值得使用的库。因为 AI 的训练数据包含了来自多个时代的数据,但它并不能区分哪些是最优的方案。
  3. 无法处理跨文件的任务:虽然越来越多的 AI 辅助编程助手都在增强其跨文件和架构的上下文,但受限于AI的上下文窗口大小的限制,依旧无法达到人类水平。

从原理视角分析了大模型的优劣势后,我想分享我在当下时代使用大模型的几点基础“原则”:

  1. AI 不是银弹:并不能在一瞬间解决 50% 的工作,而是将原本 50% 的工作时间替换成了约 10% 的提示/对话时间。
  2. AI 生成的结果可能存在错误:特别是在大型项目中,由于它不了解整体架构,出错的可能性更大,一定要认真审查其产出的代码。
  3. 明确 AI 的辅助定位:它是一个辅助角色。从现在起,程序员需要从“如何做这件事”转变为“如何引导 AI 去做这件事”。
  4. 分析任务,合理分工:将日常 100% 的工作进行分析,思考哪些事情是 AI 擅长的,哪些是人类擅长的,从而最大程度利用 AI 做更多的事,提高效率。
  5. 接受 AI 的不完美,善用其优势:大模型一直在进步,尤其这两年能力提升非常快,但仍是新兴技术。因此,要接纳现有模型的缺陷。如果遇到糟糕的体验,可以尝试换个提示方式或者换个应用场景。因为 AI 不是完美的,我们要做的是寻找其优势点并善于应用。