在机器学习以及智能化的潮流下,如果智能化与前端相结合,能否产生一些化学反应,指导我们发现一些新的方向呢?
我们是阿里云大数据团队,我们在代码智能方向进行了深入探索。在2020年开年,这个注定不会平凡的日子,我们发布了第一款前端方向智能化产品-- Sophon代码智能提示插件,我们希望在这款智能插件的帮助下,前端开发者们能够“键”步如飞,再也不用担心写不完代码。
功能展示
让我们看看有哪些炫酷的功能吧。
- 推荐如丝般顺滑
- 具备实时学习的能力,实现个性化推荐
- 内置了多个常用的前端代码片段
看到这么多实用且智能的功能,是不是有点心动呢?
关于代码安全
到这里,有用户可能会担心代码安全的问题,我想说完全不用担心,因为我们是以本地化的方式提供服务的,即我们的推荐模型是部署在用户本地的,完全不需要远程通信。我们承诺,我们不会上传任何用户的代码和隐私。
Sophon智能插件的前世今生
如此好用的神器, 是不是很好奇它的推荐是怎样产生的呢?请听我慢慢道来。
我们最初调研发现VsCode自带的智能提示是由各种语言的Language Server提供的,而TypeScript(JavaScript)语言自带的智能提示仅限于关键字或基于语法的提示,如在tsx文件中this.会提示出当前可用的类属性、方法等,作为前端开发者,我们认为这些是远远不够的。我们希望在任何位置、基于任何输入都可以进行产生提示,让开发者不断档的持续输入下去。
为了实现这个目标,我们开始了我们自己的VsCode插件的研发。
开发一个代码提示的插件,并不难,参考官方Demo几分钟就可以搞定。难的是如何能够理解用户的需求,之后向用户推荐有效、正确的代码。
我们调研了很多,最初我们尝试了基于GPT-2的自然语言生成算法进行训练和推荐,发现它可以产生大篇幅的推荐,但是推荐的准确率却不高,我们总结的原因有以下几个:
- 训练集不够多,模型未能完全学习到前端代码的“模式”,所以无法准确推荐;
- 每个人写代码有自己的风格,并且不会写完全一模一样的代码,导致训练难度增高;
- 我认为最重要一点是:机器对于写代码前的每个需求都是未知的,它无法准确感知到具体需求是什么,所以无法推荐出符合预期的代码。
所以,我想,如果有机器能够理解的“需求”,然后基于此进行大量针对性的训练,自然语言生成也不失为一个好的方案。
之后,我们尝试了概率统计算法,发现此方案在准确性、响应速度上完全满足我们的需求,所以我们此种算法为基础,实现了我们的推荐模型。
算法的选取思路
我们认为 “代码”可以被视为一种高度结构化的自然语言,所以可以应用NLP的相关技术优化。以下是通常比较常用的算法。
• Text Classification(文本分类)
把最终提示的内容作为分类种类,把输入文本的上文都当作文本,进行文本分类的训练。
优点:方案简单,所选择的算法较多
缺点:类别较多(每种可提示的内容都是一种类别),训练的准确率不高
• 自然语言生成(NLG)
把需要提示的内容作为需要生成的内容,把输入文本的上文当作训练数据,每次都进行生成。
优点:可以大规模应用训练数据,可扩展性强。
缺点:可能会生成不符合语法的结果,并且要产生可信度高的推荐,需要大量的训练集
• Markov概率模型
通过n-gram进行切词,切完之后,通过Markov算法构建概率模型,
优点:训练速度快,模型可解释性强
缺点:对于复杂语法的上下文记忆能力弱。
在综合对比之后,我们采用了Markov概率模型的方案,构建概率模型。
在离线训练中, 需要提前准备大量的代码片段,此处我们选择了github上优秀的开源代码进行了预训练,来构建n-gram概率模型。在比较了不同的方案之后我们选取了n=4,同时通过对训练数据拼写的训练建立了大量的词表,实现了在变量命名等范代码推荐领域也可以进行推荐。
以下是我们整体推荐的大致流程图
至此,基于概率模型而又非常好用的智能插件就诞生了。
关于Sophon
Sophon, 即智子,取自优秀科幻小说《三体》,在书中,智子拥有高度的人工智能以及领先人类的科学技术。我们希望借用她来表达我们对代码智能方向的探索和追求。
目前,我们的Sophon智能插件已经在VsCode插件市场上线了,欢迎大家下载使用、拍砖。
我们致力于前端代码智能化,欢迎一起交流。