ChatGPT 的最佳 Python 用例

闪电发卡10个月前ChatGPT641

ChatGPT Python Programming


ChatGPT 是OpenAI的革命性对话平台,自几个月前发布公开测试版以来,已经风靡全球。基于大型语言模型 (LLM),它能够:
  • 回答各种一般性问题
  • 针对各种问题提出解决方案
  • 就各种学科进行广泛的对话
用户发现 ChatGPT 擅长的学科领域之一是生成编程代码。虽然有很多猜测认为 ChatGPT 将取代程序员甚至改变我们的思维方式,但本博客重点关注该工具今天的实际功能,而不是担心未来的可能性和期望。 在这篇文章中,我将解释 ChatGPT 的代码生成功能,并通过断言关键算法和语义结果将其与行业标准进行比较。我评估 ChatGPT 的标准包括:
  • 能够生成正确的代码
  • 能够生成有效的代码(即清晰、简洁的代码而不是意大利面条式代码)
  • 能够创建可维护的代码(即需要维护的人可以理解的代码)
  • 能够生成没有漏洞/安全问题的代码。
这篇文章的主要目的是阐明在现实世界中使用 ChatGPT 的一些好处和注意事项。长话;博士?你得到你所付出的。ChatGPT 代码生成示例让我们看一些简单的 Python 代码示例,其中 ChatGPT 可能会给您一个合理的答案,或者由于不准确而适得其反。 使用 ChatGPT 生成 Python 函数 对于这个例子,我要求 ChatGPT “写一个 Python 函数,从字符串中修剪指定的字符。”

我得到的答案简单明了:

def trim_char(string, char):
    """
    这个函数接受一个字符串和一个字符,并从字符串的开头和结尾删除该字符的所有实例。
    """
    return string.strip(char)


  • 它还给了我一个例子:
  • import trim_char
    
    my_string = "###Hello World###"
    
    char_to_trim = "#"
    
    trimmed_string = trim_char(my_string, char_to_trim)
    
    print(trimmed_string)
好吧,这非常简单,这正是我们所期望的,因为我要求的东西不仅是微不足道的,而且在 Python 标准库中也可用。让我们尝试一些更高级的东西。 使用 Python 图像库 (PIL) 通过 ChatGPT 生成图像 现在我将要求 ChatGPT “编写一个 Python 函数,使用 Python 图像库 PIL 生成 800 X 600 像素的阴阳符号图像。”

答案是:


from PIL import Image, ImageDraw
def generate_yin_yang_image():    
    # 创建一个白色背景的新图像
    image = Image.new("RGB", (800, 600), "white")    
    draw = ImageDraw.Draw(image)  
   
    # 画出黑色的半圆
    draw.pieslice((0, 0, 800, 600), 0, 180, fill="black")    
   
    # 画出白色的半圆
    draw.pieslice((0, 0, 800, 600), 180, 360, fill="white")        

    # 画黑色和白色的圆圈
    draw.ellipse((200, 200, 600, 600), fill="white", outline="black")    
    draw.ellipse((200, 0, 600, 400), fill="black", outline="black")        

    # 保存并显示图像  
    image.save("yin-yang.png")    
    image.show()




这在纸面上看起来很棒,但它是正确的吗?让我们尝试一下:

yinyang symbol


图 1:根据 ChatGPT 的阴阳符号结果似乎暗示 ChatGPT 尚未接受过识别图像的训练,因此我不相信它能够承担与视觉世界有联系的编程任务。这里的教训是,在要求它编写代表图形等实体的代码时要非常小心,包括(大概)图表和图形。 使用 Graphene 通过 ChatGPT 生成 GraphQL 名称/路径 让我们要求它“编写代码来查找 GraphQL 解析器名称/路径,而不执行 Python Graphene 中查询的解析器”。 ChatGPT 的答案是:
from graphene import ObjectType, String, Schema


class Query(ObjectType):

    hello = String(name=String(default_value="world"))


    def resolve_hello(self, info, name):

        return f"Hello {name}!"


schema = Schema(query=Query)

# 获取'hello'字段的解析器路径
field_name = 'hello'

field = schema.get_query_type().fields[field_name]

resolver_path = field.resolver_info.path


print(f"The resolver path for '{field_name}' is: {resolver_path}")
不幸的是,运行此代码不起作用:
Traceback (most recent call last):

  File "/Users/theo.despoudis/Workspace/wpe-merge/sink/tempCodeRunnerFile.python", line 1, in <module>

    field_name

NameError: name 'field_name' is not defined
GPT 库的实现有两个错误:
  • 1. The “Schema” is not the actual GraphQL schema that we want to find the query             resolver. We should be using the “graphql_schema” field that contains the schema.

  • 2. There is no “get_query_type” method.

实际的代码应该是:

def get_resolver_field(schema, name):

    return schema.graphql_schema.query_type.fields[name]


这是 ChatGPT 当前模型的弱点之一,因为它只能参考它所训练的信息。这意味着 2021 年之后创建的代码/库/功能将不会被它识别。在 ChatGPT 开始实时训练之前,它根本无法跟上,因为软件是一个移动速度极快的领域。因此,ChatGPT 生成的代码在某个时间点可能是正确的,但现在不正确。 您可以要求提供特定版本的代码库,但这只会进一步扩展问题。老实说,这不是检索信息的最优雅的方式,因为它涉及研究库的实现。 也许我们需要一个仍然现实的例子,但有一个不依赖复杂知识的潜在解决方案。 使用 ChatGPT 生成按功能分组 现在让 ChatGPT “用 Python 编写一个函数,聚合按 storage_type 标签分组的指标值列表。” 它为我们提供了以下格式的指标列表:


metrics = [
{

  created_at: '2023-3-3T00:00:00.000Z',

  value: 10000000000,

  labels: {

     environment: 'production',

     storage_type: 'files',

  },

},

{

  created_at: '2023-3-4T00:00:00.000Z',

  value: 50000000000,

  labels: {

     environment: 'development',

     storage_type: 'database',

  },

},

{

  created_at: '2023-3-4T00:00:00.000Z',

  value: 10000000000,

  labels: {

     environment: 'staging',

     storage_type: 'database',

  },

}

]




如您所见,有一个包含以下字段的对象列表:
  • created_at :创建指标的日期。
  • value :指标的值。这表示大小(以字节为单位)。
  • labels :包含指标元数据的对象。它具有以下属性:
  • environment:指标存在的环境。它可以具有三个可能值之一:生产、登台或开发。
  • storage_type :此指标值表示的存储类型。它可以具有两个可能值之一:数据库或文件。

该函数应将此对象列表转换为另一个对象,该对象聚合每个“ storage_type”的总数,格式如下:

[

{

            environmentTotal: {

              development: 50000000000,

              production: 0,

              staging: 10000000000,

            },

            storage_type: 'database',

            total: 60000000000,

          },

 

{

            environmentTotal: {

              development: 0,

              production: 10000000000,

              staging: 0,

            },

            storage_type: 'files',

            total: 10000000000,

          }

]


由于“ storage_type ”有两个可能的值,因此总共有两个项目。这些字段应该是:
  • storage_type :该聚合值表示的存储类型。
  • total:每个环境的值的总和。
  • environmentTotal :包含每种环境类型的聚合总计的对象。它有以下子字段:
  • development :特定“ storage_type ”的开发环境的总指标值。
  • Production :该特定“ storage_type ”的生产环境的总指标值。
  • staging :特定“ storage_type ”的暂存环境的总指标值。
您可以使用上面的示例作为输入和预期输出。至此,ChatGPT将会给出更加满意的答案。

下面是一个 Python 函数,它按storage_type标签聚合指标列表:

from collections import defaultdict


def aggregate_metrics_by_storage_type(metrics):

    # 初始化字典以存储聚合值

    storage_type_totals = defaultdict(int)

    environment_totals = defaultdict(lambda: defaultdict(int))


    # Iterate through each metric

    for metric in metrics:

        # 遍历每个指标

        storage_type = metric["labels"]["storage_type"]

        value = metric["value"]


        # 增加存储类型和环境的总数

        storage_type_totals[storage_type] += value

        environment_totals[storage_type][metric["labels"].get("environment", "unknown")] += value


    # 将聚合值转换为所需的格式

    results = []

    for storage_type, total in storage_type_totals.items():

        environment_total = dict(environment_totals[storage_type])

        results.append({

            "storage_type": storage_type,

            "total": total,

            "environmentTotal": environment_total

        })


    return results


results = aggregate_metrics_by_storage_type(metrics)

print(results)


运行上面的示例确实会产生所需的响应,尽管它缺少未使用环境的零值:

[{'storage_type': 'files', 'total': 10000000000, 'environmentTotal': {'production': 10000000000}}, {'storage_type': 'database', 'total': 60000000000, 'environmentTotal': {'development': 50000000000, 'staging': 10000000000}}]


因此我们可以看到,ChatGPT 在实现不包含副作用(例如将输入转换为输出且环境干扰很少)的纯函数时表现良好。  结论 – 使用 ChatGPT 编程的优点和缺点OpenAI 免费提供的当前版本的 ChatGPT (GPT 3.5) 的代码生成功能对于许多用例来说都非常好。但这并不意味着您不需要检查代码是否按预期工作。通过编写单元测试来确保准确性,永远不要想当然地认为一切都会正常。 尽可能改进您的问题,以便为该工具提供更多信息。这通常会产生更好的代码。然而,有些人可能会认为这是一把双刃剑,因为您不会学习从自己的角度理解代码,而是依赖该工具给您答案。 如果可以,请尝试使用收费的 ChatGPT v4(注意:在撰写本文时,OpenAI 目前已满,不接受 ChatGPT v4 的新注册)。最新版本提供了许多改进,包括:
  • 不太可能感到困惑;更有可能提供更好的代码。
  • 具有更大的缓冲区,使您能够在缓冲区溢出并失去上下文、
  • 迫使您再次粘贴代码之前与其交互地讨论更大的程序更长时间。
  • 响应时间更快。
作为一名经验丰富的软件工程师,我对 ChatGPT 的实际潜力有点怀疑。虽然它不会很快取代人类程序员,但如果使用得当,它可以提高您的工作效率,提高效率并消除错误。只需确保您仅将 ChatGPT 用于学习目的或协助完成不需要人工干预的琐碎任务。


相关文章

普通人如何用ChatGPT搞钱?ChatGPT赚钱方法推荐

普通人如何用ChatGPT搞钱?ChatGPT赚钱方法推荐

过去这一段时间,ChatGPT可谓是红得发紫。其实去年已经火过一阵了,我当时还写过几篇相关的文章。但上一次火,更多还是在咱们IT互联网的圈子里火,而这一次是彻底火出圈,各行各业都在争相报告,甚至连很多...

对比ChatGPT 3.5和ChatGPT 4.0,差距真的挺大的!!!

对比ChatGPT 3.5和ChatGPT 4.0,差距真的挺大的!!!

话不多说,直接上图:下面是GPT4的回答,我感觉完全可以通过图灵测试,openAI不这么做可能是不想引起大家的恐慌提问:讲一讲关公战秦琼的故事,为什么关公最后去西天取经了,然后完了又跟朱元璋打天下?C...

程序员如何用ChatGPT解决常见编程问题:实例解析

闪电发卡ChatGPT产品推荐:ChatGPT独享账号:https://xingtupai.com/post/86.htmlChatGPT Plus独享共享账号购买代充:https://xingtup...

如何快速代充ChatGPT Plus账号:4.0会员订阅充值指南

闪电发卡ChatGPT产品推荐:ChatGPT独享账号:https://xingtupai.com/post/86.htmlChatGPT Plus独享共享账号购买代充:https://xingtup...

免费 GPT-4 神器来了,这下我彻底不用写代码了!

免费 GPT-4 神器来了,这下我彻底不用写代码了!

前两天在网上看到了一款基于 GPT-4 的新一代辅助编程神器:Cursor,官网介绍说是与 OpenAI 合作的并且基于 GPT-4 模型(存疑)。简单概况一下:代码真的不用我们自己写了,一行指令,它...

新必应(New Bing)申请出错终极方案

新必应(New Bing)申请出错终极方案

随着ChatGPT的爆火,微软推出了AI驱动的新必应(New Bing),新必应大大提升了Bing的体验和效率,一时间吸引力众多申请和试用。然而很多想要加入新必应候补名单时,却总是报出错了,请重试。弯...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。