前端代码智能化初探

在机器学习以及智能化的潮流下,如果智能化与前端相结合,能否产生一些化学反应,指导我们发现一些新的方向呢?

我们是阿里云大数据团队,我们在代码智能方向进行了深入探索。在2020年开年,这个注定不会平凡的日子,我们发布了第一款前端方向智能化产品-- Sophon代码智能提示插件,我们希望在这款智能插件的帮助下,前端开发者们能够“键”步如飞,再也不用担心写不完代码。

功能展示

让我们看看有哪些炫酷的功能吧。

  1. 推荐如丝般顺滑前端代码智能化初探
  2. 具备实时学习的能力,实现个性化推荐前端代码智能化初探
  3. 内置了多个常用的前端代码片段前端代码智能化初探

看到这么多实用且智能的功能,是不是有点心动呢?

关于代码安全

到这里,有用户可能会担心代码安全的问题,我想说完全不用担心,因为我们是以本地化的方式提供服务的,即我们的推荐模型是部署在用户本地的,完全不需要远程通信。我们承诺,我们不会上传任何用户的代码和隐私

Sophon智能插件的前世今生

如此好用的神器, 是不是很好奇它的推荐是怎样产生的呢?请听我慢慢道来。

我们最初调研发现VsCode自带的智能提示是由各种语言的Language Server提供的,而TypeScript(JavaScript)语言自带的智能提示仅限于关键字或基于语法的提示,如在tsx文件中this.会提示出当前可用的类属性、方法等,作为前端开发者,我们认为这些是远远不够的。我们希望在任何位置、基于任何输入都可以进行产生提示,让开发者不断档的持续输入下去

为了实现这个目标,我们开始了我们自己的VsCode插件的研发。

开发一个代码提示的插件,并不难,参考官方Demo几分钟就可以搞定。难的是如何能够理解用户的需求,之后向用户推荐有效、正确的代码。

我们调研了很多,最初我们尝试了基于GPT-2的自然语言生成算法进行训练和推荐,发现它可以产生大篇幅的推荐,但是推荐的准确率却不高,我们总结的原因有以下几个:

  1. 训练集不够多,模型未能完全学习到前端代码的“模式”,所以无法准确推荐;
  2. 每个人写代码有自己的风格,并且不会写完全一模一样的代码,导致训练难度增高;
  3. 我认为最重要一点是:机器对于写代码前的每个需求都是未知的,它无法准确感知到具体需求是什么,所以无法推荐出符合预期的代码。

所以,我想,如果有机器能够理解的“需求”,然后基于此进行大量针对性的训练,自然语言生成也不失为一个好的方案。

之后,我们尝试了概率统计算法,发现此方案在准确性、响应速度上完全满足我们的需求,所以我们此种算法为基础,实现了我们的推荐模型。

算法的选取思路

我们认为 “代码”可以被视为一种高度结构化的自然语言,所以可以应用NLP的相关技术优化。以下是通常比较常用的算法。

Text Classification(文本分类)

把最终提示的内容作为分类种类,把输入文本的上文都当作文本,进行文本分类的训练。
优点:方案简单,所选择的算法较多
缺点:类别较多(每种可提示的内容都是一种类别),训练的准确率不高

自然语言生成(NLG)

把需要提示的内容作为需要生成的内容,把输入文本的上文当作训练数据,每次都进行生成。
优点:可以大规模应用训练数据,可扩展性强。
缺点:可能会生成不符合语法的结果,并且要产生可信度高的推荐,需要大量的训练集

Markov概率模型

通过n-gram进行切词,切完之后,通过Markov算法构建概率模型,
优点:训练速度快,模型可解释性强
缺点:对于复杂语法的上下文记忆能力弱。

在综合对比之后,我们采用了Markov概率模型的方案,构建概率模型。

在离线训练中, 需要提前准备大量的代码片段,此处我们选择了github上优秀的开源代码进行了预训练,来构建n-gram概率模型。在比较了不同的方案之后我们选取了n=4,同时通过对训练数据拼写的训练建立了大量的词表,实现了在变量命名等范代码推荐领域也可以进行推荐。

以下是我们整体推荐的大致流程图
前端代码智能化初探

至此,基于概率模型而又非常好用的智能插件就诞生了。

关于Sophon

Sophon, 即智子,取自优秀科幻小说《三体》,在书中,智子拥有高度的人工智能以及领先人类的科学技术。我们希望借用她来表达我们对代码智能方向的探索和追求。

目前,我们的Sophon智能插件已经在VsCode插件市场上线了,欢迎大家下载使用、拍砖。

前端代码智能化初探


我们致力于前端代码智能化,欢迎一起交流。

上一篇:前端代码是怎样智能生成的-字段绑定篇


下一篇:还想打马赛克掩盖身份?人工智能让你告别打码时代