通过一个实际案例对copilot,tongyi-linma, mascode编码助手进行比较

copilot,tongyi-linma, mascode 三种编码助手比较

最近使用copilot生成代码的时候,被坑了一把,它生成的代码里面居然有逻辑坑,我检查没发现,最后被用户测试给发现了。我后来再用通义灵码(tongyi-linma),豆包的编码助手(mascode AI)对同一个问题,要求生成代码,发现了很有意思的现象。同时我把使用这三个编码助手的心得记录下来供大家参考。

碰到一个很常见的需求,就是做当天的,本周的,本月,本年的一些统计,需要考虑时区。我就要求copilot帮我生成这些函数。首先这次我先要求ai给我生成一个函数,用于检验它以后生成的函数是否正确,结果生成这个函数的时候就出现了状况。 我用三个助手都帮我生成:

首先用copilot生成,我的提示词可以从下图中看到:写一个函数,指定一个日期d,和一个timezone的按小时偏移值,比如+8,-8,返回一个字符串,表示这个时区的时间。

给出了代码还给出了解题思路,还有验证的用例,不错。

MarsCode

哎呀,怎么和copilot一模一样?看来是同源的模型,以后在生成其他代码的时候,我们再看看有没有不同。

通义灵码

很明显这是完全不同的模型。代码更规范,说明更清晰。

然而并没有什么用,因为三个模型的结果都是错误的。

检验结果

copilot结果

首先测试copilot生成的代码copilot_date1.js,代码如下(可以拷贝执行)

javascript 复制代码
/*
写一个函数,指定一个日期d,和一个timezone的按小时偏移值,比如+8,-8,返回一个字符串,表示这个时区的时间。
*/
function getTimeInTimezone(date, offset) {
    // 创建一个新的日期对象,避免修改原始日期
    let localDate = new Date(date);

    // 获取UTC时间的毫秒数
    let utcTime = localDate.getTime() + (localDate.getTimezoneOffset() * 60000);

    // 计算目标时区的时间
    let targetTime = new Date(utcTime + (3600000 * offset));

    // 返回格式化的时间字符串
    return targetTime.toISOString().replace('T', ' ').substring(0, 19);
}

// 示例使用
let date = new Date();
let offset = +8;
console.log(getTimeInTimezone(date, offset));

结果如下:

可以看到现在的时间为2024-11-10 14:34:16, 而函数输出为2024-11-10 06:34:36,最后秒数的差异是执行两个命令之间的差。关键是中间差了8小时,好像是搞半天直接打印了UTC时间出来。

marsCode结果

结果和copilot一样。

通义灵码结果

测试代码如下:

ini 复制代码
function convertTimeZone(date, offset) {
    /**
     * 将指定日期转换为指定时区的时间字符串。
     *
     * 参数:
     * date (Date): 日期时间对象。
     * offset (number): 时区偏移值,正数表示东边时区,负数表示西边时区。
     *
     * 返回:
     * string: 转换后的时区时间字符串,格式为 'YYYY-MM-DD HH:MM:SS'。
     */

    // 计算偏移量(以毫秒为单位)
    const offsetMilliseconds = offset * 60 * 60 * 1000;

    // 应用偏移量
    const convertedDate = new Date(date.getTime() + offsetMilliseconds);

    // 格式化日期时间字符串
    const year = convertedDate.getFullYear();
    const month = String(convertedDate.getMonth() + 1).padStart(2, '0');
    const day = String(convertedDate.getDate()).padStart(2, '0');
    const hours = String(convertedDate.getHours()).padStart(2, '0');
    const minutes = String(convertedDate.getMinutes()).padStart(2, '0');
    const seconds = String(convertedDate.getSeconds()).padStart(2, '0');

    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

//显示当前时间
const now = new Date();
console.log(convertTimeZone(now, 8));

可以看出还是不对,和copilot相比,一个提前了8小时,一个推后了8小时。 我最后都没办法让ai输出一个正确的版本。各位大佬,可以告诉我如何才能让ai输出一个正确结果,用什么提示词?

最后选择了一个库实现打印功能:

javascript 复制代码
// 引入 moment 和 moment-timezone 库
const moment = require('moment-timezone');

// 设置时区
const timezone = 'Asia/Shanghai'; // 这里可以设置你想要的任何时区

// 获取当前时间,并转换为指定时区的时间
const date = moment().tz(timezone);

// 打印指定时区的日期
console.log(date.format('YYYY-MM-DD HH:mm:ss'));

开始生成一天开始的时间

当我们需要统计当天到目前为止的订单量,访问量等等的时候,我们需要获得一个当天开始的时间。我们也让ai帮忙实现。

这次我们从marsCode开始,看看还会不会和 copilot一样。

MarsCode

Copilot

为了防止Copilot抄Mars生成的代码,我特意说明,不要引用本项目中的代码。结果还是生成了和MarsCode一样的代码。

通义灵码

通义灵码又一次是完全不同的代码,从而看出它是一个完全独立的模型。没有参考其他的模型。

上面生成的代码是否正确呢?我们测试一下

检验结果

其他函数

其他的周开始时刻,月开始时刻,年开始时刻等,都一样是错误的,而且错误的原因和现象都相同,这里就不再重复了。

结论

1.不能太相信大模型,它会出错。

2.MarsCode是copilot的平替,它们基本上是一样的,而marsCode可以免费用。

3.灵码是一个独立的大模型,而且非常好。

相关推荐
聆风吟º2 小时前
CANN runtime 全链路拆解:AI 异构计算运行时的任务管理与功能适配技术路径
人工智能·深度学习·神经网络·cann
uesowys3 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
AI_56783 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
User_芊芊君子3 小时前
CANN大模型推理加速引擎ascend-transformer-boost深度解析:毫秒级响应的Transformer优化方案
人工智能·深度学习·transformer
智驱力人工智能3 小时前
小区高空抛物AI实时预警方案 筑牢社区头顶安全的实践 高空抛物检测 高空抛物监控安装教程 高空抛物误报率优化方案 高空抛物监控案例分享
人工智能·深度学习·opencv·算法·安全·yolo·边缘计算
qq_160144873 小时前
亲测!2026年零基础学AI的入门干货,新手照做就能上手
人工智能
Howie Zphile3 小时前
全面预算管理难以落地的核心真相:“完美模型幻觉”的认知误区
人工智能·全面预算
人工不智能5773 小时前
拆解 BERT:Output 中的 Hidden States 到底藏了什么秘密?
人工智能·深度学习·bert
盟接之桥3 小时前
盟接之桥说制造:引流品 × 利润品,全球电商平台高效产品组合策略(供讨论)
大数据·linux·服务器·网络·人工智能·制造
kfyty7253 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai