众所周知,ChatGPT可以帮助研发人员编写或者Debug程序代码,但是在执行过程中,ChatGPT会将程序代码的一些相关文字解释和代码段混合着返回,如此,研发人员还需要自己进行编辑和粘贴操作,效率上差强人意,本次我们试图将ChatGPT直接嵌入到代码业务中,让ChatGPT生成可以直接运行的代码。

ChatGPT的主观回答问题

首先,我们向ChatGPT提出一个简单的代码需求:

可以看到,就像上文所描述的那样,ChatGPT会将文字描述和代码片段混合着返回,其实对于真正的需求者来说,文字描述本身是不必要的,因为如果提问者不知道什么是布隆过滤器,也就不会提出布隆过滤器相关的代码需求。

再看ChatGPT返回的布隆过滤器代码:

import hashlib  

class BloomFilter:
def __init__(self, size, hash_count):
self.size = size
self.hash_count = hash_count
self.bit_array = [False] * size def add(self, string):
for seed in range(self.hash_count):
result = hashlib.sha256((string + str(seed)).encode()).hexdigest()
index = int(result, 16) % self.size
self.bit_array[index] = True def __contains__(self, string):
for seed in range(self.hash_count):
result = hashlib.sha256((string + str(seed)).encode()).hexdigest()
index = int(result, 16) % self.size
if not self.bit_array[index]:
return False
return True

大体上,没有毛病。但是主观性太强,什么是主观性?就是ChatGPT其实不是站在需求者的视角来编写代码,而是站在自己的角度上,它没有考虑业务的上下文关系,也就是类和方法命名、方法参数、以及参数类型或者返回值以及类型,这些东西是否符合需求者当前的代码业务。

当然,这并不是ChatGPT的错,主要是输入的问题描述不够明确和详细,但如果每次都需要将代码业务逻辑转化为文字告诉ChatGPT,又有些画蛇添足,狗尾续貂之感。

基于业务配置ChatGPT

那么怎样将ChatGPT融入业务代码?首先创建Openai接入函数:

import openai  

openai.api_key = "apikey"  

def generate_code(func, docstring):
init_prompt = "You are a Python expert who can implement the given function."
definition = f"def {func}"
prompt = f"Read this incomplete Python code:\n```python\n{definition}\n```"
prompt += "\n"
prompt += f"Complete the Python code that follows this instruction: '{docstring}'. Your response must start with code block '```python'." response = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
temperature=0,
max_tokens=1024,
top_p=1,
messages=[
{
"role": "system",
"content": init_prompt,
},
{
"role": "user",
"content": prompt,
},
],
) codeblock = response.choices[0].message.content
code = next(filter(None, codeblock.split("```python"))).rsplit("```", 1)[0]
code = code.strip() return code

诀窍就是提前设置好引导词:

init_prompt = "You are a Python expert who can implement the given function."
definition = f"def {func}"
prompt = f"Read this incomplete Python code:\n```python\n{definition}\n```"
prompt += "\n"
prompt += f"Complete the Python code that follows this instruction: '{docstring}'. Your response must start with code block '```python'."

这里我们提前设置两个参数func和docstring,也就是函数名和功能描述,要求ChatGPT严格按照参数的输入来返回代码,现在运行函数:

if __name__ == '__main__':  

    print(generate_code("test","Sum two numbers"))

程序返回:

➜  chatgpt_write_code /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_write_code.p
y"
def test(a, b):
return a + b

如此一来,ChatGPT就不会返回废话,而是直接交给我们可以运行的代码。

装饰器调用ChatGPT

事实上,函数调用环节也可以省略,我们可以使用Python装饰器的闭包原理,直接将所定义函数的参数和描述传递给ChatGPT,随后再直接运行被装饰的函数,提高效率:

import inspect
from functools import wraps def chatgpt_code(func):
@wraps(func)
def wrapper(*args, **kwargs):
signature = f'{func.__name__}({", ".join(inspect.signature(func).parameters)}):'
docstring = func.__doc__.strip()
code = generate_code(signature, docstring)
print(f"generated code:\n```python\n{code}\n```")
exec(code)
return locals()[func.__name__](*args, **kwargs) return wrapper

将方法定义好之后,使用基于ChatGPT的装饰器:

if __name__ == '__main__':  

    @chatgpt_code
def sum_two(num1,num2):
"""
Sum two numbers.
""" print(sum_two(1,2))

程序返回:

➜  chatgpt_write_code /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_write_code.p
y"
sum_two(num1, num2):
generated code: def sum_two(num1, num2):
"""
Sum two numbers.
"""
return num1 + num2 3

直接将业务逻辑和运行结果全部返回。

那么现在,回到开篇的关于布隆过滤器的问题:

if __name__ == '__main__':  

    @chatgpt_code
def bloom(target:str,storage:list):
"""
Use a Bloom filter to check if the target is in storage , Just use this func , no more class
""" print(bloom("你好",["你好","Helloworld"]))

程序返回:

➜  chatgpt_write_code /opt/homebrew/bin/python3.10 "/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_write_code.p
y"
generated code: def bloom(target, storage):
# Initialize the Bloom filter with all zeros
bloom_filter = [0] * len(storage) # Hash the target and set the corresponding bit in the Bloom filter to 1
for i in range(len(storage)):
if target in storage[i]:
bloom_filter[i] = 1 # Check if all the bits corresponding to the target are set to 1 in the Bloom filter
for i in range(len(storage)):
if target in storage[i] and bloom_filter[i] == 0:
return False return True True
➜ chatgpt_write_code

丝滑流畅,和业务衔接得天衣无缝,拉链般重合,不需要挑挑拣拣,也不必复制粘贴。

结语

毫无疑问,ChatGPT确然是神兵利器,吹毛可断,无坚不摧。但工具虽好,也需要看在谁的手里,所谓工具无高下,功力有高深,类比的话,如果倚天剑握在三岁孩童手中,不仅毫无增益,还可能伤其自身,但是握在峨眉掌门灭绝师太手里,那就可以横扫千军如卷席了,那才能体现大宗匠的手段。最后,奉上项目代码,与众乡亲同飨:github.com/zcxey2911/chatgptapi_write_code

顺应潮流,解放双手,让ChatGPT不废话直接帮忙编写可融入业务可运行的程序代码(Python3.10实现)的更多相关文章

  1. 写完批处理脚本,再写个Gradle脚本,解放双手

    前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...

  2. .NET开源的背后:是无奈,还是顺应潮流?

    摘要:微软.NET的开源,让很多开发者欣喜若狂.同一时候也有很多人好奇其背后的故事,过去视开源为癌症的微软为什么会突然有这一举措,是出于无奈,还是顺应潮流,而这当中的种种也许能够用文中的六个观点来说明 ...

  3. 10行Python代码自动清理电脑内重复文件,解放双手!

    大家好,又到了Python办公自动化系列. 今天分享一个系统层面的自动化案例: 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做 ...

  4. 解放双手,markdown文章神器,Typora+PicGo+七牛云图床实现自动上传图片

    本文主要分享使用Typora作为Markdown编辑器,PicGo为上传图片工具,使用七牛云做存储来解放双手实现图片的自动化上传与管理.提高写作效率,提升逼格.用过 Markdown 的朋友一定会深深 ...

  5. 10个 解放双手的 IDEA 插件,这些代码都不用写(第二弹)

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 鸽了很久没发文,不写文章的日子真的好惬意,每天也不用愁着写点什 ...

  6. 把盏言欢,款款而谈,ChatGPT结合钉钉机器人(outgoing回调)打造人工智能群聊/单聊场景,基于Python3.10

    就像黑火药时代里突然诞生的核弹一样,OpenAI的ChatGPT语言模型的横空出世,是人工智能技术发展史上的一个重要里程碑.这是一款无与伦比.超凡绝伦的模型,能够进行自然语言推理和对话,并且具有出色的 ...

  7. 解放双手——相机与IMU外参的在线标定

    本文作者 沈玥伶,公众号:计算机视觉life,编辑部成员 一.相机与IMU的融合 在SLAM的众多传感器解决方案中,相机与IMU的融合被认为具有很大的潜力实现低成本且高精度的定位与建图.这是因为这两个 ...

  8. 解放双手——Android自动化测试

    解放程序猿宝贵的右手(或者是左手) http://blog.csdn.net/eclipsexys/article/details/45622813 --Android自动化测试技巧 Google大神 ...

  9. 解放双手——Android的自动化构建及发布

    在一个App从开发到测试的过程中,我有很长一段时间都是这样做的:打包,上传到tower,在tower上编写本次更新说明,通知测试.一般情况下,打包及上传的过程大概也就2分钟.除此之外,由于项目代码有作 ...

  10. 还在被数据分析报告折磨?Smartbi让你解放双手

    数据分析报告贯穿了企业经营的时时刻刻,方方面面. 数据分析报告最常用于汇报分享:团队需要分享.沟通,数据分析师需要洞察数据.分析结果分享给企业领导.团队同事.大众媒体及更多的利益相关方. 数据分析报告 ...

随机推荐

  1. 最简单明了的yield from解释

    def one(): print('one start') res = yield from two() print('function get res: ', res) return 'one' + ...

  2. labwindows excel 不同电脑上无法保存

    存到c盘以外的盘,c盘因为权限问题可能无法写入

  3. 重写react-navigation的stackNaviagtor产生的默认导航栏header样式

    主要是默认的stackNavigator产生的效果,很难看 重写这个阴影,在当前路由配置的 navigationOptions里的 headerStyle写样式 navigationOptions:{ ...

  4. git ssh 22 失效

    Host github.com User 2070152270@qq.com Hostname ssh.github.com PreferredAuthentications publickey Id ...

  5. Web实时通信之SignalR

    前言 对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接:但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知.监控看板信息自动刷新等实时通信 ...

  6. 【七侠传】冲刺阶段--Day2

    [七侠传]冲刺阶段--Day2 团队成员 20181221曾宇涛 20181202李祎铭 20181209沙桐 20181215薛胜瀚 20181216杨越麒 20181223何家豪 20181232 ...

  7. libevent学习之入门--[01]概述与安装

    网上关于libevent的介绍不在少数,我相信目前看到我这篇博客时已经基本了解libevent是用来做什么的,有什么功能,在此就不重复介绍了.我会按照我学习的过程来完整记录整个库的所有核心内容和具体应 ...

  8. windows根据文件名找到进程,并杀死进程。

    背景:最近因为工作原因,装了360杀毒引擎,完了就卸载了.发现一直提示文件正在使用无法删除.文件无法访问等等.经过一系列操作,安全模式下都无法删除,恶心死了... 1.shirt + del 按文件夹 ...

  9. Latex Algorithm 语法错误导致无法编译

    遇到了几种情况: 1. for 循环没加{} 2. $\textbf{T_i}$, 想要加粗T,但是把i也扩进去了,latex就不懂了,于是一直recompile不出来说超时什么什么的,把i放到外面就 ...

  10. Spring Boot基础依赖

    <properties> <java.version>1.8</java.version></properties><parent> < ...