如果需要使用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有以下特点:
- 高精度代码生成:支持生成Python、C 、Java、JavaScript和Go等多种主流编程语言的代码,在HumanEval-X代码生成任务上取得47%~60%求解率,较其他开源基线模型有更佳的平均性能。
- 跨语言代码翻译:支持将代码片段从一种语言转换为另一种语言,只需一键,CodeGeeX就可以将程序转换为任意期望的语言,并保持高度的准确性。
- 可定制化编程助手:CodeGeeX免费提供VS Code扩展,支持代码补全、解释、摘要等功能,为用户提供更好的编码体验。
- 开源和跨平台:所有代码和模型权重都公开可用于研究目的。CodeGeeX支持Ascend和NVIDIA平台。它支持在单个Ascend 910、NVIDIA V100或A100上进行推理。
- 回答任何问题:CodeGeeX的功能要比GitHub Copilot强大,相当于GPT模型,不仅可以回答编程问题,还可以回答任何问题,如“你觉得人类未来的命运会如何,是走向繁荣,还是走向衰落,甚至灭亡!”。尽管有时回答不尽如人意,有时还顾左右而言他,但至少比GitHub Copilot强,能回答非编程的问题。
- 免费:这是最关键的一点,完全免费。而GitHub Copilot是收费的,而且部分功能仍然在测试中。
所以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支持代码补全功能,例如,输入如下的代码:
代码语言:javascript复制for i = 0
CodeGeeX会自动补全for循环的第1行,如下图所示。按Enter键,再按Tab键,CodeGeeX会继续补全代码。
检查与修复代码漏洞
CodeGeeX可以检查和修复代码漏洞,在Ask CodeGeeX页面输入如下内容:
检查下面的代码是否有漏洞
代码语言:javascript复制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编写的冒泡排序算法,请优化一下这段代码,让其效率更高。
代码语言:javascript复制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页面中直接输入下面的内容:
代码语言:javascript复制将下面的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会得到如下图所示的回复。
转换后的完整代码如下:
代码语言:javascript复制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区域输出转换后的代码,如下图所示。
转换后的完整代码如下:
代码语言:javascript复制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代码。
代码语言:javascript复制var arr = [1, 5, 7, 9, 3, 6, 8, 4, 2];
bubbleSort(arr);
console.log(arr);
运行程序,都会输出下面的内容:
代码语言:javascript复制[
1, 2, 3, 4, 5,
6, 7, 8, 9
]
- EOF -