社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

官方gpt3.5, gpt4.0、github copilot chat、gpt3.5 api、gpt4 api 对比

Python绿色通道 • 10 月前 • 110 次点击  

gpt4的智能程度大于gpt3.5,毫无争议,但是 OpenAI提供的GPT3.5 API  能力是否和官方的GPT3.5相当?对应的GPT4.0是否也一样?另外, Github 的 copilot chat 能力又怎样?


我试着用一个编程问题分别用不同的模型去测试看看效果如何。


题:请帮我实现一个Python函数,根据指定时间计算当月最后一天, 传入的参数值为datetime类型,返回的结果也为datetime

我把AI返回给我的所有内容直接贴出来


GPT3.5 API 的回答

import datetime

def get_last_day_of_month(date):
    # 获取下个月的第一天
    next_month = date.replace(day=28) + datetime.timedelta(days=4)
    # 往前推一天,即为当月的最后一天
    last_day = next_month - datetime.timedelta(days=1)
    return last_day

# 示例用法
date = datetime.datetime(2022, 9, 15)
last_day = get_last_day_of_month(date)
print(last_day)  # 输出:2022-09-30
```

在上面的代码中,我们首先获取下个月的第一天,然后往前推一天,即可得到当月的最后一天。


粗略一看,感觉也没什么毛病,特别是它还给你加了注释,说得好像很有道理,先获取下个月第一天,然后再往前减一天就得到了当月的最后一天。实际运行时就有bug,因为9月只有30天,28+4=32,相当于 next_month 的值10月2日了,减一天也是10月1日, 最后的返回值就是错误的。

结论:有明显的bug

GPT4.0 API 回答:

import datetime

def get_last_day_of_month(date):
    # 获取下个月的第一天
    if date.month == 12:
        next_month = date.replace(year=date.year+1, month=1, day=1)
    else:
        next_month = date.replace(month=date.month+1, day=1)
    # 往前推一天,即为当月的最后一天
    last_day = next_month - datetime.timedelta(days=1)
    return last_day

# 示例用法
date = datetime.datetime(2022, 9, 15)
last_day = get_last_day_of_month(date)
print(last_day)  # 输出:2022-09-30
```

在上面的代码中,我们首先获取下个月的第一天,然后往前推一天,即可得到当月的最后一天。


GPT4.0 API 的回答思路其实和GPT3.5是类似的,同样是先获取下个月的第一天再减1天,只不过换了种方式实现,这次是直接将月份加1,天数设为第1天,另外还做了边界处理,如果当前是12月份,直接将年份加1,避免了bug出现, 这份代码没什么毛病。只是看起来代码量多了点。

结论:无bug,但代码量偏多

官方GPT3.5回答

下面是一个使用Python实现的函数,根据指定时间计算当月最后一天,并返回结果为datetime类型:


from datetime import datetime, timedelta
import calendar

def get_last_day_of_month(date):
    # 获取当前日期的年份和月份
    year = date.year
    month = date.month

    # 获取当月的天数
    _, last_day = calendar.monthrange(year, month)

    # 构建最后一天的日期
    last_day_date = datetime(year, month, last_day)

    return last_day_date
你可以调用这个函数并传入一个datetime类型的日期作为参数,它将返回该日期所在月份的最后一天。例如:


date = datetime(20236 15)
last_day = get_last_day_of_month(date)
print(last_day)  # 输出:2023-06-30 00:00:00
这将返回datetime(2023630),表示20236月的最后一天。


官方GPT3.5 用到了calendar模块下的一个函数 monthrange, 这个函数怎么用它并没有做过多解释,其实这个函数会根据月份返回两个值(元组),第一个值是这个月第一天是星期几,第二个值是这个月份的天数。 这个月份天数就很容易计算当月最后一天了。

结论:无bug,但解释不够具体

官方GPT4.0回答

在Python中,可以使用calendar模块的monthrange()函数来获取一个月的最后一天。这个函数返回一个包含两个元素的元组,第一个元素是指定月份第一天的星期(0-6表示星期一到星期日),第二个元素是指定月份的天数。

下面是一个函数的实现,该函数接受一个datetime对象作为参数,返回该月份的最后一天:


from datetime import datetime
import calendar

def get_last_day_of_month(date):
    _, last_day = calendar.monthrange(date.year, date.month)
    return datetime(date.year, date.month, last_day)

# 测试
date = datetime.now()
print(get_last_day_of_month(date))
请注意,这个函数返回的日期是月份的最后一天,但是时间部分与传入的日期相同。如果你希望最后一天的时间部分是23:59:59,你可以修改函数如下:


from datetime import datetime, time
import calendar

def get_last_day_of_month(date):
    _, last_day = calendar.monthrange(date.year, date.month)
    return datetime.combine(datetime(date.year, date.month, last_day), time(23, 59, 59))

# 测试
date = datetime.now()
print(get_last_day_of_month(date))


官方4.0的实现其实和3.5是一样的,但是,这个回答更贴心,比如这里给你介绍了monthrange函数的作用,如果我是第一次使用这个函数,我还要去查一下API是怎么使用的,这里它直接给你介绍了,另外,考虑到你可能还有其他需求,它也一并给了你解决方法,提前预测你的需求,牛得一批。

结论:无bug,方案最佳,解释很详细

GitHub Copilot Chat的回答

计算当月最后一天的方法与计算当月第一天类似,只需要将 day 参数设置为当月的最后一天即可。可以使用 calendar 模块来获取当月的最后一天。

以下是一个实现该功能的 Python 函数:

from datetime import datetime
import calendar

def get_last_day_of_month(dt):
    """
    Calculate the last day of the month for a given datetime.

    Args:
        dt (datetime): The datetime to calculate the last day of the month for.

    Returns:
        datetime: The datetime representing the last day of the month.
    "
""
    # Get the last day of the month for the given datetime
    last_day = calendar.monthrange(dt.year, dt.month)[1]

    # Create a datetime object for the last day of the month
    d = datetime(dt.year, dt.month, last_day)

    return d

该函数接受一个 datetime 对象作为参数,然后使用 calendar.monthrange() 函数获取当月的最后一天。该函数返回一个元组,其中第二个元素表示当月的最后一天。然后,使用 datetime() 函数创建一个 datetime 对象,表示当月的最后一天,并返回该对象。

使用该函数的示例如下:

# Create a datetime object for January 15th, 2022
dt = datetime(2022, 1, 15)

# Calculate the last day of the month for the given datetime
last_day = get_last_day_of_month(dt)

# Print the result
print(last_day)  # Output: 2022-01-31 00:00:00

在这个示例中,我们创建了一个 datetime 对象,表示 2022 年 1 月 15 日。然后,我们使用 get_last_day_of_month() 函数计算了该日期所在月份的最后一天,并将结果存储在 last_day 变量中。最后,我们打印了 last_day 变量的值,输出结果为 2022-01-31 00:00:00。

Copilot 的实现方案和官方的GPT4几乎是一样的,唯一不同之处是,Copilot 对代码的编写更规范,比如它给函数加上了文档注释,可读性会好些,考虑到Copilot 是GitHub出品的,写代码更强大更规范在情理之中。

结论:无bug,且代码有详细注释

最后总结一下,对程序员写代码来说,GitHub Copilot Chat  最优, 官方GPT4次之,GPT4 API 第三,  GPT3 排第4,GPT3.5 API 最弱。

考虑到官方GPT3.5 有时也会胡言乱语,大部分情况下,GPT4的 API 应该是要强于官方GPT3的。

另外,除了官方GPT3.5是免费之外,其它都需要收费,性价比最高的当属官方GPT3.5,而性价比最低的是GPT4.0 API。

这里我只是让它写一个简单的函数作为测试,所以并非绝对权威,做这个实现的目的是粗概的了解下各个模型之间的表现和差距,希望对你有一定帮助。

有需要购买 ChatGPT Plus 加 V: zlong0876

GPT-4 Plus账号大大大降价了!

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/157174
 
110 次点击