顺应潮流,解放双手,让ChatGPT直接编写可融入业务可运行的程序代码(Python3.10实现)
淘宝搜:【天降红包222】领超级红包,京东搜:【天降红包222】
淘宝互助,淘宝双11微信互助群关注公众号 【淘姐妹】
众所周知,ChatGPT可以帮助研发人员编写或者Debug程序代码,但是在执行过程中,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融入业务代码?首先创建Openai接入函数:
import openai openai.api_key="apikey" def generate_code(func, docstring): init_prompt="You are a Python expert who can implement the gichatgpt." definition=f"def{func}" prompt=f"Read this incomplete Python code:\ ```python\ {definition}\ ```" prompt +="\ " 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 gichatgpt." definition=f"def{func}" prompt=f"Read this incomplete Python code:\ ```python\ {definition}\ ```" prompt +="\ " 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就不会返回废话,而是直接交给我们可以运行的代码。
事实上,函数调用环节也可以省略,我们可以使用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:\ ```python\ {code}\ ```") 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确然是神兵利器,吹毛可断,无坚不摧。但工具虽好,也需要看在谁的手里,所谓工具无高下,功力有高深,类比的话,如果倚天剑握在三岁孩童手中,不仅毫无增益,还可能伤其自身,但是握在峨眉掌门灭绝师太手里,那就可以横扫千军如卷席了,那才能体现大宗匠的手段。最后,奉上项目代码,与众乡亲同飨:
微信如何使用Chat Gpt 如何自己开发一个微信聊天机器人
微信如何使用拍一拍功能,微信如何使用指纹支付功能,微信如何使用零钱支付,微信如何使用信用卡支付近期公众号关注人数增长迅猛,大家各类场景各种姿势与chatgpt交互也让我大开眼界。
周末刚好有点时间,写一篇稍长一点的干货文章:深度拆解chatgpt接入微信全流程攻略,以及使用场景方面的优劣分析。并进一步阐述未来可能有的扩展场景应用,欢迎大家参考后多提提建议,一起拓展AIGC/chatgpt方面的实际应用和场景化体验~
可以直接先看一下一个普通国内用户在chatgpt官网的注册使用流程:
买梯子―进入chatgpt pc官网―进入注册流程--使用国外手机号注册―pc网页开始使用。如果想体验最新模型还需要国外银行卡升级到Plus账号
可以看出几个主要的门槛:梯子、国外手机号、电脑网页端使用。门槛带来的效率和成本问题
以及潜在的成本与限制:使用与注册方法调研、账号访问数量限制、高峰期chatgpt账号限流、全英文环境适应等。普通账号使用起来其实也是限制重重,除非升级Plus账号才有更多保障(限流减弱,能力增强)
基于以上思考以及对微信体系的理解,博主考虑提供基于微信公众号/个人号触达体系能力,与chatgpt全面打通整合的解决方案,为国内用户提供在微信体系内的实时触达体验,并保障/增强链路中chatgpt的问答质量体验以及稳定性,保证是原汁原味、甚至能力可进一步调校增强的官方chatgpt能力体验。
方案关键点包含:微信公众号/个人号能力集成、chatgpt官网通信打通以及多账号轮转分流、chatgpt场景增强与限制、未来扩展性分析与新特性集成等方面
可以先从流程节点上分为微信端和chatgpt端
公众号
公众号如何注册?如何接收普通消息并及时回复?消息回复方面是否有限制?
个人号
个人号微信没有任何能力开放,没有接口,个人号如何与服务器打通,使用微信能力收发消息?
GPT3.5版本(chatgpt)一开始没有开放接口,如何与chatgpt网站直接通信?是否有防刷策略?
除此以外,服务器服务的搭建、存储搭建,也是需要整体去调研解决的,成本方面也需要重点考虑。毕竟前期可能没有用户付费,没有收入,成本方面要比较克制一些。
主要经历了个人可用的MVP版本、公众号版本1、高可用高容量版本2的技术能力演进~
针对上述概要的挑战和问题,近一个月从最初版本开始迭代,经历3-5轮优化,目前已沉淀了较完善的、可用性、扩展性较高的微信+chatgpt解决方案能力。
该版本搭建历时两天,为MVP实验版本
核心思路是通过chatgpt框架,调用微信个人号通信能力实现实时对话,通过开源封装的nodejs版本chatgpt网站http调用框架实现与chatgpt的通信。
整体思路比较简单且直接,具体框架方面可参考下方:
chatgpt官方文档,nodejs的微信个人号通信框架
chatgpt官方网站接入,nodejs版本框架
该版本优势:简单方便容易实现,个人随便玩玩基本够用了
该版本主要问题:
- 主要为对话交互不稳定。个人号和chatgpt的稳定性问题,chatgpt通信稳定性和容量问题。
- 个人号较难支撑多人同时对话,除了上述稳定性问题外,还有微信本身的风控机制,可能被封号
经历了个人号的初步尝试和实验,发现微信端与chatgpt的能力整合打通基本可行,主要需要进一步解决个人号上存在的一些使用限制问题,同时为了让更多用户可以发现且直接使用chatgpt能力,我们加入了公众号端的尝试和研发。
主要方案要点为:公众号的注册申请、以及回复能力调用。chatgpt端的通信和调用能力与版本1一致
公众号申请可参考:Sun穿搭:怎样申请公众号?史上最详细步骤,小白都能看得懂!
公众号接收消息与回复能力,直接使用微信公众平台的开放API能力:文本消息 | 微信开放文档
注意上方的公众号接收和回复消息能力,接收用户消息后有15秒超时限制,如果15秒内无法回复,就无法推送消息给到用户了,这也是前期在公众号消息通信方面的较大限制和挑战。
该版本优势:公众号推广覆盖较容易,有官方api接入稳定性保障
该版本主要问题:
- 公众号接收和回复消息能力,接收用户消息后有15秒超时限制。而chatgpt的长文回复一般时间为2-5分钟,基本都无法在一次超时时间内回复用户。(我们通过引导用户重发问题,缓存回答发给用户绕开该问题,但用户体验不佳)
- chatgpt我们这边就一个Plus账号,只能支持同一时间一个用户聊天,如果用户过多需要排队等待,可用性依然较差
基于版本2的回复消息15秒超时限制,以及单账号的并发量承载问题。随着公众号粉丝快速增加。版本2的问题我们需要快速解决,不然与官方的体验差距会持续拉开,价值提供有限。
基于此,我们主要解决了两个问题:
- 公众号被动回复消息的15秒超时限制,我们通过公众号客服消息能力解决。实现任何时刻,想回就回的效果
- 需要注意使用该能力要有企业资质认证,一次认证流程不管是否通过,都要付认证费300元
- 单账号的通信并发、额度限制,我们通过多账号轮转分流解决。截止当前我们已经通过配置化能力上线了10+个新注册的账号,支持百人同时在线访问。账号方面可以根据当前在线人数动态调控和分流。
该版本优势:高可用、服务容量保障,实时触达体验保障。实战下来在百人以上同时使用时也可以提供较好体验和扩展性。用户使用感受与官方原版基本完全一致,遇到官网高峰期限流场景,也可以通过账号检测和切换规避,理论上比官方申请的单账号对单用户可用性更强
该版本主要问题:
- 费账号
- 实现复杂度稍高,涉及账号轮转路由策略、高保障策略
- 与官方网站比,还差一个逐字展现、逐字输出能力,受限于微信本身不具备不提供该接口能力
基础体验问题与容量问题在版本3已得到比较完善的解决
这个最新版本还在研发中,主要能力为场景化的提示工程与chatgpt能力增强引入,以及GPT4.0的能力接入调试(较贵),大家可以继续交流以及期待一下
经历了上述版本历程,我们得到了一个可用性较高、可扩展、体验与官方一致甚至略有增强的微信+chatgpt整合解决方案
因为笔者本身就是AI工程相关的互联网多年从业者,对AI技术的实际应用有着非常浓厚的热情。
大概3年前,GAN这种生成式模型开始风靡,就开始研究AIGC的能力与落地场景。但当时的AI能力应用短板相当明显。
直到近期chatgpt横空出世,让我体会到AI模型能力与应用出现了又一次质的飞跃。
到近期的GPT4.0感觉愈发明显。
而GPT本身目前仍主要在自然语言处理与生成领域,个人判断GPT也好,Stable Diffusion这类图像生成模型,在不远的将来也许会产生更多的碰撞融合,从视觉、听觉、语言表达等多领域、多模态处理提供全新的整合模型能力与解决方案。
从商业场景端,不管是论文写作、行业/日常咨询、图像设计、情绪陪聊,具备广阔的场景~
笔者将在AIGC应用领域持续深耕,也欢迎感兴趣的朋友一起加入探讨,集思广益!
公众号“AI智能畅聊”,随时等你来聊~