某次在有幸能够听jyy老师著名的操作系统课时,我被老师在课上遇到什么问题便毫不犹豫地询问gpt-4-turbo所震撼到了,看来不仅是学生们喜欢GPT,许多开明的老师也有鼓励学生(合规地)在GPT的辅助下进行学习。当然我所震撼的倒也不是因为这个,一小部分是因为当时的gpt-4-turbo对我来说还是太过奢侈,主要还是jyy老师并非像大多数人一样在openai官网或是在别的第三方网站上使用AI大模型,而是直接在终端中输入某某命令(可惜没记下来),然后便可以直接在终端与大模型进行交互。显然,这是通过API来实现的。虽然这未必真的就比直接在网站上问方便多少,但对于没怎么见过世面的我来说还是太酷了,这才是一个现代化的终端理应做到的事情。于是那节课后的我关于如何在自己的终端上复现这种效果陷入了沉思。
下面便是我使用Python调用openai的API来实现终端调用大模型的示例,某种意义上来说,相当一部分也是在大模型的帮助下才写出来的。(也是自产自销了)
既然要调用API,首先肯定得有API啊。最简单的当然是去官网去获取一个,或者是找第三方网站获取一个,后者大多数情况下更便宜一些,当然也有跑路的风险。有了API,便可以连同其他与环境相关的参数放在一个我个人比较喜欢的json
文件中,看起来像这样:
json{
"api_key": "xxxxx",
"url": "https://xxxxx",
"model": "gpt-4-turbo",
"context_len": 5,
"stream": true
}
api_key
是API,url
是目标网站,如果是官方API就是https://api.openai.com/
,否则在第三方网站中也会提及,model
是使用的大模型类型,context_len
是上下文长度。
首先要搞清楚发送请求的基本数据结构,看起来是下面这样的:
python{
"role": "system",
"content": "你是我的AI助手,将对我的提问进行精简明晰且完整的回答。",
}
其中role
是发起对话的角色,content
是对话的内容。一个这样的数据结构就是一次对话,发起请求时可以连带着多个对话,最后一个对话显然就是用户说的话,而之前的则是作为对话的上下文。至于到底该怎么发送请求,慢慢学习官网的API文档吧_(:зゝ∠)_
向大模型提问时对话的上下文是很重要的,否则很可能会出现答非所问的情况,也没有办法接着上一个问题继续提问。至于该怎样保存上下文,那便是在对话过程中将人的提问和大模型的回答都记录下来,然后在发送请求时一并发送出去。没错,AI大模型没有记忆,那只能由我们代为保管(¬_¬)。当然由于API是tokens计费的原因,随着发送时的提示词增加,每次消耗的money也会越来越多。咱的钱也不是大风刮来的不是?所以又只好再加上一个限制:上下文长度。就比如上下文长度为5,也就是我们只保存最近的5次对话记录,再老的对话就直接丢弃掉,这样就能守护好我们的钱袋子了( ̄▽ ̄)。
另外这样保存对话记录还有个额外的作用:那便是记录日志。日后难免还有可能会回过头来查看对话的内容,这时候终端都可能关了且不谈,上下文也只能记录最近5次对话的内容。为了不让更早花的钱打水漂,我们也理应将所有的对话内容记录在日志文件中。
到这里我们还应该补充一句,这里调用API是以 流(stream) 的形式进行的。一般来说,我们与网络应该只发生两次交互,一次是发送请求,另一次是接收回应。但众所周知,AI大模型生成回应的速度可能很慢,此时你就不得不等到大模型将回应全部生成完毕,你才能接收到信息。而如果向被调用方发送一个流请求,这时便会建立一个流通路,你不必等待回应生成完毕,而是会自动将大模型当前已生成的内容一段一段地传输到我们的程序中。此时程序每接收到一段就可以立即打印,同时记录具体内容,并在全部打印完成后记录到上下文与日志中。
可以说我们调用大模型API的程序基本已经写完了,但就便捷性来说该程序存在的意义仍有待商榷:我们不得不先跑到程序所在的目录下,然后再用python去运行python .\gpt.py
,由于虚拟环境的存在还不得不先激活虚拟环境.\.venv\Scripts\activate
,可以说离jyy老师在课上展示的效果还差得远。
首先是,如何一键去cd到该目录下,然后激活虚拟环境,最后运行该python脚本。我们再次想到了bat文件。随便问一问GPT就得到了一个简单又好用的bat脚本:
powershell@echo off cd /d "F:/code/light/Python/openai/" call "./.venv/Scripts/activate" python "./gpt.py"
这里"F:/code/light/Python/openai/"
便是程序所在的目录。这样无论该bat文件放在哪里,都可以点击直接运行本程序了。
仅仅是这样还不够,我们还希望能在终端中直接输入某命令,然后就能立即运行本程序。这时候就需要用到环境变量了,这里推荐将一些需要一键调用的bat文件统一放在某个文件夹中,然后将文件夹添加到PATH
变量中。比如说我们的bat文件叫作gpt.bat
,那么此时我们在终端中输入gpt
就可以直接运行程序了。
于是乎,我们也终于可以拿这个来装x了。碰到某个问题时,Win + X
、I
、gpt
、直接提问,一套操作行云流水,相信没几个人在这套连招下不会说教练,我想学这个的。
在本文中,我们实现了在现代机器上已近乎淘汰的终端上调用最前沿的AI大模型,可谓是老树开花,可喜可贺,可喜可贺。