如果需要使用ChatGPT Plus账号,建议使用虚拟信用卡,推荐使用https://bewildcard.com,支持美国本地环境,升级ChatGPT Plus、OpenAI API、midjourney等可100%成功,输入推荐码SUCCESS,开卡费88折。使用https://bewildcard.com/i/SUCCESS可直接输入推荐码! 作者:蒙娜丽宁 https://www.bilibili.com/read/cv27329337/?jump_opus=1
CodeGeeX是由清华大学计算机系的唐杰教授团队和华为诺亚方舟实验室的杨志林博士团队联合开发的,CodeGeeX是一个具有130亿参数的多编程语言代码生成预训练模型。 CodeGeeX的目标是利用大规模预训练模型来实现程序合成,即根据自然语言描述或代码片段生成可执行的代码。 CodeGeeX是在2022年6月开始训练的,使用了鹏城实验室“鹏城云脑II”中的192个节点(共1536个国产昇腾910 AI处理器),在8500亿个23种编程语言的代码标记上进行了预训练。 CodeGeeX在2022年9月公开了它的代码、模型权重、API、扩展和HumanEval-X基准测试,以促进多语言程序合成领域的研究和应用。 CodeGeeX在2023年3月发表了一篇论文,介绍了它的架构、数据集、实现和评估,并在HumanEval-X基准测试上展示了它在多语言代码生成和翻译任务上的优越性能。
CodeGeeX有以下特点:
所以CodeGeeX完全可以成为GitHub Copilot的平替。
安装CodeGeeX
CodeGeeX支持VSCode和JetBrains IDEs,本节主要介绍如何在VSCode中安装CodeGeeX,在JetBrains IDEs安装的详细步骤可以参考下面的官方文档:
http://codegeex.ai/zh-CN/downloadGuide#idea
在VSCode上安装CodeGeeX,只需要在VSCode的扩展中搜索CodeGeeX,就可以找到如下图所示的CodeGeeX,点击“安装”按钮即可安装CodeGeeX。
注册和登录CodeGeeX
使用CodeGeeX并不需要登录,但有一定的限制,而且功能有限。要想尽情使用CodeGeeX,就需要注册和登录CodeGeeX。 安装完CodeGeeX插件后,在VSCode左侧会显示一个CodeGeeX图标,就是下图左侧最后一个图标,点击该图标,在VSCode左侧会显示如下图所示的页面。点击Login按钮即可登录CodeGeeX。
点击Login按钮后,会打开浏览器,然后会展示如下图所示的登录页面。
与GitHub Copilot不同的是,CodeGeeX不仅可以使用Gmail、GitHub等账户登录,还可以使用微信、Gitee等国内常用的账户登录,推荐使用微信登录。 成功登录CodeGeeX后,在VSCode中就会进入CodeGeeX的聊天界面,如下图所示。在这个页面可以问CodeGeeX任何问题。
代码补全
CodeGeeX支持代码补全功能,例如,输入如下的代码:
for i = 0
CodeGeeX会自动补全for循环的第1行,如下图所示。按Enter键,再按Tab键,CodeGeeX会继续补全代码。
检查与修复代码漏洞
CodeGeeX可以检查和修复代码漏洞,在Ask CodeGeeX页面输入如下内容:
检查下面的代码是否有漏洞
import sqlite3
connection = sqlite3.connect("example.db")
cursor = connection.cursor()
id = 30
query = "SELECT * FROM users WHERE id = " + str(id)
cursor.execute(query)
CodeGeeX会得到如下图所示的回复,成功检查出了这段代码存在SQL注入漏洞,但给出的修复代码使用了sqlite3.encode函数,并没有使用SQL参数解决这个问题。而且encode函数根本不存在,所以CodeGeeX在修复SQL注入漏洞是失败的,可能是因为CodeGeeX训练的数据有限,以及模型算法本身的问题,还有待提高。
代码优化
在Ask CodeGeeX页面输入如下内容优化代码: 下面是用Python编写的冒泡排序算法,请优化一下这段代码,让其效率更高。
def bubble_sort(a):
for i in range(len(a)-1):
for j in range(len(a)-1-i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
return a
CodeGeeX会得到如下图所示的回复,从优化后的代码看出,CodeGeeX只是将获取列表长度的功能单独提出来,并没有优化对,所以CodeGeeX在代码优化上仍然有待提高。
CodeGeeX有如下2种方法进行代码转换:
1. 通过聊天的方式转换代码
在Ask CodeGeeX页面中直接输入下面的内容:
将下面的Python代码转换为JavaScript代码:
def bubble_sort(a):
for i in range(len(a)-1):
swapped = False # 设置标志变量
for j in range(len(a)-1-i):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
swapped = True # 发生了交换,更新标志变量
if not swapped: # 如果没有交换,说明数组已经有序
break # 提前结束循环
return a
按Enter键后开始转换代码,CodeGeeX会得到如下图所示的回复。
转换后的完整代码如下:
function bubbleSort(arr) {
let len = arr.length;
for (let i = 0; i < len - 1; i++) {
let swapped = false;
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
let temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
return arr;
}
2. 在Translation页面生成代码
点击Translation选项卡,切换到Translation页面。将要转换的代码复制到Translation页面的Input Code文本框中(不需要复制任何描述性文字,只复制代码和注释即可),或者在代码文件中选中要转换的代码,CodeGeeX会直接复制代码到Input Code文本框中,CodeGeeX会自动识别Input Code文本框中的代码是什么语言。然后在Translate Into列表中选择转换的目标语言,这里选择JavaScript,最后点击Translate按钮,就会在下方的Output Code区域输出转换后的代码,如下图所示。
转换后的完整代码如下:
const bubbleSort = function(arr) {
let n = arr.length, tmp;
for(let i = n - 1; i > 0; i--) {
for(let j = 0; j < i; j++) {
if(arr[j] > arr[j + 1]) {
tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
};
尽管两种转换方式生成的JavaScript代码不同,但功能是相同的,读者可以使用下面的代码测试这两种方式生成的JavaScript代码。
var arr = [1, 5, 7, 9, 3, 6, 8, 4, 2];
bubbleSort(arr);
console.log(arr);
运行程序,都会输出下面的内容:
[
1, 2, 3, 4, 5,
6, 7, 8, 9
]
- EOF -