全面开测:AI智能编码辅助工具通义灵码

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 全面开测:AI智能编码辅助工具通义灵码

图片

通义灵码正在全面的公测中,感兴趣的小伙伴欢迎一起用起来。
活动地址

前言


AI代码助手(AI Coding Assistant)是一种利用人工智能帮助开发人员更快、更准确地编写代码的软件工具。 它可以通过根据提示生成代码或在你实时编写代码时建议自动完成代码来实现此目的。 以下是AI代码助手可以做的一些事情:

  • 与你使用的流行代码编辑器集成,例如 IntelliJ IDEA、Goland、Visual Studio Code等等
  • 根据提示或代码注释生成完整的代码片段
  • 自动完成实时编写的代码行
  • 检测代码中的错误、错误和安全漏洞
  • 帮助注释代码,以便方便回头参考
  • 代码纠错
  • API查询或学习
  • ......

作为一名技术沉浸者,对于这种能够帮助提升开发效率的助手,是喜闻乐见的。

在实际的开发实践工作中,比较了很多的AI编程助手,几乎都体验过了。

以下是曾体验过的列表:

助手名称 助手官网地址
通义灵码 https://tongyi.aliyun.com/lingma?spm=5176.28326591.0.0.40f73da2aalqqf
Github Copilot https://github.com/features/copilot
CodeGeeX https://codegeex.cn/zh-CN
Cursor https://www.cursor.so/
Kite https://www.kite.com/
TabNine https://www.tabnine.com/
CodeRush https://github.com/encap/coderush
Alibaba Cloud AI Coding Assistant https://developer.aliyun.com/tool/cosy
codeium https://codeium.com/
replit https://replit.com/
codepal https://codepal.ai/
codesquire https://www.codesquire.ai/
codecat https://codecat.ai/ai-code-explainer
aixcoder https://aixcoder.com
codiga https://www.codiga.io/
CodeWhisperer https://aws.amazon.com/cn/codewhisperer/
Bito AI https://bito.ai/

对于IDE的支持上,所有的AI助手,目前都能够做到基本流行的工具流畅支持,在开发语言的适配上,大家也能够大同小异。

对于我个人来讲,更多的比较是助手的实际提效能力、成本代价、影响、是否易用等等一些重要因素。

易用性方面看,首先是适配IDE的版本,我相信不仅仅我的习惯,好多干技术的都喜欢用比较新的工具版本。且有时间的话,就有升级的欲望。那么,助手是否能够快速适配新的IDE版本,是易用的一个很大关键。对比看来,好多比较古老的助手,就跌落神坛了,没法继续陪伴在我的身边了。其次,易用性,是否简便、快速上手,也是影响体验的很大的一个因素。最后,内存占用,是否让工程卡顿、异常,使用起来会带来很多麻烦、嵌入,都很影响使用体验。

成本代价方面看,收费、免费,是影响个人开发者是否能够持续使用的很大的因素。

影响方面看,代码安全性,是否涉及隐私泄露、数据上传,国产化等等也都是实际开发中要考虑的因素,毕竟自己也是一名打工仔,对于企业来讲相关的因素比较重要。

提效能力看,对于我个人来讲,其实更多的使用的是代码补全、代码纠错、代码生成、单元测试生成功能,现在有了更多让我惊喜的功能,比如异常处理、API文档查询、各种自由对话查询能力。这些方面去看,就看工具本身的功能的多寡、优劣性。

经过了很长时间的实践中摸索使用,收费的因为个人金钱能力问题,就淘汰了;国外的尽量也就淘汰了,毕竟公司还是在提倡国产化;不容易使用的也就淘汰了。

在长期的实践后,目前安装了几款智能编码辅助助手,Aixcoder、Bito AI,还有刚开放没多久的助手,我们将要全面开测的工具,通义灵码。

在描述通义灵码相关功能前,先讲下目前留下的两个工具Aixcoder、Bito AI为什么会被留下,以及它们的优势。

Aixcoder 是一款智能代码自动补全工具,2018年左右时间诞生,个人觉得功能比较好用,代码生成能力、代码补全能力、代码提示能力、代码纠错能力,都能够及时快速响应。也可以在线查询相关的代码段。重点觉得相较其他产品特色的是代码纠错能力。例如:Java开发的哥们,应该老是在输入法中英文切换时难受。纠错功能可以快速,将中文符号,转为英文符号。其他的相关辅助能力,相对来讲还可以,用着不错。一直可以免费使用,可以说是国产比较不错的一款了。

Bito AI,拥有前边讲的AI代码助手能干的事情的众多功能。个人版免费。相对来讲功能比较强大、全面,比较其他的产品来讲,最重要的是不卡,比如Codeium,能卡顿到死,太难受了。

通义灵码,一发布,我就感受到了惊喜,国产产品,相当棒的体验,现在是我的主力使用。下面全面开测,一 一来说明通义灵码带来的惊喜吧!!

通义灵码介绍


image-20231117165718901

通义灵码,经过海量优秀开源代码数据训练,可根据当前代码文件及跨文件的上下文,为你生成行级/函数级代码、单元测试、代码注释等。沉浸式编码心流,秒级生成速度,让开发人员更专注在技术设计,高质高效地完成编码工作。基于海量研发文档、产品文档、通用研发知识、阿里云的云服务文档和 SDK/OpenAPI 文档等进行问答训练,为开发人员答疑解惑,助开发人员轻松解决研发问题。支持 Java、Python、Go、JavaScript、TypeScript、C/C++ 等主流语言,同时兼容 Visual Studio Code、JetBrains IDEs 等主流编程工具,提供高效、流畅、舒心的智能编码体验。

能够覆盖掉前言中所讲的AI智能编码辅助助手帮我们开发者做的各种提效事情,同时,在针对阿里云相关代码、场景的加强,让我感到了无比的惊喜。

官方说明产品功能如下

✍️帮你写:行级/函数级代码生成和续写,根据上下文自动预测和生成建议代码

image-20231117171415333

✍️帮你写:单元测试生成 ,根据 JUnit、Mockito、Spring Test 等框架自动生成单元测试

✍️帮你写:描述生成代码,自然语言描述你想要的功能,自动生成代码及注释

✍️帮你写:代码注释生成,一键为你生成方法注释及行间注释

📚帮你读:代码解释,帮你理解Java、Python、Go、C/C++、TS/JS 等30多种主流编程语言

image-20231117171828374

📚帮你解:一键开启调试问题智能排查,自动查找解决方案

image-20231117171852921

下面,我将从下述维度展开来进行全面测试:

  • 功能使用维度:体验功能的使用场景和使用效果

  • 产品设计维度:体验通义灵码在视觉交互、快捷键操作与原生IDE的融合情况

  • 交互体验维度

  • 内容生成维度

  • 效率提升维度:有编码助手和无编码助手后效率提升(对比无编码助手)

  • 工具对比维度:对比我现有的三款工具的异同、优劣

相信通过我的全方位测评,用户能够对通义灵码智能编码辅助助手有足够强的了解了。

产品设计维度


体验通义灵码在视觉交互、快捷键操作与原生IDE的融合情况

原生IDE工具融合

本次原生IDE工具,采用常见的开发IDE工具:Intelij IDEA 、Goland、Visual Studio Code来进行融合测试

Intelij IDEA 版本

image-20231117222850320

版本是截止文档编写日期2023/11/17,为最新版本

助手安装与配置

安装跟其他IDE插件一样方式,直接在市场内搜索即可

image-20231117232527216

因为我已经安装完毕,因此上边不再是安装按钮。

image-20231117232833470

不愧是国产的优秀插件,中英文详细的功能介绍,以及非常明细的功能动图展示,真的非常认真。

image-20231117233250383

通义灵码,安装后首先会建立文件的索引,之后在每一个方法的上部生成一个小小的图标。如下图所示包含:解释代码、生成单元测试、生成代码注释,快捷功能入口

image-20231117233422931

当然也可以在代码内,选中后使用快捷指令,后续在功能使用维度测评中,详细展示。

image-20231117233933420

上图,展示了通义灵码安装后,我们可以在IDE的功能区找到相应的配置。

通义灵码的功能区,包含问答输入区(支持研发领域问答等),快捷指令简介区(可心的入门指南简介,可以跳转帮助文档完善学习,可以反馈使用的问题),用户登录信息区(用户目前可以使用阿里云的账号一站式登录,此处有个问题:如果能够实现session共享更加便捷,不用重新页面输入用户名、密码),快捷键提示区(展示了通义灵码工具的快捷键,注意:如果快捷键与现有快捷键有冲突,可以改一下),搜索区(代码、文档可以搜索查看)

image-20231117234936567

搜索功能非常实用,能够查询各种API

image-20231117235338782

同样的,在IDE工具设置页面,其他设置内,仍有通义灵码自定义配置。

配置项分为代码补全设置、辅助功能两类

代码补全设置,包括开启本地模型服务(默认没有开启),可以设置补全长度的方式以及候选项条数;云端大模型对于自动触发补全长度、手动触发补全长度的设置

辅助功能,包含文档默认打开方式配置异常信息辅助解决配置方法级快捷操作配置(上边图示,方法上的图标即是该功能)

通义灵码与IDE融合,非常优雅的方式,完成所有的功能的灵活配置。

异常报错

image-20231118140646443

在插件安装后,存在异常,但不影响正常使用。可能IDE版本过新,是EAP版本,适配程度没有那么高。还是希望能够有更多的力量投入进来,版本迭代。如果开源,个人踊跃报名参与进来。

设计体验优化

image-20231118142837398

新增回话,会完全重置会话,且无任何引导性提示,这块不大友好,希望能改进一下

Visual Studio Code版本

image-20231118002905531

同样的IDE版本,为文档编写时最新版本

助手安装与配置

image-20231118141237050

在VS Code里边,同样直接可以在插件市场搜索:通义灵码,快速安装。

image-20231118142031373

与IDEA中,相比,功能基本一致,搜索功能没有,配置与IDE紧密贴合方式实现,实现比较优雅的集成

问题同样是新会话的重置,比较突兀

Goland 版本

image-20231118210538118

助手安装与配置

在Goland插件市场中直接搜索安装即可,与其他的IDE安装方式一样,简单、优雅。

image-20231118211104251

整体的配置也大同小异,不再赘述。

快捷键操作

动作 快捷键 备注
唤起智能问答 Ctrl+shift+L 默认,这个非常容易与现有键冲突
代码片段补全 Alt+P 默认
搜索代码/文档 Ctrl+shift+S 默认

目前应该没有配置快捷键的地方,需要进一步优化吧。毕竟很大程度会与一些快捷键冲突。

视觉交互

对于通义灵码整体的交互,目前看,中规中矩。跟目前所有的助手的设计是一样的。

当然,相对来讲,通义灵码的快捷键、图标设计、页面设计满足国人的使用爱好。

功能使用维度


本次功能使用场景,尽量全方位的开测。细数当前比较流行的开发语言,分别选择Java、Golang、Python作为待测语言(相对来说比较综合、流行,前端技术栈我就不测试了,相信有很多小伙伴已经测试前端情况了)来进行全方位的测评展示。包括:代码智能生成、研发领域问答、灵码独有的阿里专属的文档能力

行/函数级实时续写

Java

实际Java开发中,对于后端接口的开发,首先从Controller层开始。

本次测试项目为公司内部生产实际项目,其中组件,使用了knife4j (集成swagger)作为接口文档平台

image-20231118224529626

通义灵码助手,能够读取上下文,快速建议代码续写,也非常符合实际开发中代码情况,也是正确的。

实际手写代码如下图所示:

image-20231118225707941

司内的开发规范是上图写法,但,通义灵码的续写,采用了Api注解源码的默认使用写法,与实际多少还有点偏差,这块可能有优化的可能性

进到类内,继续进行代码编写

image-20231118230301133

一般不会在实际开发中,对Controller中添加main方法。上文已经添加了@Api注解,同时类名也是Controller后缀,如果能够更加匹配实际可能预测代码就更好了,目前其他的助手在这方面差不多效果。这块可以说是一个很大提升的优化点。

整体服务端接口响应对象为统一封装的对象,Result

image-20231118231227672

此时对于方法的预测比较恰到好处,但是不够完全,还需要进一步的修改,这样的预测,代码生成效果不大,可能有很大的进步空间

简单写了一个测试的方法,在其中使用注释,续写预测代码,差强人意

image-20231118232742186

基本上来说,续写代码的能力,能够实现一定的功能,但是可以有更大的进步空间,希望阿里云官方能不断优化

Golang

与Java类似,Golang在Web开发中,同样差不多的框架套路。

本次,测试项目同样为生产在用项目,用的是Gin作为框架。

首先,路由添加,

image-20231118235225075

快速预测代码生成,相对来讲起码写的符合实际的场景

image-20231119000811462

采用实际的一个方法内,进行测试,代码预测,语法是正确的,但是e.ERROR_NOT_FOUND,是没有上下文的,这块有点异常

image-20231119001130969

采用编写注释,是能够生成相关的预测代码,同时,字段也是符合现有的字段情况。

Golang语言在代码续写部分,能力差不太多

Python

image-20231119002517029

python代码同样可以续写预测

发现一个共同问题,那就是选择其他预测选项,使用快捷键Alt+ ,没啥反应

自然语言代码生成

Java

如下图所示,同样在类内,添加一个私有方法,代码成功快速响应预测。但是实际效果,不是很理想

image-20231119003232104

换一下常规的算法描述,看看自然语言代码生成预测效果

image-20231119004112046

效果还是可以的,比较理想的效果

Golang

image-20231119004612176

Golang的生成效果,虽然看着生成相关的方法了,但是稍微考虑通用的一些细节,目前是缺少的。这块在助手这块是有很大优化空间的。

Python

image-20231119005213452

image-20231119005445735

如上图所示,代码预测存在一定的偏离

相对来讲,Java的代码,个人感觉是相对更贴合实际

单元测试生成

Java

image-20231119010537351

如上图所示,采用一个检查登录的方法,测试单元测试的可用性。

服务实现方法代码:

    @Override
    public boolean checkLogin(HttpServletRequest servletRequest, HttpServletResponse response) {
   

        String token = servletRequest.getHeader(RequestHeaderMarketKey.AUTHORIZATION);
        if (StringUtils.isEmpty(token)) {
   
            return false;
        }
        //处理token数据
        token = token.replace("Bearer ","");
        log.info("token:{}", token);
        //初始化登录对象

        //初始化登录信息
        return true;
    }

点击方法名,右键单元测试生成,通义灵码助手会在问答区,生成单元测试代码,可以快速复制

通义灵码,如果在未来可以实现直接在对应目录创建文件,以及实现相关代码,这个优化可能会更加受用户喜欢

单元测试生成代码如下:

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TokenServiceImplTest {
   

    @InjectMocks
    private TokenServiceImpl tokenService;

    @Mock
    private HttpServletRequest request;

    @Mock
    private HttpServletResponse response;

    @Before
    public void setUp() {
   
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testCheckLoginWithValidToken() {
   
        // Set up
        String token = "Bearer validToken";
        when(request.getHeader("Authorization")).thenReturn(token);

        // Execute
        boolean result = tokenService.checkLogin(request, response);

        // Verify
        Assert.assertTrue(result);
        verify(request).getHeader("Authorization");
        verify(request).getHeader("Authorization");
        verifyNoMoreInteractions(request);
        verifyNoMoreInteractions(response);
    }

    @Test
    public void testCheckLoginWithInvalidToken() {
   
        // Set up
        String token = "invalidToken";
        when(request.getHeader("Authorization")).thenReturn(token);

        // Execute
        boolean result = tokenService.checkLogin(request, response);

        // Verify
        Assert.assertFalse(result);
        verify(request).getHeader("Authorization");
        verifyNoMoreInteractions(request);
        verifyNoMoreInteractions(response);
    }
}

image-20231119011531123

支持使用Mockito库、SpringTest库生成单元测试

存在问题

  1. 引入的相关服务类,并没有引入相关的包
  2. 目前更多的是SpringBoot框架,SpringBootTest的相关实现,希望也能添加进来
  3. 插入按钮,不能灵活选择目录,生成文件。反而容易误差
Golang

使用生产项目里的一个方法进行单元测试生成测试

原方法如下:

func AssertQuantityStatistics(ctx *gin.Context) {
   
    data, err := pm_center.AssertQuantityStatistics()
    if err != nil {
   
        gogin.SendErrResp(ctx, err, "")
        return
    }
    res := new(response.PmCenterAlmAssertQuantityResp)
    res.Result = data
    gogin.SendData(ctx, res)
}

生成单元测试代码如下:

// TestAssertQuantityStatistics tests the AssertQuantityStatistics function
func TestAssertQuantityStatistics(t *testing.T) {
   
    // Test case 1
    quantity1 := 5
    expected1 := true
    result1 := AssertQuantityStatistics(quantity1, expected1)
    if result1 != expected1 {
   
        t.Errorf("AssertQuantityStatistics failed for quantity1, expected: %v, got: %v", expected1, result1)
    }

    // Test case 2
    quantity2 := -3
    expected2 := false
    result2 := AssertQuantityStatistics(quantity2, expected2)
    if result2 != expected2 {
   
        t.Errorf("AssertQuantityStatistics failed for quantity2, expected: %v, got: %v", expected2, result2)
    }

    // Test case 3
    quantity3 := 10
    expected3 := true
    result3 := AssertQuantityStatistics(quantity3, expected3)
    if result3 != expected3 {
   
        t.Errorf("AssertQuantityStatistics failed for quantity3, expected: %v, got: %v", expected3, result3)
    }
}

如果对当前生成结果不满意,可以重新生成

image-20231119014107960

同时也会对生成代码作出简单地解释

Python

image-20231119014845985

相对于Java、Golang来说,Python的单元测试生成是比较粗糙的。

后期可以有很大的优化空间

代码注释生成

Java

方法注释生成

原方法代码如下:

    @ApiOperation("需求详情分页方法")
    @PostMapping("/test")
    public Result<PageResult<RequirementDetailDTO>> queryPowerRequirementPage(@Valid @RequestBody PowerQueryPageDTO dto) {
   
        return powerProjectApi.queryPowerRequirementPage(dto);
    }

代码注释生成代码如下:

    /**
     * 查询电力需求分页结果
     *
     * @param dto 电力查询分页DTO,包含查询条件和分页信息
     * @return 电力需求分页结果,包含查询到的电力需求详情列表和分页信息
     */
    public Result<PageResult<RequirementDetailDTO>> queryPowerRequirementPage(@Valid @RequestBody PowerQueryPageDTO dto) {
   
        // 查询电力需求分页结果的逻辑代码
    }

同样也是在右侧问答区展现结果

属性字段注释生成

原代码如下:

private Long projectId;

代码注释生成代码如下:

// 私有的Long类型项目ID
private Long projectId;

单行注释生成

原代码如下:

return powerProjectApi.queryPowerRequirementPage(dto);

生成注释如下图所示:

image-20231119020529467

支持多种形式的注释生成,支持中文、英文、更详细、更精简

更详细的注释,看上述明显存在问题

Golang

原代码如下:

func (m *AlmProjectsModel) AssertQuantityStatistics() (*po_pm_center.PmAssertQuantityPo, error) {
   

    sql := fmt.Sprintf(sqlAssertQuantityStatistics)
    var data po_pm_center.PmAssertQuantityPo
    err := db.Pool.Get(&data, sql)
    if err != nil {
   
        log.Error("AssertQuantityStatistics failed:", sql, err)
        return nil, err
    }
    return &data, nil
}

代码注释生成代码如下:

// AssertQuantityStatistics 断言数量统计
func (m *AlmProjectsModel) AssertQuantityStatistics() (*po_pm_center.PmAssertQuantityPo, error) {
   
    // 代码功能实现
}

原代码如下:

err := db.Pool.Select(&data, sql)

代码注释生成代码如下:

err := db.Pool.Select(&data, sql) // 从数据库中选择数据到data变量中
Python

原代码如下:

    def _get_login_page(self):
        """
        获取PC端登录页面
        :return:
        """
        url = "https://xxx"
        page = self.session.get(url, headers=self.spider_session.get_headers())
        return page

代码注释生成代码如下:

    def _get_login_page(self):
        """
        获取登录页面

        参数:
            self: 对象本身

        返回值:
            None
        """

Python的代码注释,直接放方法内了,明显的问题

代码解释

Java

代码行解释

原代码如下:

BaseDataDictionaryEntity dicUser = baseDataDictionaryService
                .getOne(Wrappers.<BaseDataDictionaryEntity>lambdaQuery()
                        .eq(BaseDataDictionaryEntity::getType, ProjectEditorEnum.EDITOR.getKey())
                        .eq(BaseDataDictionaryEntity::getCode, userCode));

代码解释(支持三种,中文精简、中文详细、英文):

中文精简

这个Java函数使用了lambda表达式,调用baseDataDictionaryService的getOne方法,查询类型为ProjectEditorEnum.EDITOR.getKey()且代码为userCode的BaseDataDictionaryEntity对象,并将结果赋值给dicUser变量。

中文详细

这个Java函数使用了lambda表达式,调用baseDataDictionaryService的getOne方法,查询类型为ProjectEditorEnum.EDITOR.getKey()且代码为userCode的BaseDataDictionaryEntity对象,并将结果赋值给dicUser变量。lambdaQuery()方法返回一个CriteriaBuilder对象,通过调用eq方法来设置查询条件,eq方法使用给定的字段和值作为参数,返回一个CriteriaQuery对象。最后,getOne方法使用CriteriaQuery对象作为参数,返回符合条件的第一个BaseDataDictionaryEntity对象。

英文

This Java function uses lambda expression to call the getOne method of baseDataDictionaryService, querying the BaseDataDictionaryEntity object with type as ProjectEditorEnum.EDITOR.getKey() and code as userCode, and assigns the result to the dicUser variable. The lambdaQuery method returns a CriteriaBuilder object, and the eq method is called on the CriteriaBuilder object to set the query condition, with the specified field and value as parameters. The CriteriaQuery object is returned. Finally, the getOne method is called using the CriteriaQuery object as a parameter, and returns the first BaseDataDictionaryEntity object that meets the condition

对于复杂的代码,是有很好的辅助功能

方法代码解释

方法原代码:

    private boolean findAuth(Long projectId, String userCode) {
   
        ProjectRegistryEntity project = projectRegistryService.getById(projectId);
        if (ObjectUtil.isEmpty(project)) {
   
            return false;
        }
        if (userCode.equals(project.getProjectLeader())
                || userCode.equals(project.getBusinessLeader()) || userCode.equals(project.getRegistrantCode())) {
   
            return true;
        }
        List<String> roles = new ArrayList<>();
        roles.add(RoleEnum.PRODUCT_MANAGER.getRoleCode());
        roles.add(RoleEnum.OPERATING_USER.getRoleCode());
        roles.add(RoleEnum.DECISION_USER.getRoleCode());
        roles.add(RoleEnum.BUSINESS_LEADER.getRoleCode());
        roles.add(RoleEnum.REGISTRANT.getRoleCode());
        roles.add(RoleEnum.PROJECT_LEADER.getRoleCode());
        List<ProjectTeamUser> teamUsers = projectTeamUserService.list(Wrappers.<ProjectTeamUser>lambdaQuery()
                .eq(ProjectTeamUser::getProjectId, projectId)
                .eq(ProjectTeamUser::getDelFlag, "0")
                .in(ProjectTeamUser::getRoleCode, roles)
                .eq(ProjectTeamUser::getUserCode, userCode));
        if (ObjectUtil.isNotEmpty(teamUsers)) {
   
            return true;
        }
        if (ObjectUtil.isEmpty(project.getParentId()) || project.getProjectLevel() == 1) {
   
            return false;
        }
        return findAuth(project.getParentId(), userCode);
    }

代码精简解释:

该函数用于验证用户是否对项目具有权限。首先根据项目ID获取项目信息,如果项目为空,则返回false。然后判断用户代码是否为项目负责人、业务负责人或注册人,如果是,则返回true。接下来,获取项目团队用户列表,判断用户的角色是否在指定的角色列表中,并且用户的代码是否与列表中的用户代码相同,如果是,则返回true。如果项目没有父级ID或者项目层级为1,则返回false。最后,如果用户没有权限且项目有父级ID,则递归调用该函数进行权限验证。

对于代码方法简要的描述,还是比较精准、易懂

方法名代码解释

同样采用上边的测试方法

代码解释如下:

这个Java函数是一个私有函数,它接受一个Long类型的projectId和一个String类型的userCode作为参数。函数的返回类型是boolean。它用于查找某个用户是否对指定的项目有权限

如果想要简单地明白方法的目的,生成的内容还是有用的。但是相对来讲是简单地,上下文结合的差了点

Golang

方法代码解释

func (m *AlmProjectsModel) AssertQuantityStatistics() (*po_pm_center.PmAssertQuantityPo, error) {
   

    sql := fmt.Sprintf(sqlAssertQuantityStatistics)
    var data po_pm_center.PmAssertQuantityPo
    err := db.Pool.Get(&data, sql)
    if err != nil {
   
        log.Error("AssertQuantityStatistics failed:", sql, err)
        return nil, err
    }
    return &data, nil
}

Golang的代码相对Java来讲,对于可读性来讲,是不同的。

代码精简解释如下:

这个go函数是一个方法,它从数据库中获取特定的SQL查询结果,并将其赋值给一个结构体变量。如果获取数据失败,函数会返回错误。如果成功,函数将返回结构体指针和nil

代码详细解释如下:

这个go函数是一个方法,它被一个名为"AlmProjectsModel"的结构体定义时作为一个成员函数定义。此函数的目的是对某个特定的数据库查询进行断言,以确保数据库中的某些统计数据的正确性。函数内部首先使用fmt.Sprintf函数将一个带有占位符的SQL查询字符串转换为具体的查询语句。然后,使用一个名为"data"的变量来存储查询结果。如果存储数据时出现错误,函数会记录错误并返回nil和错误信息。如果存储成功,函数将返回"data"的指针和nil

英文解释如下:

The given Go function is a method of the "AlmProjectsModel" struct. Its purpose is to perform an assertion on a specific database query in order to ensure the correctness of some statistical data in the database. Inside the function, it first uses "fmt.Sprintf" to convert a SQL query string with placeholders into an actual query. Then, it uses a variable "data" to store the query results. If an error occurs while storing the data, the function logs the error and returns nil and the error information. If the storage is successful, it returns the pointer to the "data" and nil.

其他代码解释

除了方法代码解释、代码行代码解释,尝试了整个文件的解释,结果报错了,在IDEA中是没有报错的

响应:

调用异常:code=503, request_id=440c2503-24b6-42a9-9c03-8d144a356a50
Python

方法代码解释

原代码如下:

    def seckill_canstill_running(self):
        """用config.ini文件中的continue_time加上函数buytime_get()获取到的buy_time,
            来判断抢购的任务是否可以继续运行
        """
        buy_time = self.timers.buytime_get()
        continue_time = int(global_config.getRaw('config', 'continue_time'))
        stop_time = datetime.strptime(
            (buy_time + timedelta(minutes=continue_time)).strftime("%Y-%m-%d %H:%M:%S.%f"),
            "%Y-%m-%d %H:%M:%S.%f"
        )
        current_time = datetime.now()
        if current_time > stop_time:
            self.running_flag = False
            logger.info('超过允许的运行时间,任务结束。')

代码精简解释如下:

该函数通过读取配置文件中的continue_time和调用buytime_get()函数获取到的buy_time,来判断抢购任务是否可以继续运行。如果当前时间超过了stop_time(即运行时间超过了允许的运行时间),则将running_flag设置为False,并记录日志提示任务结束

代码详细解释如下:

该函数用于判断抢购任务是否可以继续运行。它首先调用buytime_get()函数获取到buy_time,然后从配置文件中读取continue_time,表示允许运行的时间。接着,它计算出stop_time,即允许运行的结束时间。如果当前时间current_time大于stop_time,则将running_flag设置为False,并记录日志提示任务结束。意味着抢购任务不能再继续进行。

英文解释如下:

The function is used to determine whether the flash sale task can still run. It first gets the buy_time by calling the buytime_get() function, and then reads the continue_time from the configuration file, which represents the allowed running time. Next, it calculates the stop_time, which is the allowed ending time for the running task. If the current time is greater than the stop_time, it sets the running_flag to False and logs a message to indicate that the task has ended, meaning that the flash sale task can no longer continue.

中规中矩的解释,还是不错的

其他代码解释

除了方法代码解释、代码行代码解释,尝试了整个文件的解释,结果报错了,在IDEA中是没有报错的

响应:

调用异常:code=503, request_id=b2479168-36c9-4747-b211-3e52696d11d3

异常报错智能排查

Java

简单异常测试

0为除数,虽然直接写,大家都不会出现这个问题。但是逻辑复杂之后,有可能会出现这个异常

原代码如下:

    public static void main(String[] args) {
   
        int i = 1;
        int j = 0;
        System.out.println(i / j);
    }

运行结果如下:

image-20231119183135437

点击Lingma图标,展示结果:

image-20231119183240295

相对来说比较尴尬,这个简单地异常结果是空的,搜索区域,目前更多的是针对阿里相关的SDK、文档之类的。

稍复杂的调用异常

原代码如下:

    public static void main(String[] args) {
   
        int i = 1;
        int j = 0;
        //System.out.println(i / j);
        print(null);
    }

    private static void print(FileVO file) {
   
        System.out.println(file.getFileName());
    }

运行结果如下:

image-20231119183732605

结果区显示为:

image-20231119183851221

Golang

简单异常

原代码如下:

package main

func main() {
   

    a := 1
    b := 0
    println(a / b)

}

运行结果显示如下:

image-20231119185637390

在golang语言使用中,通义灵码的异常反馈是没有的

Python

简单异常

原代码如下:

if __name__ == '__main__':
    a = 1
    b = 0
    a / b

运行结果显示如下:

image-20231119190230723

可见python在通义灵码助手实践中,是没有侵入功能的

希望官方应该尽量明确功能支持点

研发领域知识问答

通用

对于一些随机的一些问题咨询,是有不错的响应的

image-20231119190842968

Java

咨询Java语言问题

image-20231119191248554

技术问题

image-20231119191457484

不管是代码编写还是技术咨询,都能够快速响应,还是不错的

Golang

在Golang的实际问答中,响应快速,真的比较惊喜

image-20231119192102078

Python

image-20231119192606111

对于问答响应同样非常迅速,代码内容也相对来讲,可用。但是,对于包的导入,是在代码里有缺失的

文档搜索

image-20231119193133604

搜索问答区,对于阿里官方的一些SDK支持,比较完善

交互体验维度


在交互体验上,我们可以从触发时机、响应延时、按键数量、接收量来总结相关的交互体验情况

经过功能使用维度体验、产品设计维度体验,我们基本上从各种情况下体验了实际的助手功能。

现在我们,总结下对于交互体验的相关情况:

内容 明细 备注
触发时机 代码右键、通义灵码图标问答输入区、快捷键 比较优雅
响应延时 非常迅速
按键数量 体验了这么久通义灵码作为代码生成助手后,至少1/2数量减少了
接收量 一般

内容生成维度


内容生成维度测评,从生成长度、生成正确性、生成代码优良率、补全智能程度、上下文感知能力方面总结情况

内容 明细
生成长度 符合实际需要
生成正确性 对象属性的生成、注释生成是可靠地,单元测试相对来讲有些不足
生成代码优良率 一般,可用性相对来讲实际上没那么好用。更常用的是问答还有注释、代码解释
补全智能程度 代码智能程度、问答是能够比较贴合实际,虽有不足,但是是比较有效、可靠地,单元测试的代码生成也是比较不错
上下文感知能力 一般,类的使用,导包。上下文信息的补充,也是略有不足

效率提升维度


已经用了太久的代码助手辅助开发,那份效率的提升,是必然的。现在使用效率提升上,更是大大的加强。

对于代码生成这块,可能相对来讲通义灵码感觉准确率差点。通义灵码,在智能问答、单元测试生成、代码解释,起到了非常大的帮助。

  1. 新接手项目的逻辑了解,使用通义灵码的代码解释,大大提高了了解的效率
  2. 开发过程中,API的查询,现在通过问答区的询问更加高效。省了Google和Bing的查询次数。
  3. 单元测试实际项目中,规范没有要求,个人来说是有需要的会单元测试编写。相对来讲,通义灵码的单元测试能力是有,但是代码内容差点,需要二次更改

工具对比维度


现在仍然在安装的软件有三款,在前文已经描述了。Aixcoder、Bito、通义灵码,评价五星满分

维度 Aixcoder Bito 通义灵码 备注
上下文理解代码补全 ☆☆☆☆ ☆☆☆ ☆☆☆ 用久了以后,Aixcoder感觉在这块好用多,补全、准确度等,都能技高一筹
注释生成 ☆☆☆☆ ☆☆☆ ☆☆☆ Aixcoder可以直接快速在代码内添加,不像其他工具还需要点击插入、复制插入
自然语言代码生成 ☆☆☆ ☆☆☆ ☆☆☆☆ 在阿里相关的API,生成更加准确。其他的代码生成部分相对也能准确
单元测试生成 / ☆☆☆ ☆☆☆☆ Bito和通义灵码生成的代码使用代码库不一样,Bito 采用junit4,通义灵码默认多库支持,
代码解释 / ☆☆☆☆ ☆☆☆☆☆ 通义灵码作为国产工具,更加符合国内人的情况
智能问答 / ☆☆☆☆☆ ☆☆☆☆ Bito集成GPT,支持自由内容的问答,通义灵码更偏向技术问答
代码搜索 ☆☆ / ☆☆☆ Aixcoder搜索的代码库比较粗糙,通义灵码对于SDK更加精准,也能够有相关文档,尤其是阿里的文档
异常排查 / / ☆☆☆ 部分语言支持,也比较局限
工具支持 ☆☆ ☆☆☆☆ ☆☆☆☆ Aixcoder目前有点局限,Bito、通义灵码相对支持的全一点
其他功能 / ☆☆☆☆ / Bito还有性能、安全、风格检查,可读性提升、清洁代码等各种功能

结论


下表总结了我的综合对于通义灵码的暂时评估结果(1:非常不满意,2:不满意,3:中立,4:满意,5:非常满意)。

维度 子维度 得分 评论
功能性 代码生成 4 产品可以从自然语言描述生成代码,完成代码行或函数,生成单元测试和代码注释,解释代码。生成的代码大多准确和相关,但有时可能过于通用或重复。
功能性 问答 5 产品可以回答开发相关的问题,提供调试和排查建议,支持阿里云的资源 SDK/OpenAPI 和帮助文档。回答简洁且有信息量,经常包含相关来源的链接。
产品设计 视觉体验 4 产品有简洁优雅的视觉设计,图标和按钮清晰。生成的内容显示在一个单独的面板,可以调整大小和位置。产品还支持暗黑模式和亮色模式。
产品设计 交互形式 4 产品支持鼠标和键盘交互,允许用户选择、复制、粘贴或删除生成的内容。产品还为用户的操作提供反馈和提示。
产品设计 快捷键 3 产品提供了一些快捷键,用于常见的操作,如触发代码生成、切换模式、关闭面板等。但是,快捷键不可自定义,有些与原生 IDE 的快捷键冲突。
产品设计 快捷入口 4 产品为一些功能提供了快捷入口,如代码解释、问答、调试等。快捷入口可以通过右键点击代码或从菜单栏选择选项来访问。
交互体验 触发时机 4 产品可以自然地生成内容,又不打扰用户。用户可以根据需要触发或关闭生成。
交互体验 响应延时 4 产品的响应延时较短,一般在几秒内生成内容。但有时,当生成内容较长或复杂时,响应延时会增加。
交互体验 按键数量 4 产品可以有效减少用户的按键数量,提高编码效率。用户可以直接采纳或修改生成的内容,而不需要重新输入。
交互体验 接受率 4 产品的接受率较高,大部分生成的内容符合用户的需求和期望,被采纳或稍作修改。但有时,生成的内容不够准确或相关,被忽略或删除。
内容生成 生成的长度 4 产品可以生成适当长度的内容,既不过短也不过长,便于用户判断。
内容生成 生成的正确性 4 产品可以生成正确的内容,没有出现模型幻觉,答非所问的情况。但有时,生成的内容与用户的输入不完全匹配,或有些细节不准确。
内容生成 生成的代码的优良率 4 产品生成的代码,需要符合几个特点:易读、可复用性、可扩展性、健壮性。大多数情况下,产品生成的代码质量较高,符合这些特点。但有时,产品生成的代码质量较低,有些冗余、不规范或不符合最佳实践。
内容生成 补全的“智能”程度 4 产品生成的内容,需要体现出一定的智能程度,不仅是简单的补全,而是能够理解用户的意图,提供有价值的建议。大多数情况下,产品生成的内容智能程度较高,能够根据用户的输入生成合适的代码、问题回答、测试等。但有时,产品生成的内容智能程度较低,只是提供一些常见或模板化的内容。
内容生成 跨文件上下文感知能力 4 产品生成的内容,需要感知工程的上下文,给出的补全符合工程的业务上下文,修改了某部分代码而与之类似的代码会同样发生类似的生成变化。大多数情况下,产品生成的内容能够感知跨文件的上下文,考虑到工程的结构、变量、函数、模块等。但有时,产品生成的内容不能感知跨文件的上下文,忽略了一些重要的依赖或约束。

通义灵码是一款功能强大、设计优秀、交互友好、内容高质、效率提升的智能编码辅助工具。它能够帮助开发者在不同的场景和用例下,提高编码的效率和质量,激发编码的创意,解决编码的难题。它还能够支持阿里云的资源 SDK/OpenAPI 和帮助文档,为阿里云的开发者提供更好的服务。我对这款产品非常满意,也期待它的进一步改进和完善。

目录
相关文章
|
15天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
11天前
|
存储 XML 人工智能
深度解读AI在数字档案馆中的创新应用:高效识别与智能档案管理
基于OCR技术的纸质档案电子化方案,通过先进的AI能力平台,实现手写、打印、复古文档等多格式高效识别与智能归档。该方案大幅提升了档案管理效率,确保数据安全与隐私,为档案馆提供全面、智能化的电子化管理解决方案。
104 48
|
13天前
|
人工智能 数据挖掘 数据库
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
本文为数据库「拥抱Data+AI」系列连载第1篇,该系列是阿里云瑶池数据库面向各行业Data+AI应用场景,基于真实客户案例&最佳实践,展示Data+AI行业解决方案的连载文章。本篇内容针对电商行业痛点,将深入探讨如何利用数据与AI技术以及数据分析方法论,为电商行业注入新的活力与效能。
拥抱Data+AI|破解电商7大挑战,DMS+AnalyticDB助力企业智能决策
|
14天前
|
人工智能 数据库 决策智能
拥抱Data+AI|如何破解电商7大挑战?DMS+AnalyticDB助力企业智能决策
本文为阿里云瑶池数据库「拥抱Data+AI」系列连载第1篇,聚焦电商行业痛点,探讨如何利用数据与AI技术及分析方法论,为电商注入新活力与效能。文中详细介绍了阿里云Data+AI解决方案,涵盖Zero-ETL、实时在线分析、混合负载资源隔离、长周期数据归档等关键技术,帮助企业应对数据在线重刷、实时分析、成本优化等挑战,实现智能化转型。
拥抱Data+AI|如何破解电商7大挑战?DMS+AnalyticDB助力企业智能决策
|
6天前
|
人工智能 开发者
通义灵码融入南京大学 AI 编程创新课,让大学生释放想象力
南京大学软件学院副教授钦老师将通义灵码引入了 X 层级课程《人工智能驱动编程》中,通过将通义灵码智能编码实践与传统编程语言教学融合的方式,让学生切身体会人工智能、大模型技术对编程学习方式带来的改变。
|
4天前
|
人工智能 文字识别 运维
AI多模态的5大核心关键技术,让高端制造实现智能化管理
结合大模型应用场景,通过AI技术解析高端制造业的复杂设备与文档数据,自动化地将大型零件、机械图纸、操作手册等文档结构化。核心技术包括版面识别、表格抽取、要素抽取和文档抽取,实现信息的系统化管理和高效查询,大幅提升设备维护和生产管理的效率。
|
8天前
|
机器学习/深度学习 人工智能 搜索推荐
AI与娱乐产业:电影制作的新工具
随着科技的发展,人工智能(AI)逐渐渗透到电影制作中,带来了前所未有的创新。本文探讨了AI在剧本创作、场景构建、特效制作、动作捕捉、音频处理、剪辑及市场调研等领域的应用,以及其对提升效率、激发创意和拓宽视野的影响,展望了AI在未来电影产业中的重要作用。
|
4天前
|
机器学习/深度学习 人工智能 安全
AI与旅游业:旅行规划的智能助手
在数字化浪潮中,人工智能(AI)正重塑旅游业。本文探讨了AI如何通过个性化推荐、智能预测与预警、语音交互与虚拟助手、增强现实体验及可持续发展,提升旅行规划的效率、安全性和趣味性,推动旅游业创新与变革。
|
6天前
|
人工智能 自然语言处理 关系型数据库
从数据到智能,一站式带你了解 Data+AI 精选解决方案、特惠权益
从 Data+AI 精选解决方案、特惠权益等,一站式带你了解阿里云瑶池数据库经典的AI产品服务与实践。
|
7天前
|
人工智能 安全 搜索推荐
AI与能源管理:智能电网的未来
本文探讨了AI与智能电网的融合及其对能源管理的深远影响。智能电网利用先进的信息、通信和AI技术,实现电力的自主、智能化、高效管理。AI在精准预测电力需求、实时监测与故障诊断、智能能源调度、个性化能源服务和优化可再生能源利用等方面发挥关键作用,推动能源管理的高效、智能和可持续发展。