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

本文涉及的产品
NLP自然语言处理_基础版,每接口每天50万次
NLP 自学习平台,3个模型定制额度 1个月
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 和帮助文档,为阿里云的开发者提供更好的服务。我对这款产品非常满意,也期待它的进一步改进和完善。

目录
相关文章
|
5天前
|
人工智能 自然语言处理 Java
【100%好礼】诚邀体验SoFlu-JavaAl开发助手,重塑AI编码价值
在这个数字化时代,软件开发任务繁重,飞算科技推出SoFlu-JavaAl开发助手,诚邀您体验AI编码新境界。它不仅生成代码,还通过自然语言理解需求,精准生成完整工程源码,大幅缩短设计工期,提升效率。SoFlu-JavaAl支持一键构建Java Maven工程,轻松合并老项目,快速响应需求变更。参与体验还有机会获多重好礼!
|
6天前
|
人工智能 自然语言处理 语音技术
AI 工具导航网站分享
一个致力于成为您在 AI 世界探索旅程中的可靠伙伴,为您搭建起一座通往便捷与高效的桥梁的网站。
AI 工具导航网站分享
|
11天前
|
人工智能 自然语言处理 搜索推荐
你用过最好用的AI工具是什么?
2023年AI革命风起云涌,众多产品令人振奋。我体验了OpenAI的ChatGPT、微软New Bing、Anthropic Claude等多款AI产品。特别推荐微软New Bing,它集成了强大的搜索引擎和语言模型,回答问题精准,提供最新信息,还能免费进行创意绘图。此外,New Bing还集成了Copilot网页助手,帮助用户高效提取和总结内容。
79 27
你用过最好用的AI工具是什么?
|
1天前
|
人工智能 自然语言处理 API
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
Mathtutor on Groq 是一款基于 Groq 架构的 AI 数学辅导工具,支持语音输入数学问题,实时计算并渲染解题过程,适用于代数、微积分等领域的学习和教学辅助。
17 5
Mathtutor on Groq:AI 数学辅导工具,实时计算并展示解题过程,支持通过语音提出数学问题
|
6天前
|
人工智能 自然语言处理 JavaScript
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
Univer 是一款开源的 AI 办公工具,支持 Word、Excel 等文档处理的全栈解决方案。它具有强大的功能、高度的可扩展性和跨平台兼容性,适用于个人和企业用户,能够显著提高工作效率。
50 7
Univer:开源全栈 AI 办公工具,支持 Word、Excel、PPT 等文档处理和多人实时协作
|
11天前
|
机器学习/深度学习 人工智能 算法
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
X-AnyLabeling是一款集成了多种深度学习算法的图像标注工具,支持图像和视频的多样化标注样式,适用于多种AI训练场景。本文将详细介绍X-AnyLabeling的功能、技术原理以及如何运行该工具。
65 2
X-AnyLabeling:开源的 AI 图像标注工具,支持多种标注样式,适于目标检测、图像分割等不同场景
|
19天前
|
编解码 人工智能 监控
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
VISION XL是一款基于潜在扩散模型的高效视频修复和超分辨率工具,能够修复视频缺失部分、去除模糊,并支持四倍超分辨率。该工具优化了处理效率,适合快速处理视频的应用场景。
69 6
VISION XL:支持四倍超分辨率的 AI 视频修复处理工具,提供去除模糊、修复缺失等功能
|
4天前
|
人工智能 自然语言处理 搜索推荐
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
Open Notebook 是一款开源的 AI 笔记工具,支持多格式笔记管理,并能自动将笔记转换为博客或播客,适用于学术研究、教育、企业知识管理等多个场景。
52 0
Open Notebook:开源 AI 笔记工具,支持多种文件格式,自动转播客和生成总结,集成搜索引擎等功能
|
6天前
|
人工智能 前端开发 Java
Spring AI Alibaba + 通义千问,开发AI应用如此简单!!!
本文介绍了如何使用Spring AI Alibaba开发一个简单的AI对话应用。通过引入`spring-ai-alibaba-starter`依赖和配置API密钥,结合Spring Boot项目,只需几行代码即可实现与AI模型的交互。具体步骤包括创建Spring Boot项目、编写Controller处理对话请求以及前端页面展示对话内容。此外,文章还介绍了如何通过添加对话记忆功能,使AI能够理解上下文并进行连贯对话。最后,总结了Spring AI为Java开发者带来的便利,简化了AI应用的开发流程。
152 0
|
11天前
|
人工智能 关系型数据库 OLAP
通义百炼融合AnalyticDB,10分钟创建网站AI助手
本文介绍了如何在百炼平台上创建和配置AI助手,使其能够准确回答公司产品的相关问题。主要步骤包括:开通管理控制台、创建应用并部署示例网站、配置知识库、上传产品介绍数据、创建AnalyticDB PostgreSQL实例、导入知识文件、启用知识检索增强功能,并最终测试AI助手的回答效果。通过这些步骤,AI助手可以从提供通用信息转变为精准回答特定产品问题。实操完成后,还可以释放实例以节省费用。