GPT4 作为一种先进的语言生成模型,目前在聊天场景中大放异彩,很多人通过问答来解决一些简单问题。然而,在实际程序开发工作中,我们面临着错综复杂的业务需求和丰富的上下文知识。在这种情况下,简单地将所有任务交给 GPT4 处理显然是不切实际的。
那么问题来了,在这个复杂的真实业务世界里,GPT4 究竟能在哪些方面发挥作用呢?首先,我们需要理解GPT-4的核心优势和局限性。作为一种语言模型,GPT-4擅长处理和生成文本,但在处理需要深入理解和复杂推理的任务时,它可能会遇到困难。因此,我们应该聚焦于那些可以充分利用 GPT4 文本处理能力的场景。
接下来,我们将深入探讨 GPT4 在复杂业务开发中的应用场景。通过几个具体的业务例子,分析如何结合人的专业知识和 GPT4 的文本生成能力,来更高效率、更高标准的完成工作任务。这里以后台开发业务场景为例,其他前端或者算法开发,应该也能有类似的 GPT4 使用场景。
(写这篇文章的时候,GPT4 即将对所有 Plus 用户开放 Code Interpreter,到时候可以直接上传文件,让 AI 写代码并且执行,来分析数据,创建表格等。到时候 GPT4 能完成的工作会更多了,可以期待。)
命令和脚本
日常工作中,往往会遇到一些需要迅速解决的临时问题,这时候编写一些“胶水脚本”就变得不可或缺。这些脚本通常用于执行一些特定的任务,比如从庞大的日志文件中筛选出关键信息,或者对一大段文本进行批量处理。在这种情境下,GPT4 就显得格外强大和好用。
拿过滤格式化的日志来说,一般会用到 awk
, grep
, sort
等工具,刚开始写的话可能要去查文档看语法,比较耗时。如果交给 GPT4 的话,瞬间就能拿到想要的结果。详细可以看我之前的一篇文章 GPT4 帮忙写 sed, awk 数据处理命令,GPT4 可以帮写脚本,解释脚本,纠正错误的脚本,很是方便。
再比如有时候想把 mysql 的执行结果 dump 到一个文件中,mysql 的 client 肯定有一些参数可以完成这个工作,但是需要看文档。交给 GPT4 的话,只用提问,立马就能拿到一个可以用的命令了, GPT4 还会给你详细的参数说明,真香。
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
此外,基本每个后台都会写点 shell 脚本,但 shell 的语法并不那么直观好记,经常需要去边搜索边写。用 GPT4 的话就简单多了,比如可以这样向 GPT4 提需求:
我有一个 csv 文件,里面有两列,name, age, 帮我写一个 shell 脚本,循环读每一行,然后发一个post 请求到 http://demo.com?n=name&a=age ,并且如果请求返回不是 200,打印这一行的内容。
很快就能拿到一个不错的 shell 脚本了:
1 | #!/bin/bash |
除了上面的脚本工作,开发中也会用 Excel 处理一些简单数据。Excel 的功能太过强大,没有深入学习的话,还是很难用的好。比如有一个简单的对比去重任务,在一个 Excel 中,有两列数据,P 和 U,找到所有在 P 和 U 都有的列,然后删除对应的行。交给 GPT4 来完成的话,就很简单,一步步傻瓜式跟着操作就行。
解释、优化代码
虽然 GPT4 还没法理解大型项目的复杂业务逻辑,但是可以用来阅读一小部分代码,解释代码的作用,甚至可以用来优化代码,或者翻译成另一种语言的代码。
解释代码
我们以 Clickhouse 的 CurrentMetrics.cpp 为例。这个类用来统计当前 clickhouse 中的一些观测指标,比如正在执行的 queries 等。但是它的实现用到了宏,看起来有点难懂,可以直接询问 GPT4 实现细节。
GPT4 对这段代码的总体解释如下:
这段代码似乎是一个度量收集系统的一部分,它定义了一系列度量,每个度量都有一个名称和文档字符串,并使用原子变量存储度量值。这可能是一个性能监控或诊断工具的一部分。
对于一些实现细节也有不错的解释,比如
1 | #define M(NAME, DOCUMENTATION) extern const Metric NAME = Metric(__COUNTER__); |
翻译代码
另一个常见的开发场景就是,可能项目用 js 实现了一个计算过程,后来需要用 go 语言实现同样的计算过程。这时候就需要用 go 重写之前的 js 代码,人工来写的话比较费时,这种翻译工作恰恰是 GPT 很擅长的。比如下面这段 js 代码:
1 | function encrypt(str) { |
GPT4 翻译后的 golang 代码如下, 这里不只翻译了这个函数,还提供了完整的测试代码,可以拿来直接用。
1 | package main |
优化代码
除了可以用来解释、翻译代码,GPT4 做重构优化也是很厉害的。看下面的一段 python 代码,if 分支写了一堆,不太优雅。
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
可以让 GPT4 来,简单提示词:”优化下面的代码实现,去掉这里的分支,并且使代码更好扩展“。就能得到一个更好的代码实现,如下所示。
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
如果对这个代码不满意,可以继续让它优化。比如下面这样提示 “可以换一种实现,用一些二分查找的库来实现“,于是又得到一个用到 bisect
模块的写法。Python的 bisect 模块提供了对有序列表进行二分查找的支持,当阈值列表很大时,查找更加高效。新的优化实现如下:
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
生成测试代码
写测试用例是一个费心费力费时间,但是又没有成就感的事情。有了 GPT4,写测试会变得舒服多了,我们只用提供代码实现,然后就可以让 GPT4 来写各种测试用例。比如我在印象笔记导入 notion 的项目 html2notion 中,需要判断一个 url 是不是合法的,于是有了下面的实现:
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
然后就可以让 GPT4 生成 pytest 的测试用例了,如下:
1 | mysql -h [hostname/IP] -P [port] -u [username] -p[password] -D [database] -e "SELECT * FROM [table]" | sed 's/\t/,/g' > output.csv |
这里使用 pytest.mark.parametrize
装饰器为 is_valid_url
和 is_valid_port
函数提供了多个测试用例。是不是很方便,不用自己编码了,拿来就能直接用。
展望
随着AI基础模型的不断发展和进步,我们可以预见,在不久的将来,AI有潜力替代日常开发中的大部分工作。这不仅能大大提高开发效率,还能为开发人员提供更多的空间去关注更加复杂和创新性的任务。
目前市面上已经出现了一些令人瞩目的开源项目,如AutoGPT,只需简洁地描述他们的需求,AutoGPT 就会自动收集相关资料,进行深入的推理分析,编写高效的代码,并执行这些代码。这一切都在 GPT4 的帮助下完成,无需过多的人工干预。
这还是只刚出道没多久的 GPT4,等后面 GPT5,GPTX 出来,会是一番怎么样的场景,真让人期待。最后放一张微软的 AI 发展历程的一个手绘图片,等待更强大的 AI 的到来。