代码补全漫谈(1) - 从TabNine说起

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: # 代码补全漫谈(1) - 从TabNine说起 前不久,基于GPT-2模型的TabNine横空出世,在程序员界再次引起轰动。此前,国产的aixcoder,还有获得github ceo天使投资的Python编程利器kite等,已经收获了一轮又一轮的眼球。人工智能代替人编写代码的忧虑不时在知乎等网站上出现。 从程序语言处理的近亲 - 自然语言处理NLP的发展来看,这样的乐观不是没有道理的。从

代码补全漫谈(1) - 从TabNine说起

前不久,基于GPT-2模型的TabNine横空出世,在程序员界再次引起轰动。此前,国产的aixcoder,还有获得github ceo天使投资的Python编程利器kite等,已经收获了一轮又一轮的眼球。人工智能代替人编写代码的忧虑不时在知乎等网站上出现。
从程序语言处理的近亲 - 自然语言处理NLP的发展来看,这样的乐观不是没有道理的。从进入深度学习时代后,基于RNN的NLP技术不断发展进步,比如Attention机制引入RNN,到仅需要Attention的Transformer模型,到GPT, BERT, XLNet等预训练模型不断刷榜,借鉴NLP的经验,程序语言处理没有道理不取得大进步。TabNine的成功,也是对这种想法的印证。

但是,与外表的光鲜不同,程序语言处理学界却是处于纠结之中。NLP界的论文题目是这样的《Attention is all you need》,而程序语言的论文是这样的《Are Deep Nerual Networks the Best Choice for Modeling Source Code?》

Are Deep Neural Networks the Best Choice for Modeling Source Code?

就在这篇《Are Deep Neural Networks the Best Choice for Modeling Source Code?》中,作者Vincent J. Hellendoorn和Premkumar Devanbu认为,在程序语言处理方面,早日封神的深度神经网络的效果还不如基于传统统计方法的效果。
究其原因,他们提出三点:
第一,开发人员特别能造新词。这也没办法,变量名是造新词,函数名是造新词,面向对象设计方法就是造新词的助推器。这与自然语言完全不同,只有学术作品里才充满了术语,大部分人正常交流的词汇表非常有限,而且更新很慢。因为新词造出来没有用,得流行起来才有用,这个门槛可不低。而开发人员造词太容易了。但是,词造太多了,其实对人来说也同样是挑战,比如接手别人的代码,或者使用别人发明的API,都是令人头疼的事。
第二,开发人员造的新词局部性很强,出了一定范围重名很正常,然后每个人的风格还不一样。这也是自然语言中非常少见的情况,但是在写代码太正常了,新词有作用域,跨文件,跨模块都不一样。这是为了避免全局变量重名的一个重要手段,比如每个类中可以有局部变量,公有变量可以通过不同的类来区分,类重名可以用包来区分,如果包名加类名都一样,还可以加个容器来隔离各用各的。这样的要求,确实难为神经网络了。
第三,造词数量不但多,如果一次性批量造出来可以做训练也可以,但是随着代码编写,这是一个动态的过程。代码还可能错了重新修改。这样对于计算的实时性要求很高。这导致了基于大型NLP模型的改进算法,基本上没有能在程序员本机上运行的,都需要远程服务器的支持。

听起来是不是很有道理?确实是有道理的,我们将来介绍更多的背景知识后大家就会觉得更有道理。于是,两位作者提出了自己的解决方案,细节我们后面再讲,代码在这里:https://github.com/SLP-Team/SLP-Core
以上的三个问题,我们总结一下给它起个名字,OOV(Out Of Vocabulary)问题.

Maybe Deep Neural Networks are the Best Choice for Modeling Source Code

不过,硬币总是有两面的。《Are Deep Neural Networks the Best Choice for Modeling Source Code?》发表于2017年,2年后,隔空应答的论文《Maybe Deep Neural Networks are the Best Choice for Modeling Source Code》发表了。
该文作者Rafael-Michael Karampatsis和Charles Sutton承认OOV是个问题。不过他们认为,对于罕见词的处理也是机器翻译中的老问题了,2015年的论文《Neural Machine Translation of Rare Words with Subword Units》已经开始讨论采用subword的办法来解决这样的问题。

于是,Karampatsis和Sutton实现了一套基于开放词典的神经网络系统,有兴趣的同学可以关注下他们的代码实现:https://github.com/mast-group/OpenVocabCodeNLM

为了详细说明程序语言处理中遇到的问题和前人的解法,我们还是回到故事的起点,从代码的自然性说起。

代码的自然性

如果同学们对于源代码处理的技术想有一个整体的概念的话,不妨可以先读一篇综述论文:《A Survey of Machine Learning for Big Code and Naturalness
)》。
所谓的"Big Code",论文中原文是这么讲的『The scale of available data is massive: billions of tokens of code and millions of instances of meta-data, such as changes, bug-fixes, and code reviews (“big code”).』,也就是说,元数据,如代码修改的记录,bug修复的记录,代码评审的记录等等。

而Naturalness自然性,我们需要看另一篇论文《On the naturalness of software》。
这篇文章的主旨是说,虽然语言可以千变万化,但是落实到日常生活中,由于认知的限制和实际的需要,我们日常交流所有的语言是重复性的,有规律的,可预测的。这个统计上的结果,导致了统计机器学习方法在语音识别、机器翻译等领域的巨大成功。于是这篇论文的作者们假设程序代码也是自然的,因为它们也是人类在工作中创建的,受到硬件的软件的各方面的限制,它们也应该是有其统计规律的。
作者们研究的成果是非常正面的,他们证明,代码不但是有自然性的,而且比自然语言的自然性还要好。为此,他们实现了一套基于统计方法的代码补全系统,并成功应用于eclipse IDE中。

从那时起,各种对编程语言模型的研究百发齐放,如2013年Allamanis和Sutton的《Mining Source Code Repositories at Massive Scale Using Language Modeling》,2013年Nguyen的《A Statistical Semantic Language Model for Source Code》,2014年Tu, Su和Devanbu的《On the localness of software》,2016年Bielik等人的《PHOG: Probabilistic Model for Code》,Dam等人的《A deep language model for software code》等。

有了理论之后,大家迅速将其应用于解决自己手头的问题:
比如2014年《Code Completion with Statistical Language Models》用于代码提示与补全;
2014年的《Learning Natural Coding Conventions》和2015年的《Predicting Program Properties from "Big Code"》用于提升代码可读性;
2016年的《On the "Naturalness" of Buggy Code》用于bug修复;
2015年的《Suggesting Accurate Method and Class Names》用于推荐方法名和类名;
2016年的《A Convolutional Attention Network for Extreme Summarization of Source Code》和《Summarizing Source Code using a Neural Attention Model》用于源代码总结;
2018年的《DeepBugs: A Learning Approach to Name-based Bug Detection》用于预测bug;
2016年的《Deep Learning Code Fragments for Code Clone Detection》用于查找代码克隆;
2018年的《Deep Code Comment Generation》用于自动为代码生成注释;
2015年的《DeepFix: A Fully Convolutional Neural Network for predicting Human Eye Fixations》用于语法错误修复;
2018年提《A Deep Learning-Based Approach to Infer Natural Variable Names from Usage Contexts》用于反混淆;等等

正在看起来岁月静好的时候,Vincent J. Hellendoorn和Premkumar Devanbu发表了《Are Deep Neural Networks the Best Choice for Modeling Source Code?》,认为OOV问题导致深度学习处理程序语言的效果还不如传统机器学习方法。

P. Devanbu是加州大学戴维斯分校的老师。他参与了上面介绍的多篇论文的发表,如《On the "Naturalness" of software》《On the Localness of Software》《On the "Naturalness" of Buggy Code》《A Survey of Machine Learning for Big Code and Naturalness》。

Vincent Hellondoorn是Devandu老师的博士生。他今年的另外两篇论文《Deep Learning Type Inference》和《When Code Completion Fails: a Case Study on Real-World Completions》也是我们这一系列文章的主角。

目录
相关文章
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
139020 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16419 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1251 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3395 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
912 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1918 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
12天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。

热门文章

最新文章