前言
就在上周前不久,ChatGPT官方终于出了官方Api,普通用户只需要注册帐号后,去到OpenAi后台(记得科学sw,不然此链接无法打开),生成一个Api Key,即可使用此ApiKey以及官方的Api接口,直接调用ChatGPT。除了聊天会话以外,还支持聊天生成图片、音频转换文字等等,重点是价格非常便宜,终于可以实现ChatGPT自由了。加之本人平时使用命令行比较多,所以就萌生了一个念头,既然ChatGPT那么强大,我是否可以请求ChatGPT帮我实现一个命令行工具,使之可以与其交流?欲知结果如何,请看下文细说。
项目地址
该项目完全无保留的贡献给开源社区,算是ChatGPT为开源社区贡献的又一份力量吧,欢迎大家给予我项目一键三连,哈哈。
hello_chat_gpt
ChatGP全程交流如下
Python实现参数接收与反馈
首先我要实现一个命令行工具与ChatGPT,首选语言我想到了Python。那么Python如何实现参数接收与反馈,我们发起第一个问题。
令人想不到的是这个方案,敲到代码上面去运行,居然报错了!这时候我就得敲打ChatGPT一番了。
经过这次铺垫,我终于生成了一个hello_chat_gpt.py文件,并实现了参数的接收与反馈。
Python如何存储上一次执行的结果
通过分析ChatGPT的接口得知,我们要传递给接口最重要的参数messages是一个数组[{‘role’:‘user’,‘content’:‘xxxxx’}],它可以是单条数据,也可以是多条(如果是多条,ChatGPT就可以对上下文进行联想,不然的话它不知道你之前的对话是啥),所以我们需要Python实现一个存储上一次执行结果的需求。来来来,我们继续问ChatGPT。经过与GPT的数次拉扯,终于得到了一个比较有用的信息。
大概的方式其实就是生成一个临时文件去存储上一次的结果,另外它这里是直接在当前目录上次的,我把它修改为在系统的临时目录生成,最终得到了如下代码。
#每次进入程序,先拿上一次的结果
tmp_path= tempfile.gettempdir()
tmp_file_path= tmp_path + '/previous_result_1.pkl'
result = []
if os.path.exists(tmp_file_path):
with open(tmp_file_path, 'rb') as f:
data = pickle.load(f)
result = data['result']
....此处省略一万行代码
# 保存上一次执行的参数和结果
data = {'args': vars(args), 'result': result}
with open(tmp_file_path, 'wb') as f:
pickle.dump(data, f)
Python实现Post请求
终于到了激动人心的调用接口环节,ChatGPT接口其实就是一个https的post请求带上apikey以及json参数,我们接着问ChatGPT怎么做。
我们把模板代码,套用到GPT接口就得到最终请求代码如下。
# 设置请求头和请求参数
url = 'https://api.openai/v1/chat/completions'
auth='Bearer ' + api_key
headers = {
'Content-Type': 'application/json',
'Authorization': auth,
}
data = {
"model": "gpt-3.5-turbo",
"messages": result,
}
body=json.dumps(data)
response=requests.post(url, data=body,headers=headers,timeout=120.0)
if response.status_code == 200:
success_result=json.loads(response.text)
if 'choices' in success_result.keys():
message=success_result['choices'][0]['message']
role=message['role']
content=message['content']
result += [{'role':role,'content':content}]
print(content)
else:
print('Failed to send message. Error code:', response.status_code)
Python获取环境变量
因为ApiKey每个人都不同,我想到了把ApiKey放到环境变量里面,我们问问GPT怎么做。
得到如下最终代码,如果没有在.zshrc或者.bash_profile其他预设环境变量,我们程序直接结束
api_key=os.getenv('ENV_CHAT_GPT_API_KEY')
if api_key == None:
print('Not have ChatGpt ApiKey , please set your api key in .zshrc or .bash_profile like export ENV_CHAT_GPT_API_KEY= \"Your Chat GPT Api Key\"')
sys.exit(0)
接下来测试Python程序是否正常
我们直接运行脚本先
python3 hello_chat_gpt.py -m 你好
接下来就是激动人心的时刻,ChatGPT给我反馈了!
Python源码打包发布到Brew
我们知道命令行工具其实都是源码编译成最终的二进制文件,并通过包管理工具分发。所以我想把该AI聊天工具发布到brew去给Mac用户使用,所以我们接着问GPT。由于我要同时兼容Intel以及M1系列芯片的Mac机器,所以这个过程我们GPT拉扯了非常之久,最终也是成功解决了所有问题。在此我只提供部分有用花絮给大家参考。
至此,花费了大概一个晚上的时间,我成功的生成了一个自己的brew tap仓库,并把源码编译成二进制文件,并发布到brew上。
hello_chat_gpt使用说明
hello_chat_gp目前仅支持m1系列、或者intel系列的mac机器,稍后会支持window机器。
- 安装hello_chat_gpt
brew tap jerryfans/hello_chat_gpt
#intel Mac machine
brew install hello_chat_gpt
#arm(m1 m2) Mac machine
arch -arm64 brew install hello_chat_gpt
- 配置ApiKey
去Open Ai后台生成ApiKey并导入到.zshrc文件或.bash_profile中。
export ENV_CHAT_GPT_API_KEY="Your Api Key"
- 用法
#发送一条内容到 ChatGPT ,如果有上下文,会把上下文内容都发上次,如果有空格记得用-m 'xxxx xx'不然程序会报错
hello_chat_gpt -m Hello
#发送一条内容到 ChatGPT,但是会强制刷新一次会话,之前的上下文会情况。
hello_chat_gpt --force-m '你好世界'
结语
通过这次ChatGPT面对面的“授课”之旅,我不得不说在编程能力上ChatGPT确实是非常的强大,本次命令行工具基本80%的代码都通过ChatGPT生成,我所做的只是把各种逻辑糅合到一起,最终做出了这个“非常强大的”AI聊天命令行工具hello_chat_gpt,可以说是ChatGPT自己生成了“自己”。当然通过此次实验也得知,ChatGPT终究只是一个强大的工具罢了,目前而言它还无法真正做到100%的人工智能,但大家觉得那一天还会远吗?
更多推荐
ChatGPT教我写了一个AI聊天命令行工具hello_chat_gpt
发布评论