前言

就在上周前不久,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