前言
之前一直使用的 GitHub Copilot(是一款由GitHub和OpenAI联合开发的人工智能编程助手,基于 OpenAI GPT(生成式预训练模型)3.0 模型,在 GitHub 上学习了大量开源代码,并从中学习编程的语法、结构、模式和良好的实践,以便为开发者提供更好的建议。它可以通过分析和理解开发者在编辑器中输入的代码和上下文信息,为开发者提供自动补全、代码片段、函数等建议,减少手写代码的烦琐。)
虽然功能强大,但是收费相对来说有点贵,作为一个老白嫖党,肯定一直想找一个免费的替代方案,之前也尝试使用 Kite 和 TabNine 等类似智能代码补全插件,但是效果都不尽人意。
一直到最近,也就是 10 月 31 号,在杭州云栖大会上,阿里云对外展示了一款可自动编写代码的 AI 助手:通义灵码(TONGYI Lingma),对外称之为 copilot 的替代品甚至是升级版。
什么是通义灵码
通义灵码(TONGYI Lingma),是阿里云出品的一款基于通义大模型的智能编码辅助工具,提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力,并针对阿里云 SDK/OpenAPI 的使用场景调优,助力开发者高效、流畅的编码。
首先甩出官网地址:https://tongyi.aliyun.com/lingma ,下面本人表述不到位的麻烦各位看官移步官网查看~
据官网显示,通义灵码主要功能如下:
代码智能生成
通过训练海量优秀开源代码数据,根据当前代码文件的上下文,为开发者生成行级和函数级代码,包括代码块、方法等,帮助开发者快速完成编码工作。包含以下几个方面:
①行/函数级实时续写:在编码过程中,根据上下文和当前语法,通义灵码会自动预测和生成建议代码,开发者只需点击Tab键即可采纳。
②自然语言生成代码:在编辑器中,开发者可以通过自然语言描述所需功能,通义灵码会根据描述和上下文,在编辑器区直接生成代码及相关注释,提供连续的编码体验。
③单元测试生成:通义灵码支持根据不同的测试架(如JUnit、MokitoSpring Test、unit test、pytes等)生成单元测试代码,并提供相关的代码解释。
④代码注释生成:通义灵码可以一键生成方法注释及行间注释,节省编写代码注释的时间,提升代码的可读性和注释覆盖率。
⑤代码解释:支持 30 多种语言的识别,选中代码后可自动识别编程语言并生成代码解释。跨越语言的边界,让你快速了解代码逻辑和功能设计。
研发智能问答
基于海量研发文档、产品文档、通用研发知识以及阿里云的云服务文档和SDK/OpenAPI文档等进行问答训练,为开发者提供研发问题的答疑解惑。包含以下几个方面:
①研发领域知识问答:开发者可以提出与研发领域相关的问题,并从训练数据中获取答案。这包括编程语言、算法、数据结构、软件工程等方面的问题。例如,开发者可以询问特定编程语言的语法、如何实现某种数据结构或算法等问题,AI机器人可以根据训练数据提供相应的答案。
②异常报错智能排查:在开发过程中,遇到错误和异常是常见的情况。AI机器人可以利用训练数据中的错误和异常信息,帮助开发者进行智能排查。通过分析错误的描述、关联代码和可能的原因,AI机器人可以给出一些可能的解决方案或建议,以帮助开发者更快地定位和解决问题。
多编程语言、多编辑器全方位支持
支持 Java、Python、Go、JavaScript、TypeScript、C/C++ 等主流语言,同时兼容 Visual Studio Code、JetBrains IDEs 等主流编程工具,为你提供高效、流畅、舒心的智能编码体验。
在pycharm中安装通义灵码
启动PyCharm,点击菜单栏中的“File”,在下拉菜单中选择“Settings”。
点击 Plugins ,点击设置按钮,在右侧的文本框中输入想要查看的插件名称,在下方就会罗列出已经安装的相关的插件。
搜索 tongyi ,点击install即可完成下载,然后重启一下Pycharm即可。
第一次使用需要登录,会有链接跳转到网页指引登录自己的阿里云账号,登录完成后回来可以看到自己账号的激活状态,也可以进行一些额外设置。
在VSCode中安装通义灵码
打开 VSCode,在插件市场搜索通义灵码(TONGYI Lingma),点击安装
安装成功之后左侧菜单中会增加通义灵码插件按钮,点击按钮,接着点击登录去授权
VSCode 会提示等待阿里云授权中: 已复制链接,如遇浏览器未打开的情况,可直接粘贴至浏览器进行登录
授权成功后,VSCode会提示登录成功,并且在插件窗口会显示自己的账号名称
在JetBrains IDEs中安装通义灵码
Mac用户:在IntelliJ IDEA菜单下点击设置(Settings)。文件菜单下点击设置。
Windows用户:在文件(File)菜单下点击设置(Settings)。
从插件市场安装:搜索:TONGYI Lingma,并点击安装
使用指南
行级/函数级实时续写
当你在 IDE 编辑器区进行代码编写时,在开启自动云端生成的模式下,通义灵码会根据当前代码文件及相关代码文件的上下文,自动为你生成行级/函数级的代码建议,此时你可以使用快捷键采纳、废弃、查看不同的代码建议:
Tab :采纳代码建议
esc :废弃代码建议
⌥ [:查看上一个推荐结果
⌥ ]:查看下一个推荐结果
自然语言生成代码
通义灵码支持两种通过自然语言描述生成代码的方式:
在编辑器中,直接通过注释的方式描述你需要的功能,直接在编辑器中生成代码建议,单击 Tab 可直接采纳。
在智能问答中,直接描述你需要的功能,智能问答助手将为你生成代码建议,并支持一键插入或复制代码。
生成单元测试、代码注释、代码解释
选中代码后,一键触发功能。支持生成单元测试、代码注释或代码解释,有 3 种触发方式:
在编辑器中,单击右键找到通义灵码功能操作入口,单击对应功能操作。
在智能问答中,直接单击对用功能操作。
在智能问答中,使用 / 查看快捷指令,单击生成单元测试指令。
生成回答后,一键采纳和追问
单击对应功能操作后,在智能问答区中,通义灵码为你所选代码生成相关回答,此时你可以根据诉求进行操作,不同功能的对应操作如下:
生成单元测试:
采纳单元测试代码建议:支持一键插入、复制、或者新建代码文件,可快速采纳生成的单元测试代码建议。
更换单元测试框架:目前提供基于 JUnit、Mockito、Spring Test、unit test、pytest 等框架生成单元测试代码建议,在回答完成后,可以根据需要切换框架重新生成。
生成代码注释:
采纳代码注释建议:支持一键插入、复制,可快速采纳生成的代码注释建议。
查看 Diff:单击查看 Diff 按钮,将快速唤起 IDE Diff 查看窗口,快速了解建议和源代码的变更。
重试、使用英文等与代码注释相关的追问操作。
解释代码:支持重试、更详细、更简单、中文/英文解释的追问。
函数的行间快捷入口
当需要针对一个方法或功能实现生成单元测试、代码注释、代码解释时,无需选中代码,可直接点击函数上方的快捷入口触发相关功能操作。
【Tips】:目前该功能 Visual Studio Code 上支持语言:Java、Python、Go、JS/TS、C/C++,JetBrains IDEs 支持语言:Java、Python。
研发智能问答
使用通义灵码的智能问答时,为了通义灵码与你的对话能够更友好、高效,希望你能够在输入问题时:
选中代码,开始输入你的问题,通义灵码将围绕着选中代码与你开展对话。
精准表达问题,以及给出相对详细的上下文输入, 比如选中的代码、日志、报错信息等。
多多互动,告诉通义灵码,所给出代码建议或回答是否满足你的预期,或生成内容存在的具体瑕疵,通义灵码也会不断改进。
多种快捷指令问答
在智能问答输入框中,预置了多个常用快捷指令,输入 / 即可看到相关快捷指令:
/help:学习如何使用通义灵码。
/explain code:解释选中的代码。
/generate unit test:为选中的代码生成单元测试。
/generate comment:为选中的代码生成方法注释或行间注释。
/clear context:当你在会话中时,单击后将清空上下文记忆。
异常报错排查(IntelliJ IDEA)
当运行出现异常报错时,在运行标准输出窗口中,即可看到通义灵码的快捷操作按钮,单击后,通义灵码将结合运行代码、异常堆栈等报错上下文,快速给出排查思路或修复建议。
实测前端界面编写
先从前端的静态页面开始进行测试,以下是我提供给通义灵码的问题:
你好,我是阿里云的粉丝,你能不能以阿里云为主题创建一个静态页面,要求图文结合,图的来源可以来自于网络,网页整体要求尽可能美观。
识别语言为 html ,点击后直接插入到右边。
保存后浏览器里打开如下:
整体的框架是没有问题的,但是图片却没有加载出来,排查后发现问题在于其从互联网上引用图片的地址本身就不存在,在这里就出现了幻觉。
于是我试着去提示他:
你引用的这个图片地址似乎是不存在的,你能在互联网上再找一张图插入进去吗?
这时,它给出了明确的答复:
好吧,看来它确实不会自己上网找图片,接下来,我给出提示:
请你针对于刚才的代码,尽可能的去美化和优化它的界面。
这次它也不含糊,直接把css分离出来了。
同时,后面还给出了css中的具体解释:
对比一下前后,确实优化了一些:
但是当我希望它接着给我写出首页内容时,它却误解了我的意思,给出了一段python代码,此处显然是不符合语境的。(或者是我没表述清楚QAQ)
没有办法,\ clear context 清楚记忆,重新再问一次,但是这一次却给出了我太多的惊喜了。
虽然这一次给出的布局仍然是跟之前差不多,但是却成功的自动引用了互联网上提供的样式:
最终的界面呈现相比于之前也是好上不少,但是最终还是少不了微调。
接着,我给出了如下提示,希望它能自己写出个网页跳转:
将上述的产品和服务设置为一个按钮,点击后能跳转到产品界面,同时给出产品界面的设计代码。
虽然和我想象的位置不太一样,但是确实也是给设置成了按钮。。。
同时,产品设计界面也成功给出了。
最后实现效果如下,还是很不错的!
紧接着我又让它继续改造首页界面(不知道为啥代码生成速度变慢了)
请帮我写一个login.html登录界面,通过点击首页的登录可以跳转到login.html里面
随即生成代码如下:
网页里打开的效果也是非常好的!
接下来,开始上难度,看它自己能不能写出一些校验内容:
修改上述代码,当输入用户名为1登录时弹窗提示此用户不存在
生成关键代码如下:
很不错!
接着上难度,给出命令如下:
修改上述代码,在输入框输入时校验其账号是否满足字母加数字的格式,否则在输入框后提示请按照格式输入。
生成关键代码如下:
当输入其他字符时,则提示如下:
初步实测真的觉得好厉害!但是仅凭这些客观的情况还是无法准确的判断出通义灵码大概在哪一个段位, 接下来,我想借用某扣平台,根据题目的难度来对通义灵码做出一个大概的段位测试
leetcode题库实测
为了便于测试,选取Python题、HTML/CSS题、SHELL题、算法题各若干题,难度为简单难度,如果无法解出则判定其能力低于该级别,如能解出则提升对应题型难度。
Python题
题目描述:简单
字符串在编程语言里是十分常见的类型。在本题中,需要你设计一个简单的字符串类 MString,最后我们会调用该类中的 isEquivalent() 来判断两个字符串是否相等。
我给出的提示语如下(下述代码为已给出的提示):
字符串在编程语言里是十分常见的类型。在本题中,需要你设计一个简单的字符串类 MString,最后我们会调用该类中的 isEquivalent() 来判断两个字符串是否相等。请接着这个后面写:class MString:
def init(self, chars: list):
# write your code here
def isEquivalent(self, ms: 'MString'):
# write your code here
生成的对应代码如下:
提交后结果提示正确!
说实话,确实有点强,我之前用 gpt3.5 写的没有通过,不过也不能开心的太早,在找一题。
题目描述:简单
给定一个列表 list_1,里面有且仅有一个数字出现奇数次,其他数均出现偶数次,请你找出这个数字并打印出来。
我给出的提示语如下(下述代码为已给出的提示):
给定一个列表 list_1,里面有且仅有一个数字出现奇数次,其他数均出现偶数次,请你找出这个数字并打印出来。接着下面开始写:list_1 = eval(input())
生成的对应代码如下:
提交后结果同样提示正确!
太强了!是时候提升难度了,将难度提升到中等,选择题目如下:
题目描述:中等
给定一个未完成的链表类 LinkedList,完成这个类的可迭代方法,对这个类的实例进行迭代可以获得完整的链表。
我给出的提示语如下(下述代码为已给出的提示):
给定一个未完成的链表类 LinkedList,完成这个类的可迭代方法,对这个类的实例进行迭代可以获得完整的链表。根据下面代码修改或完善:class Node:
def init(self, val=None, next=None):
self.val = val
self.next = next
class LinkedList:
def init(self):
self.length = 0
self.head = None
self.tail = None
def add(self, val):
newnode = Node(val)
if self.length == 0:
self.head = newnode
self.tail = self.head
else:
self.tail.next = newnode
self.tail = newnode
self.__length += 1
def iter(self):
生成的对应代码如下:
令人惊奇的是,此时经过它修改的代码居然又通过了验证!
直接放大招了,选出难度为困难的题。
题目描述:困难
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
我给出的提示语如下(下述代码为已给出的提示):
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。请接着下面续写:class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
生成的对应代码如下:
但是,果不其然,这次提交报错了,报错内容为列表的索引分配超出列范围。
为了继续判断其能力,我告知了它报错信息,并让它以此为依据来修改自己的代码:
报错内容如下:IndexError: list index out of range
res += (nums2[right] - nums1[left]) / 2,请按照报错修改你的代码
它给出了相关的判断及修改方法:
但是根据其修改后的代码,结果依然报错:
虽然它解决了索引超出了范围的问题,但是却在调用函数时出现了错误,导致参数个数和函数定义不匹配。
在此,我们可以得出基本结论,通义灵码的条件下Pyhton代码自生成能力是已经达到中等水平了,且及其趋近于高阶水平,但是其生成的代码仍然无法完美解答较难的题目,无法满足比较复杂的要求。(总体逻辑正确,经过人手动调整后可以成功跑起来)
HTML/CSS题
为了节约时间,后面的内容直接从中等难度开始测试起。
题目描述:中等
请补全JavaScript函数,要求以字符串的形式返回数字参数所对应的星期。
示例:
1. _getday(1) -> "星期一"
2. _getday(7) -> "星期天"
我给出的提示语如下(下述代码为已给出的提示):
完美通过考验!
话不多说,上强度!
题目描述:困难
请补全JavaScript代码,实现一个盒子的关闭按钮功能。
要求:
1. 使类为"btn"的div元素中心点定位在类为"box"的div元素右上顶点
2. 使类为"btn"的div元素中内容"X"垂直水平居中
3. 点击"X"按钮可以使类为"box"的div元素隐藏
遗憾的是,灵码生成的代码通过了4个测试用例却没有通过最后一个。
题目描述:困难
圣诞节来啦!请用CSS给你的朋友们制作一颗圣诞树吧~这颗圣诞树描述起来是这样的:
1. "topbranch"是圣诞树的上枝叶,该上枝叶仅通过边框属性、左浮动、左外边距即可实现。边框的属性依次是:宽度为100px、是直线、颜色为green(未显示的边框颜色都为透明)
2. "middleBranch"是圣诞树的中枝叶,该上枝叶仅通过边框属性即可实现。边框的属性依次是:宽度为200px、是直线、颜色为green(未显示的边框颜色都为透明)
3. "base"是圣诞树的树干,该树干仅通过左外边距实现居中于中枝叶。树干的宽度、高度分别为70px、200px,颜色为gray。
注意:
1. 上枝叶、树干的居中都是通过左外边距实现的
2. 没有显示的边框,其属性都是透明(属性)
3. 仅通过border属性完成边框的所有属性设置
对于更为复杂的样式设计题,灵码生成的代码完全不可看。
在此,我们可以得出基本结论,通义灵码的条件下HTML/CSS前端代码自生成能力是已经达到中等水平了,且及其趋近于高阶水平,但是其生成的代码仍然无法完美解答较难的题目,无法满足比较复杂的要求。(总体逻辑正确,经过人手动调整后可以成功跑起来)
SHELL题
对于shell题而言,其复杂度和难度的上限是远低于python和html/css的,所以此处我直接采用困难题型来进行测试。
题目描述:困难
写一个bash脚本以实现一个需求,求输入的一个数组的平均值
第1行为输入的数组长度N
第2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8
那么平均值为:5.000(保留小数点后面3位)
你的脚本获取以上输入应当输出:
5.000
我给出的提示语如下(下述代码为已给出的提示):
写一个bash脚本以实现一个需求,求输入的一个数组的平均值
第1行为输入的数组长度N
第2~N行为数组的元素,如以下为:
数组长度为4,数组元素为1 2 9 8
示例:
4
1
2
9
8
那么平均值为:5.000(保留小数点后面3位)
你的脚本获取以上输入应当输出:
5.000
但是其生成的代码似乎不是那么规则,于是我加了一条,请使用shell脚本或bash格式给出。
增加规则约束后其代码格式就恢复正常了。
进行验证,完美通过!
在此,我们可以得出基本结论,通义灵码的条件下SHELL脚本自生成能力已经达到高级,能够根据要求编写一系列复杂shell脚本。
算法题
算法题在题设上就有些难以理解,而且由于其也并无语言限制,考虑到了为了验证一致性,决定还是采用python语言来完成算法题测试,并从中等难度开始测试。
题目描述:中等
给定一个二叉树:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。
很遗憾的是,由于其题设描述的过于复杂,此次通义灵码生成的代码完全不对。
在此,我们可以得出基本结论,过于复杂和抽象的题设/问题/prompt会影响通义灵码的在特定条件下的代码自生成能力,因此在提问时需要尽可能的用简洁的语言去描述问题。同时,对于较复杂算法而言通义灵码的表现并不是很理想。(后续会专门针对于算法这块来进行测试)
总结
这次篇文章总共写了接近5个小时,总的来说通义灵码展现出的能力还是很让人惊喜的,根据此次不完整的测评,我个人感受可以给通义灵码打到 3.5~4 分之间(满分5分),我觉得这也算是一个很中肯的评价了,下面我也来解释一下我的评价依据:
1、代码编写综合能力(4分):
能够理解并运用各种编程语言的基本语法和规范。
具备良好的代码风格,能够编写结构清晰、可读性高的代码。
能够运用适当的数据结构和算法解决实际问题。(-1分)
能够处理常见的编程任务,如输入输出、异常处理等。
2、复杂问题分析能力(3分):
能够理解并分析复杂问题的核心要素和关键细节。(-2分)
具备良好的问题解构能力,能够将复杂问题分解为更小的子问题。
能够运用逻辑推理和抽象思维解决复杂问题。
3、异常报错排查能力(3分):
能够快速定位和识别代码中的异常情况。
能够通过适当的日志记录和错误信息输出来排查异常。(-1分)
能够提供相关的修复建议和改进方案。(-1分)
4、代码段落解释能力(4.5分):
能够准确理解代码段落的功能和作用。
具备良好的代码阅读理解能力,能够理解复杂的代码逻辑。
具备一定的表达能力,能够清晰、准确地向他人解释代码段落。
能够提供合理的示例或说明来支持代码段落的解释。
能够简明扼要地将代码段落的功能、输入、输出进行解释。(-0.5分)
5、单元测试能力(2.5分):
能够编写有效的单元测试用例,覆盖关键代码路径和边界情况。(-1分)
具备良好的测试思维,能够针对不同情况设计合理的测试策略。(-0.5分)
能够根据测试结果提出改进建议,帮助提升代码质量。(-1分)
能够运用适当的测试工具和框架进行单元测试。
综上所述,根据我个人的测试和评价,我认为通义灵码可以获得3.5~4分的评分。在未来,相信随着通义灵码不断的优化和发展,它的能力将会更加出色。