当前位置: 首页 > 后端技术 > Python

顺应潮流,解放双手,让ChatGPT直接帮助编写可以集成到业务中运行的程序代码(Python3.10实现)

时间:2023-03-25 23:11:24 Python

众所周知,ChatGPT可以帮助开发者编写或调试程序代码,但在执行过程中,ChatGPT程序代码的一些相关文字解释和代码段会混合返回。这样一来,研发人员还是需要自己编辑粘贴操作,效率并不理想。这次我们尝试将ChatGPT直接嵌入到代码业务中,让ChatGPT生成直接运行的Code。ChatGPT对问题的主观回答首先,我们对ChatGPT提出了一个简单的代码需求:可以看到,如上所述,ChatGPT会返回文本描述和代码片段混合,其实对于真正的需求者来说,文本描述本身是不必要的,因为如果提问者不知道什么是Bloomfilter,他就不会提出Bloomfilter相关的代码需求。查看ChatGPT返回的布隆过滤器代码:importhashlibclassBloomFilter:def__init__(self,size,hash_count):self.size=sizeself.hash_count=hash_countself.bit_array=[False]*sizedefadd(self,string):对于范围内的种子(self.hash_count):result=hashlib.sha256((string+str(seed)).encode()).hexdigest()index=int(result,16)%self.sizeself.bit_array[index]=Truedef__contains__(self,string):对于范围内的种子(self.hash_count):result=hashlib.sha256((string+str(seed)).encode()).hexdigest()index=int(result,16)%self.sizeifnotself.bit_array[index]:returnFalsereturnTrue总的来说没什么问题。但是主观性太强了,什么是主观性?即ChatGPT不是站在需求方的角度写代码,而是站在自己的角度。不考虑业务的上下文,即类和方法的命名、方法的参数和参数类型或者返回值和类型。这些东西是否满足需求方当前的代码业务。当然,这不是ChatGPT的错。主要是输入的问题描述不够清晰和详细,但是如果每次都需要把代码业务逻辑转成文本告诉ChatGPT,那就画蛇添足了。基于业务配置ChatGPT那么如何将ChatGPT集成到业务代码中呢?首先创建Openai访问函数:importopenaiopenai.api_key="apikey"defgenerate_code(func,docstring):init_prompt="你是Python专家,可以实现给定的函数。"definition=f"def{func}"prompt=f"阅读这段不完整的Python代码:\n```python\n{definition}\n```"prompt+="\n"prompt+=f"完成遵循此指令的Python代码:'{docstring}'。您的响应必须以代码块'```python'开头。”response=openai.ChatCompletion.create(model="gpt-3.5-turbo",temperature=0,max_tokens=1024,top_p=1,messages=[{"role":"system","content":init_prompt,},{“角色”:“用户”,“内容”t":prompt,},],)codeblock=response.choices[0].message.contentcode=next(filter(None,codeblock.split("```python"))).rsplit("```",1)[0]code=code.strip()returncode诀窍是提前设置引导词:init_prompt="YouareaPythonexpertwhocanimplementthegivenfunction."definition=f"def{func}"prompt=f"阅读这段不完整的Python代码:\n```python\n{definition}\n```"prompt+="\n"prompt+=f"完成这条指令后面的Python代码:'{文档字符串}'。Yourresponsemustbestartwithcodeblock'```python'。”这里我们预先设置了两个参数func和docstring,即函数名和函数描述,要求ChatGPT严格按照输入的返回代码参数。现在运行函数:if__name__=='__main__':print(generate_code("test","Sumtwonumbers"))程序返回:?chatgpt_write_code/opt/homebrew/bin/python3.10"/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_writee_code.py"deftest(a,b):returna+b这样ChatGPT就不会返回废话了,直接把我们可以运行的代码交出来装饰器调用ChatGPT。其实函数调用环节也可以省略。我们可以利用Python装饰器的闭包原理,直接将定义函数的参数和描述传递给ChatGPT,然后直接运行装饰后的函数,提高效率:importinspectfromfunctoolsimportwrapsdefchatgpt_code(func):@wraps(func)defwrapper(*args,**kwargs):signature=f'{func.__name__}({",".join(inspect.signature(func).parameters)}):'docstring=func.__doc__.strip()code=generate_code(signature,docstring)print(f"生成代码:\n```python\n{code}\n```")exec(code)returnlocals()[func.__name__](*args,**kwargs)returnwrapper定义方法后,使用基于ChatGPT的装饰器:if__name__=='__main__':@chatgpt_codedefsum_two(num1,num2):"""将两个数字相加。"""print(sum_two(1,2))程序返回:?chatgpt_write_code/opt/homebrew/bin/python3.10"/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_write_code.py"sum_two(num1,num2):generated代码:defsum_two(num1,num2):"""两个数求和。"""returnnum1+num23直接返回所有业务逻辑和运算结果那么现在,回到关于布隆过滤器的问题:if__name__=='__main__':@chatgpt_codedefbloom(target:str,storage:list):"""UseaBloomfiltertocheckifthetargetis在存储中,就用这个func,不用再class"""print(bloom("你好",["你好","Helloworld"]))程序返回:?chatgpt_write_code/opt/homebrew/bin/python3.10"/Users/liuyue/wodfan/work/chatgpt_write_code/chatgpt_write_code.py"生成的代码:defbloom(target,storage):#用全零初始化布隆过滤器bloom_filter=[0]*len(storage)#哈希目标和settheBloomfilter中对应的bit为1foriinrange(len(storage)):iftargetinstorage[i]:bloom_filter[i]=1#检查target对应的所有bit是否都设置为1iniinrange(len(storage))的布隆过滤器:如果目标instorage[i]andbloom_filter[i]==0:returnFalsereturnTrueTrue?chatgpt_write_code丝般顺滑,与业务无缝衔接,像拉链一样重叠,无需挑剔,无需复制复制贴ChatGPT确实是法宝,可破可立,战无不胜。但工具虽好,也要看拥有者是谁。所谓工具不高,功力高。打个比方,倚天剑如果握在一个三岁小孩的手里,不但得不到好处,反而可能伤到自己。在峨嵋掌门灭绝大师手中,他能如席横扫千军,方能体现出工匠的技艺。最后放上项目代码分享给大家:github.com/zcxey2911/chatgptapi\_write\_code