效率工具 | 一款基于深度学习的代码自动补全神器

原文转载自 「Lee先森的技术站」 (https://zhuanlan.zhihu.com/p/92128647)

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)

个人主页>>

前言

代码补全对于大多数开发人员来说是至关重要的,它可以有效的提高开发效率、减少拼写错误和输入代码量。我们使用的大多数开发工具都自带补全功能,或者可以通过安装插件具备补全功能。但是,以往的代码补全功能主要基于语言本身的内置函数和上下文信息进行补全,而在候选项重要程度、代码块补全方面却不理想。与其说我们常用的自动补全工具的价值在补全方面,我更倾向于认为它的价值体现在提示

近几年随着深度学习的抬头、火热,深度神经网络在学术领域有着很多最为先进的算法,并且在很多商业领域都得到应用。因此,有想法的研究者也尝试把深度学习引入开发工具中。

在之前的一篇文章中,我介绍了一款人工智能自动补全工具Kite,它在自动补全效率、文档阅读等方面的确要优于绝大多数自动补全工具,而且配置简单。本文将介绍另外一款基于深度学习的自动补全工具--TabNine,虽然同是基于人工智能的开发工具,但是它们却有各自的侧重点。下面我就先介绍一下Kite与TabNine的区别,然后详细介绍一下TabNine的特点,各位根据自己的偏好选择其中一款进行配置。

Kite与TabNine

Kite与TabNine都是优秀的、基于人工智能的代码自动补全工具,相对于大多数自动补全插件,它都能让人感到非常惊艳,但是二者都有各自的侧重点,下面就来说一下Kite与TabNine各自的优点和缺点。

Kite

Kite更加倚重于预先存在的知识库,它是在预先存在的知识库上进行学习得到的补全经验,因此,不需要在开发过程中训练和学习,因此,它具备如下优点:

  • 补全速度快
  • 代码块补全功能强大
  • 简洁强大的文档阅读功能

代码块补全功能强大为例,来说一下Kite的特点,对于大多数补全工具,包括TabNine在内,主要是补全接下来要输入的字符串,而Kite不仅可以补全字符串,还可以补全代码库。举个例子,我们要导入numpy模块,对于大多数补全工具,我们输入numpy的几个字母后,它会联想出完整的numpy,但是对于Kite,当输入import num,它会根据知识库中大多数使用者的习惯直接补全import numpy as np。同样,当我们导入matplotlibpyplot时,当我们输入from matplotlib,它会补全from matplotlib import pyplot as plt,这样显然更加高效,节省代码量。

没有哪个工具是完美无暇的,Kite也有缺点,我认为Kite是非常优秀的,甚至Python之父都对它赞不绝口,但是它也有3个缺点让我有点无法忍受,

  • 方案偏“重”
  • 支持语言单一
  • 占用资源

首先说一下第一点,方案偏“重”。

对于大多数补全工具,它们只是一个插件,比较轻量化,而Kite相对较重,需要预先下载、安装一个200M+的软件,除了在电脑上安装Kite之外,还需要在对应的编辑器/IDE安全Kite的插件,另外,每次使用Kite自动补全之前需要把Kite打开。所以,这一系列的配置、使用过程相对较“重”。

其次说一下支持语言单一,Kite定位是一款Python自动补全工具,因此在很多特色方面都是针对Python进行优化,因此,支持语言相对单一。

最后说一下占用资源,虽然Kite内存占用情况远远比不上Pycharm、IDEA这些臃肿的开发工具,但是在win10下也要占用将近400M的内存资源,对于大多数工具相对较高,如果电脑配置偏低,打开Kite会使得系统较为卡顿。

TabNine

和Kite不同,首先,TabNine是基于开发者过去的使用习惯进行补全,而不是预先的知识库,因此,当项目较小或者正在向其中添加新库时,它的效果不如Kite。当然,这是二者思想上的差异,TabNine之所以成功,自然有它的优点,

  • 轻量化
  • 配置简单
  • 支持语言丰富
  • 能够给出补全项的概率和地址

给出补全项的概率和地址为例来说明一下TabNine的优点,TabNine在自动补全时会给出每个候选项的概率,并且按照概率大小进行排序,此外,会给出候选项的来源及地址,这样更加方便查询和阅读。

另外,Kite在语言支持方面更加具有针对性,主要针对Python的自动补全,而TabNine支持的编程语言更加丰富,而不是针对某一特定语言。

TabNine的缺点也非常明显,

  • 补全速度慢
  • 依赖语言服务

首先说一下补全速度慢,TabNine在使用过程中需要大量的计算资源进行学习,因此它会带来高延迟。因此TabNine在专业版和企业版中提供了TabNine Cloud服务,提供GPU计算资源,当然,这都是需要付费的。

其次说一下依赖语言引擎,TabNine默认情况是关闭语义补全的,如果要开启语义补全需要安装不同编程语言对应的服务,例如Python需要安装python-language-server,每一种编程语言都需要配置对应的服务,可以选择繁琐的手动配置,针对这一点TabNine也提供了较好的解决方案,在编辑器中输入TabNine::sem,它会自动开启语义补全在开启过程中会按照对应语言的服务。

TabNine

前面概括性的介绍了一下TabNine与Kite各自的优缺点,这里我就详细的介绍一下TabNine强大之处与原理。

优势

前面已经简单的介绍了TabNine的优点,

  • 轻量化
  • 配置简单
  • 支持语言丰富
  • 能够给出补全项的概率和地址

这些非量化的评价指标不够直观,从另外一个可量化的指标来说一下TabNine的强大之处,

  • 支持22种编程语言
  • 支持7类编辑器

支持的编程语言

TabNine支持Python, JavaScript, Java, C++, C, PHP, Go, C#, Ruby, Objective-C, Rust, Swift, TypeScript, Haskell, OCaml, Scala, Kotlin, Perl, SQL, HTML, CSS和Bash这22种编程语言。

Python

https://www.zhihu.com/video/1179089093073551360

Java

https://www.zhihu.com/video/1179089123893280768

C++

https://www.zhihu.com/video/1179089157882974208

Haskell

https://www.zhihu.com/video/1179089314137542656

支持的编辑器

首先要注意,我前面所说的是7类编辑器,而不是7款,它支持vs code、IntelliJ、Sublime、Vim、Emacs、Atom、Jupyter Notebook共7类编辑器。

其中IntelliJ是一个系列,其中包括IDEA、Pycharm、Android Studio等。

Vim包括Vim(Deopleto)、Vim(Coc)。

原理

TabNine是基于OpenAI的GPT-2模型,在GitHub上200万个文件上进行训练得出,它的训练目标是通过之前给出的标记预测接下来的标记(token),为了实现这个目标,它学习了复杂的行为,例如动态类型语言的推断。

然后说一下GPT-2模型,它是一个在自然语言领域名气不亚于BERT的网络模型,它使用了Transformer网络作为基础,这个模型最初是用于解决自然语言处理问题(NLP),尽管纯粹的自然语言和代码补全有很多不同之处,但是自然语言和代码补全在语义上还是有一些可借鉴的地方,例如对于英语的理解。TabNine就利用这一点用于代码补全中函数名、参数、返回类型等方面的推断。

TabNine配置

TabNine配置相对于Kite较为简单,只需要在简单的几步即可以完成。需要再重复一遍的是,TabNine默认是不开启语言补全的,如果要开启语义补全需要安装配置对应语言的服务、引擎,当然,这对于TabNine也很简单,只需要在编辑器输入TabNine::sem即可,TabNine支持vs code、IntelliJ、Sublime、Vim、Emacs、Atom、Jupyter Notebook共7类编辑器,我在这里就挑选几个使用较多的编辑器/IDE讲解一下。

vs code

方式一:手动安装

  1. 打开vs code
  2. 点击插件管理
  3. 搜索tabnine
  4. 点击安装

这种方式比较简洁明了,首推这一种方法。

方式2:命令安装

  1. 打开vs code
  2. 快捷键Ctrl+P
  3. 输入ext install TabNine.tabnine-vscode
  4. 确认

IntelliJ Platform

  1. 打开设置
  2. 找到Plugins
  3. 在marketplace搜索TabNine安装

Sublime Text

  1. 快捷键Ctrl+Shift+P
  2. 输入Install Package
  3. 选择Package Control:Install Package
  4. 搜索TabNine确认

Vim

方式一:Vundle

  1. 首选需要配置插件管理器Vundle
  2. .vimrc中添加Plugin 'zxqfl/tabnine-vim'
  3. 随便打开一个vim,输入:PluginInstall

方式二:Git

  1. 克隆项目git clone --depth 1 https://github.com/zxqfl/tabnine-vim
  2. set rtp+=~/tabnine-vim添加到.vimrc(~/tabnine-vim是克隆到本地的路径,需要根据自己的路径修改)

TabNine命令配置

就如同前面提到的,如果没有开启语义补全,需要在编辑器中输入命令开启语义补全,TabNine支持一些命令配置方式,主要有如下几个,

  1. TabNine::sem开启语义补全
  2. TabNine::no_sem关闭语义补全
  3. TabNine::config打开配置页面
  4. TabNine::version查看版本信息

福利

我在公众号分享了Python、机器学习、计算机视觉、强化学习等领域相关的学习资源、电子文档。此外,还整理了一些高效的实用工具,如果需要可以关注公众号【平凡而诗意】,回复相应关键字获取~

作品精选

Jackpop:目录 | 精选CV、Python等系列教程

Jackpop:大数据处理 | Spark&HDFS集群配置及基本使用

Jackpop:实用工具 | 推荐3款令人惊艳的截图工具

Jackpop:强烈推荐 | 这将会成为一个优质的github项目

Jackpop:计算机小白如何开始机器学习的学习,有入门课程推荐吗?

Jackpop:C盘快满了,该如何清理?

Jackpop:2019 年双十一有哪些值得购买的东西?

more_vert