总结下工作中如何使用 AI 编程大模型 CodeGeex 提高工作效率,本文将分以下几部分介绍:
- 使用 CodeGeex 前期准备
- CodeGeex 模型训练
- 编程操作 SOP
- 结尾
一、使用 CodeGeex 前期准备
一)CodeGeex 介绍
CodeGeeX 是清华大学知识工程实验室研发的一款基于大模型的全能的智能编程助手,它可以实现代码的生成与补全、自动添加注释、代码翻译以及智能问答等功能。
对上百名用户进行问卷调研,涵盖前后端工程师、算法工程师、学生、研究者等, 83.4%的用户认为 CodeGeeX 插件有助于提高编程效率。

1、支持哪些编程语言
CodeGeeX 支持 Python、Java、C++、JavaScript、Go 等数十种常见编程语言。
2、支持哪些 IDE
CodeGeeX 支持 VSCode 及 IntelliJ IDEA、PyCharm、GoLand 等 JetBrains IDE。
3、使用模型
CodeGeeX 是一个具有 130 亿参数的多编程语言代码生成预训练模型,由清华大学知识工程实验室团队开发,采用华为 MindSpore 框架实现,在鹏城实验室“鹏城云脑 II”中的 192 个节点(共 1536 个国产昇腾 910 AI 处理器)上训练,使用 20 多种语言的语料库上预训练得到。

CodeGeeX 有以下特点:
高精度代码生成:支持生成 Python、C++、Java、JavaScript 和 Go 等多种主流编程语言的代码,在 HumanEval-X 代码生成任务上取得 47%~60%求解率,较其他开源基线模型有更佳的平均性能。
跨语言代码翻译:支持代码片段在不同编程语言间进行自动翻译转换,翻译结果正确率高,在 HumanEval-X 代码翻译任务上超越了其它基线模型。
自动编程插件:CodeGeeX 插件现已上架 VSCode 插件市场(完全免费),用户可以通过其强大的少样本生成能力,自定义代码生成风格和能力,更好辅助代码编写。
模型跨平台开源: 所有代码和模型权重开源开放,用作研究用途。CodeGeeX 同时支持昇腾和英伟达平台,可在单张昇腾 910 或英伟达 V100/A100 上实现推理。
二)CodeGeex 四个优势
1、免费
插件可免费使用,不像 Copliot 需要收费。
2、不用出海工具
国内可直接访问。
3、开源
模型代码开源。
4、功能齐全
包含代码补全、代码生成、代码翻译、代码注释、单元测试、代码解释等常见工作场景。
三) CodeGeex 插件安装
主流 IDE 都支持 CodeGeex,这里我们以 VSCode 为例进行演示。

开源数据集
The Pile (代码子集)
CodeParrot
额外爬取数据集
Github 上带 Star 的开源仓库
总计 23 种编程语言,涵盖 Python,Java, C++,JavaScript, C,Go,HTML, Rust, C#等主流语言,数据量超过 1580 亿 tokens。

二)数据清洗
1、为不同语言的文件加上语言标签
为不同语言的文件加上语言标签,在经过充分的学习以后,二十几种语言的语法模型是可以完全掌握。

2、将代码数据分词并并表识符化
处理代码缩进,将代码片段进行分词,得到 token 序列,再将 token 对应到词表中的 ID,得到 ID 序列。

三)模型架构
CodeGeex 模型基于 GPT 架构的自回归模型,由 40 层 transformer 组成,总计参数量达 130 亿(OpenAI 的 Codex 模型,具有 120 亿(12B)参数),它使用自然语言或代码 token 作为输入,输出下一个 token 的概率。


四)模型训练
训练量:~8500 亿 tokens
训练时长:2 个月
框架:基于华为 Mindspore 1.7
计算资源:1536 张昇腾 910Al 处理器
井行训练:192 路数据并行 +8 路模型并行

五)模型评估
过去比较常用多语言代码基准 CodeXGLUE, XLCoST 均使用 CodeBLEU/BLEU 作为评价指标,它其实是在算一个语义相似性,但在代码任务上并不能正确反映生成代码的质量,已不满足当前评估代码生成模型的需求。
在模型评估上,CodeGeex 把 HumanEval 数据集,也就是一个已有的 Python 数据集,扩展到了更多的语言上,包括 C++、Java、JavaScript、Go 等,形成了 HumanEval-X。这个数据集的特点就是,给模型输入包括必要的引用文件、描述做的是什么任务,然后可能会有一两个输入输出的例子让模型去把函数补全,就可以用已经写好测试代码和测试用例去做一个自动化测试,就知道模型写出来的代码到底正不正确。
HumanEval-X 基准:通过手写 164 道编程题 (支持 C++、Java、JavaScript 和 Go ),来评估多语言模型的效果
Pass@k:生成 k 个结果,只要有 1 个结果通过,就算通过。
六)效果分析
1、基线模型对比
CodeGeeX 模型在 Pass@1 和 Pass@10 上有代势,并取得了最佳的平均性能。

2、编程语言通过率对比
不同语言解决问题的分布存在差异,CodeGeex 最擅长 Python (和语料数据相关),下图 X 轴表示题目编号,Y 轴表示通过率。

3、代码错误类型对比
总共分为四种类型:语法错误、编译错误、输出错误、输出正确,语法错误和编译错误占比低,主要是输出错误。

七)安全风控
为了避免生成有害的代码,会在沙盒中进行测试再输出。
三、 编程操作 SOP
这里我们以一个实际例子:「对 int 数组进行排序」,来演示各种功能。
一)代码补全
1、自动模式
当用户停止编写代码时,插件会收集编辑器中的代码、注释、当前语言等,发送给 CodeGeek,触发代码生成,VSCode 底部 CodeGeeX 图标转圈表示正在生成,生成完毕之后会以灰色显示,按 Tab 键 即可插入在当前光标处插入生成结果。
代码生成中:

代码生成完成:

1)采纳候选代码
按下 Tab 键可以采纳 AI 生成的候选代码,会继续自动生成后面的代码,如果采纳,就继续按 Tab 键,否则自己写代码。
最终完整的代码需要按多次 Tab 键生成,CodeGeex 是一步步顺着代码的思路生成,不是和 ChatGPT 一次生成全部代码,这个和使用场景有关,这个我感觉在 VSCode 中写代码,这种方式体验挺好的。

2)切换候选代码
按 Alt/Option+[或] 在候选者之间进行切换。

备注:候选数量可以在扩展设置中修改 Candidate Num,候选数过多会减慢生成速度,默认是 1。
3)重新生成候选代码
如果你不满意当前的建议,可以按 Alt/Option+ 获得新的候选代码。

2、交互模式
按 Ctrl + Enter 进入交互模式,可以在右侧窗口中选择生成结果,并点击 "使用代码",代码就会插入到鼠标处。

二)代码翻译
选中一段代码,然后点击 Ctrl+Alt+T 进入翻译模式,根据提示选择要翻译的目标语言,CodeGeeX 将自动识别当前编辑器中代码的语言,并进行翻译,点击翻译结果上方的“insert”即可将翻译结果插入文件。
备注:您可以在设置中选择插入时如何处理被翻译的代码——注释或者覆盖。

三)代码注释
选择您想要解释的代码,右键选择 CodeGeex: Add Comment (可设置快捷键)即可在当前代码中直接生成注释。

四)代码扩展
通过智能问答机器人可以实现其它扩展功能,左边菜单找到 CodeGeex 插件,点击 ”login“ 按钮登录即可与机器人聊天。
1、对话
直接在聊天框中输入问题回车即可,可以是类似 ChatGPT 的任何问题,比如知识科普、代码生成、代码分析等。



3、解释代码
选中代码,然后聊天框中输入 /, 选择 /explain 回车,可以通过这个功能提升阅读源码的效率。

4、代码注释
选中代码,然后聊天框中输入 /, 选择 /comment 回车,这里和上面的代码注释类似,不过这里是通过在聊天框实现的,并且这里生成的注释可以选择是英文还是中文。

5、修复代码
选中代码,然后聊天框中输入 /, 选择 /fixbug 回车。
我故意将 arr[j], arr[j+1] = arr[j+1], arr[j] 调整成 arr[j], arr[j+1] = arr[j+1], arr[j],想让它修复下代码,提供了对比视图,左边是修改后的代码,右边是原始代码,可惜修复得不对,这方面还有待优化。

6、单元测试
选中代码,然后聊天框中输入“生成单元测试”,提高代码的质量。

四、结尾
使用 CodeGeex 后,编写代码的速度大幅提升。我们只需设计代码的思路,大模型会顺着我们的思路逐步实现。这种方式的优势在于能够将我们从繁琐的变量定义、赋值等语句中解脱出来。通过上面的例子,之前可能需要编写长达 294 个字符的代码才能完成,而现在只需按两次 Tab 键就能轻松实现。
或许有人会问,为什么不能像 ChatGPT 一样一次性生成完整代码呢?在编写代码的过程中,我们通常已经有了一些思路,只需按照思路进行编写,如果生成的代码与我们的思路一致,就可以采纳模型的建议;如果不一致,我们可以直接编写。如果我们想要一次性生成完整代码,可以使用 CodeGeex 的聊天机器人生成工具,这样能够在不同的场景中选择最适合的方式进行代码生成,从而进一步提升编写代码的体验。
我们在写的代码,分为两种代码,一种是非业务代码,比如某某算法,此时希望 AI 补全的是全部代码,可以通过写好注释实现一次生成全部代码;另外一种是业务代码,我们在写的过程中,希望 AI 根据我们的上下文补全剩余代码,可以通过多次采纳生成全部代码,这样的好处是避免对 AI 产生过度依赖。
CodeGeex 论文:https://arxiv.org/pdf/2303.17568.pdf
CodeGeex 模型源码:https://github.com/THUDM/CodeGeeX
CodeGeeX2 模型源码:https://github.com/THUDM/CodeGeeX2