代码补全快餐教程(1) - 30行代码见证奇迹

简介: # 代码补全快餐教程(1) - 30行代码见证奇迹 下面是我用30多行代码,包含了很多空行和注释的代码写成的代码补全模型。我们先看看效果吧。 ## 补全效果案例 ### 先来看个比较普通的(Python, Keras) 已知: ``` y_train = keras.utils.to_categorical(y_train, num_classes)\ny_test =

代码补全快餐教程(1) - 30行代码见证奇迹

下面是我用30多行代码,包含了很多空行和注释的代码写成的代码补全模型。我们先看看效果吧。

补全效果案例

先来看个比较普通的(Python, Keras)

已知:

y_train = keras.utils.to_categorical(y_train, num_classes)\ny_test = keras.`
补全之后是这样的:

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

算法能够知道把括号中的y_train换成y_test

### 再看一个把我感动哭了的(Typescript, vscode)

输入如下:

text = "let disposable_begin_buffer = vscode.commands.registerCommand('extension.littleemacs.beginningOfBuffer',nmove.beginningOfBuffer);nlet disposable_end_buffer = vscode.commands."

输出是这样的:

let disposable_begin_buffer = vscode.commands.registerCommand('extension.littleemacs.beginningOfBuffer',move.beginningOfBuffer);
let disposable_end_buffer = vscode.commands.registerCommand('extension.littleemacs.endendOfBuffer',move.endendOfBuffer);

请注间这其中的难度,变量定义中用的是begin,而extension和move中用的都是beginning,算法能将其换成endend而保持OfBuffer不变。

###  函数的补全(Java)

输入如下:

public class Issue {nprivate Long id;nprivate String filename;nprivate Long lineNum;nprivate String issueString;npublic Long getId() {


输出如下:

public class Issue {
private Long id;
private String filename;
private Long lineNum;
private String issueString;
public Long getId() { return id; }


对于IntellJ IDEA来说这不算什么,但是对于完全不懂Java语言的文本模型,隔着几行其它变量能把return id给补全出来还是很了不起的

### 能看懂循环(Java, Android)

题目取自Android源代码:final int N = a.getIndexCount();\nfor (int i = 0; i < N; i++) {\nint index = a.

补全结果如下:

final int N = a.getIndexCount();
for (int i = 0; i < N; i++) {
int attr = a.getAttribute(i);


从上下文看,鬼知道a是个啥类型,但是这个模型可以根据变量attr猜出来getAttribute。

话说我的attr想用a.getIndex获取怎么办?不用重新训练了,给模型写个例子就好了:

输入如下:

int attr = a.getIndex(i);nfor (int i = 0; i < N; i++) {nint attr = a.


补全的结果就是这样了:

int attr = a.getIndex(i);
for (int i = 0; i < N; i++) {
int attr = a.getIndex(i);


### 还会给变量名做加法!(Python, Keras)

输入如下:

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img)ntower_1 = Conv2D(

见证奇迹的时刻到了:

tower_1 = Conv2D(64, (1, 1), padding='same', activation='relu')(input_img) tower_2 = Conv2D(64

也就是补完tower_1之后,算法不过瘾开始命名了一个tower_2继续补!
这对卷积一写好多层太方便了有没有?

这个加法对于变量名管用,对于下标变量也有效。
我们再来看个例子:

x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols)

不管是用y_train还是x_test做补全时,shape后面的[0]就会被加1变成[1],在这里是不适用的,补完了需要手工补一下。

### 多语言支持 (common lisp)

为了证明不是针对Java和Python做的特殊优化,我们来个lisp的例子看下:

text = '(progn (setq a (func1 0)) (setq b'

输出如下:

(progn (setq a (func1 0)) (setq b (func2 0)) (setq c (func3 0)) (setq d (func4 0))

不但知道func1加1变func2,setq的变量,也从b变成c,d以此类推。

## 30行代码创造奇迹

上面这样神奇的功能,我们借助最新的神经网络自然处理的工具,只有30多行代码就可以搞定:

import torch
from transformers import GPT2Tokenizer, GPT2LMHeadModel

加载词汇表

tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

输入待补全的文本

text = 'int idx = a.getIndex(i);nfor (int i = 0; i < N; i++) {nint attr = a.'
predicted_text = text

每一个只能补一个token出来,补一句话需要多次,30次是我拍脑袋的

for i in range(0,30):


# 以上次预测结果作为本次的输入,所谓的自回归
indexed_tokens = tokenizer.encode(predicted_text)

# 将读出的索引标记转化成PyTorch向量
tokens_tensor = torch.tensor([indexed_tokens])

# 加载模型中预训练好的权值
model = GPT2LMHeadModel.from_pretrained('gpt2')

# 设置为eval模式,这样就不会执行训练模式下的Dropout过程
model.eval()

# 使用GPU进行加速,诚实地讲速度不太快
tokens_tensor = tokens_tensor.to('cuda')
model.to('cuda')

# 进行推理
with torch.no_grad():
    outputs = model(tokens_tensor)
    predictions = outputs[0]

# 获取预测的下一个子词
predicted_index = torch.argmax(predictions[0, -1, :]).item()
# 解码成我们都读懂的文本
predicted_text = tokenizer.decode(indexed_tokens + [predicted_index])
# 打印输入结果
print(predicted_text)

## 用来自动写作

其实,上面所用的gpt-2模型,并不是给代码补全用的,用来自动写点的东西到时它的本业。

比如大家可以试试,给“To be or not to be"补全下,我的结果如下“To be or not to be, the only thing that matters is that you're a good person.”
再比如“I have a dream that one day”,我的结果如下“I have a dream that one day I will be able to live in a world where I can be a part of something bigger than myself.”

如果不想写代码的话,可以直接在[https://transformer.huggingface.co/doc/gpt2-large](https://transformer.huggingface.co/doc/gpt2-large)中去直接试验。
如下图所示,写代码写文字都可以:
![gpt2](https://ata2-img.cn-hangzhou.oss-pub.aliyun-inc.com/3976635f88dd26ef7b266c1430e60650.png)

## 安装环境

如果想试用上面的代码的话,只需要安装transformers库就好了。

pip install transformers


另外,transformers库依赖PyTorch或Tensorflow之一,我们上面的代码是基于PyTorch的,还需要安装一下PyTorch:

pip3 install torch torchvision

在Windows下安装命令稍有不同,需要指定版本号,例:

pip3 install torch===1.3.0 torchvision===0.4.1 -f https://download.pytorch.org/whl/torch_stable.html

目录
相关文章
|
2月前
|
程序员 Python
探索编程之旅:从代码到思考的蜕变
【8月更文挑战第33天】在数字世界的迷宫中,编程不仅仅是一种技能,它更是一扇打开思维新境界的大门。本篇文章将带你走进编程的世界,体验从简单代码到复杂逻辑的思考过程,以及这一旅程如何深刻影响我们的思维方式和解决问题的策略。通过具体案例和个人感悟,我们将一起探索编程背后的哲学和生活的启示。
|
21天前
|
数据采集 人工智能 测试技术
还在死磕AI咒语?北大-百川搞了个自动提示工程系统PAS
【10月更文挑战第4天】北京大学和百川智能研究人员开发了一种名为PAS的即插即用自动提示工程(APE)系统,利用高质量数据集训练的大型语言模型(LLMs),在基准测试中取得了显著成果,平均提升了6.09个百分点。PAS仅需9000个数据点即可实现顶尖性能,并能自主生成提示增强数据,提高了灵活性和效率。尽管存在训练数据质量和提示多样性等方面的潜在局限性,PAS仍为解决提示工程挑战提供了有前景的方法,有望提升LLM的可用性和有效性。论文详见:https://arxiv.org/abs/2407.06027。
37 3
|
3月前
|
算法 程序员 定位技术
探索代码世界的奇幻旅程
【8月更文挑战第30天】 在编程的世界里,每一个代码块都像是一块拼图,它们共同构建起一个庞大而复杂的数字宇宙。本文将通过一系列生动的比喻和实例,带领读者走进编程的奇幻世界,揭示那些隐藏在键盘敲击声背后的奥秘与乐趣。从初学者的迷茫到资深开发者的洞见,我们将一起经历技术成长的心路历程,解锁编程带来的无限可能。
31 1
|
3月前
|
Python
Python 控制结构:开启震撼编程之旅,犹如舞台上的精彩戏剧,让你的代码活起来!
【8月更文挑战第22天】Python的控制结构是编程的核心,包括条件判断(if-elif-else)和循环(for、while)。例如,可以用if-elif-else判断学生成绩等级,for循环计算1至10的总和,while循环实现猜数字游戏。此外,列表推导式等高级特性让操作更简洁高效。掌握这些结构能显著提升编程效率和代码质量。
50 1
|
3月前
|
Python
编程之禅的奇幻之旅:探寻代码世界与生活万象的惊世共鸣,颠覆你的认知!
【8月更文挑战第7天】编程不仅是技术活,更融汇艺术与哲学。它启示我们在生活里追求简洁高效,如Python列表推导式的优雅;教会我们面对挑战时冷静分析,正如调试代码;体现分工合作的重要性,像模块化设计;并鼓励持续优化,提升效能。编程所蕴含的生活智慧,能引导我们创造更美好、有序的人生。
43 1
|
3月前
|
JavaScript 前端开发 开发者
震撼揭秘!JS模块化进化史:从混沌到秩序,一场代码世界的华丽蜕变,你怎能错过这场编程盛宴?
【8月更文挑战第23天】在 Web 前端开发领域,JavaScript 模块化已成为处理日益复杂的 Web 应用程序的关键技术。通过将代码分解成独立且可重用的模块,开发者能够更有效地组织和管理代码,避免命名冲突和依赖混乱。从最早的全局函数模式到 IIFE,再到 CommonJS 和 AMD,最终进化到了 ES6 的原生模块支持以及 UMD 的跨环境兼容性。本文通过具体示例介绍了这些模块化规范的发展历程及其在实际开发中的应用。
45 0
|
3月前
|
存储 Python 容器
"解锁编程奇迹,Python基础入门:一剑在手,编程江湖任你遨游,从零到英雄的超燃蜕变之旅!"
【8月更文挑战第12天】编程曾被视为复杂的技能,Python却让其变得异常亲和简单。作为优雅且强大的语言,Python以简洁的语法、丰富的库支持及广泛的应用领域,成为初学者首选。本文将引导你开启Python学习之旅,通过基础概念与示例代码,让你领略编程魅力。
48 0
|
4月前
|
人工智能 机器人 智能硬件
一场科技与幽默的奇妙碰撞,高中生意外开启未来生活新纪元!
在一个晴朗午后,高中生李明偶然发现了祖父留下的日记与一顶复古帽。日记中记载了一个荒诞的想法——“人工智能征服厨房计划”,勾起了他对AI的好奇心。深入研究后,李明意识到AI已让生活更便捷有趣。参加AI创新大赛时,原本打算设计一个“不讲冷笑话的AI伴侣”,却意外加入幽默模块。演示时AI的一句玩笑赢得了大家的喜爱,也让李明在学校小有名气,同学们开始向他咨询AI趣事,甚至请求为宠物定制会讲笑话的AI项圈。李明意识到AI不仅能改变生活,还能带来欢笑。
48 0
|
6月前
|
算法 程序员
代码与禅意:技术修炼中的悟道之旅
【5月更文挑战第27天】在数字世界的繁复纹理中,编程不仅仅是一种职业技能,它更像是一场精神的修行。本文将探讨编程与禅宗之间的深层联系,透过技术实践揭示那些通常被忽视的哲学思考和内在成长。我们将一起走进代码的世界,探索如何通过技术的精进达到心灵的平静和智慧的提升。
|
6月前
|
机器人 程序员 C++
Scratch3.0——助力新进程序员理解程序(案例一十三、黑红相见)
Scratch3.0——助力新进程序员理解程序(案例一十三、黑红相见)
54 0