本文正在参加技术视角深入 ChatGPT 征文活动

北方地区春迟,春寒料峭略带阴霾,但ChatGPT新接口模型gpt-3.5-turbo的更新为咱们带来了一丝暖意,运用本钱更加亲民,比高端产品ChatGPT Plus更实惠也更方便,究竟ChatGPT Plus依然是通过网页端来输出,Api接口是以token的数量来核算价格的,0.002刀每1000个token,token能够理解为字数,说白了便是每1000个字合0.01381人民币,以ChatGPT无与伦比的产品力而言,如此低的运用本钱让一切市面上其他一切类ChatGPT产品都黯然失光。

本次让咱们运用Python3.10光速接入ChatGPT API的新模型gpt-3.5-turbo。

OpenAI库的SDK方法接入

OpenAI官方同步更新了接口Api的三方库openai,版别为0.27.0,如果要运用新的模型gpt-3.5-turbo,就有必要同步装置最新版别:

pip3 install openai==0.27.0

随后树立chat.py文件:

import openai
openai.api_key = "openai的接口apikey"   
completion = openai.ChatCompletion.create(  
  model="gpt-3.5-turbo",   
  messages=[{"role": "user", "content": "北方地区风光,千里冰封,万里雪飘,请接着续写,运用沁园春的词牌"}]  
)  
print(completion["choices"][0]["message"]["content"])

程序回来:

瑶池冰缘,雪舞凄美, 隔窗寒意,好像钻进衣袖。
寒塘渡鸭,雪中梅影, 孤独是一片雪白的姿态。  
冰雪如花,开放在草莓园里, 可爱的雪人,瑟瑟发抖着欢呼。  
北风凛冽,寒暄难挡, 四季明媚,但冬日尤香甜。  
千里冰封,万里雪飘, 窗外天下壮丽,此刻正是京城美。

闪电般秒回,让用惯了ChatGPT网页端的咱们几乎不能适应。

gpt-3.5-turbo,对得起turbo的加成,带涡轮的ChatGPT便是不相同。

ChatGPT谈天上下文

咱们知道ChatGPT的最大特征便是能够联系语境中的上下文,换句话说,ChatGPT能够依据之前的答复来优化之后的答复,形成上下文联系,让人机对话更加连贯和赋有逻辑性。

这儿取决于输入参数中的role参数,每一个role的取值,对应的场景不相同,其中system用于在对话开始时给ChatGPT一个指示或声明,有点像引导词,使得后续的答复更具有个性化和专业化。user是用于给用户提问的或许说是用来给用户输入引导词的。assistant顾名思义,是用于输入ChatGPT的答复内容:

import openai
openai.api_key = "apikey"   
class ChatGPT:  
    def __init__(self,chat_list=[]) -> None:  
        # 初始化对话列表  
        self.chat_list = []  
    # 显现接口回来  
    def show_conversation(self,msg_list):  
        for msg in msg_list:  
            if msg['role'] == 'user':  
                print(f"Me: {msg['content']}\n")  
            else:  
                print(f"ChatGPT: {msg['content']}\n")  
    # 提示chatgpt  
    def ask(self,prompt):  
        self.chat_list.append({"role":"user","content":prompt})  
        response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.chat_list)  
        answer = response.choices[0].message['content']  
        # 增加前史对话,形成上下文联系  
        self.chat_list.append({"role":"assistant","content":answer})  
        self.show_conversation(self.chat_list)

这儿每一次会话都会参加chat_list的谈天列表,人物为assistant,为了让ChatGPT剖析上下文,下面开始测验:

if __name__ == '__main__':
    chat = ChatGPT()  
    chat.ask("你是一位南宋词人,词风悠扬,有点相似李清照女士,请运用蝶恋花词牌描绘北方地区春色")

程序回来:

Me: 你是一位南宋词人,词风悠扬,有点相似李清照女士,请运用蝶恋花词牌描绘北方地区春色  
ChatGPT: 北方地区春色,清冽宜人。望穿秋水的远山如翠崎岖,悠远而缥缈。层层叠叠的林木,新绿徜徉,婆娑摇曳。风儿吹起,动听肺腑,点点梅花飘至,宛如仙界。  
花间蝶恋,春色满园。莺莺燕燕,鸟鸣花落,时时惹人遐思。碧空万里,蓝天白云,彩云飘飘,缤纷夺目。柳絮飘飘,轻羽翩翩,小河潺潺,流水声声,悠扬动听。  
清风拂面,落英缤纷。听着草虫唱起,充满阳光的气味,悄悄飘荡,好像一条无形的小河,打开春天的夸姣,留下夸姣的回忆。人世万象,却只有这春色无边,好像奔向远方的快乐。

此刻再次发问:

chat.ask("请运用别的一种粗狂阳刚的风格再写一遍上面的词")

程序回来:

Me: 请运用别的一种粗狂阳刚的风格再写一遍上面的词  
ChatGPT: 北方地区春色,不柔不媚,金色的阳光照在地上,充满了男人气魄。  
草原上风吹不断,那些疯狂的野花,在春风中舞蹈。  
看!那些猛禽静静地回旋扭转在高空,监督着整片草原,威武雄壮。  
花丛间,一只雄性蜂鹰跃跃欲飞,看上去好像要冲破天边。  
这儿的春天有时带着风沙,但这并不能阻挠狂放豪迈的草原奔腾前行,而这样的北方地区春色,怎会容易被遗忘!

虽然内容有些尬,但确实联系了上下文。

需求注意的是,token不仅核算ChatGPT的接口回来内容,也会核算用户的发送内容,token的核算方法不是简单的一词一个,例如中文输入,一个中文汉字占2个字节数,而关于一次中文测验中,50个汉字被算为100个tokens,差不多是英文的一倍,而token还核算api发送中的人物字段,如果像上文相同完成上下文操作,就有必要发送ChatGPT接口回来的前史谈天列表,这意味着ChatGPT上下文谈天的本钱并不是咱们想象中的那么低,需求谨慎运用。

原生ChatGPT接口异步拜访

除了官方的SDK,新接口模型也支撑原生的Http恳求方法,比如运用requests库:

pip3 install requests

直接恳求openai官方接口:

import requests
h = {  
    'Content-Type': 'application/json',  
    'Authorization': 'Bearer apikey'  
}  
d = {  
    "model": "gpt-3.5-turbo",  
    "messages":[{"role": "user", "content": "请解释同步恳求和异步恳求的差异"}],  
    "max_tokens": 100,  
    "temperature": 0  
}  
u = 'https://api.openai.com/v1/chat/completions'  
r = requests.post(url=u, headers=h, json=d).json()  
print(r)

程序回来:

{'id': 'chatcmpl-6qDNQ9O4hZPDT1Ju902coxypjO0mY',
'object': 'chat.completion',   
'created': 1677902496, 'model': 'gpt-3.5-turbo-0301',   
'usage': {'prompt_tokens': 20, 'completion_tokens': 100, 'total_tokens': 120},   
'choices': [{'message':   
{'role': 'assistant',   
'content': '\n\n同步恳求和异步恳求是指在客户端向服务器发送恳求时,客户端等候服务器呼应的方法不同。\n\n同步恳求是指客户端发送恳求后,有必要等候服务器呼应后才能继续执行后续的代码。在等候服务器呼应的过程中,客户端的界面会被堵塞,用户无法进行'},   
'finish_reason': 'length', 'index': 0}]}

ChatGPT原生接口也支撑异步方法恳求,这儿运用httpx:

pip3 install httpx

编写异步恳求:

h = {
    'Content-Type': 'application/json',  
    'Authorization': 'Bearer apikey'  
}  
d = {  
    "model": "gpt-3.5-turbo",  
    "messages":[{"role": "user", "content": "请解释同步恳求和异步恳求的差异"}],  
    "max_tokens": 100,  
    "temperature": 0  
}  
u = 'https://api.openai.com/v1/chat/completions'  
import asyncio  
import httpx  
async def main():  
    async with httpx.AsyncClient() as client:  
        resp = await client.post(url=u, headers=h, json=d)  
        result = resp.json()  
        print(result)  
asyncio.run(main())

程序回来:

{'id': 'chatcmpl-6qDNQ9O4hZPDT1Ju902coxypjO0mY',
'object': 'chat.completion',   
'created': 1677902496, 'model': 'gpt-3.5-turbo-0301',   
'usage': {'prompt_tokens': 20, 'completion_tokens': 100, 'total_tokens': 120},   
'choices': [{'message':   
{'role': 'assistant',   
'content': '\n\n同步恳求和异步恳求是指在客户端向服务器发送恳求时,客户端等候服务器呼应的方法不同。\n\n同步恳求是指客户端发送恳求后,有必要等候服务器呼应后才能继续执行后续的代码。在等候服务器呼应的过程中,客户端的界面会被堵塞,用户无法进行'},   
'finish_reason': 'length', 'index': 0}]}

咱们也能够将异步恳求方法封装到对话类中,完好代码:

import openai
import asyncio  
import httpx  
openai.api_key = "apikey"   
h = {  
    'Content-Type': 'application/json',  
    'Authorization': f'Bearer {openai.api_key}'  
}  
d = {  
    "model": "gpt-3.5-turbo",  
    "messages":[{"role": "user", "content": "请解释同步恳求和异步恳求的差异"}],  
    "max_tokens": 100,  
    "temperature": 0  
}  
u = 'https://api.openai.com/v1/chat/completions'  
class ChatGPT:  
    def __init__(self,chat_list=[]) -> None:  
        # 初始化对话列表  
        self.chat_list = []  
    # 异步拜访  
    async def ask_async(self,prompt):  
        d["messages"][0]["content"] = prompt  
        async with httpx.AsyncClient() as client:  
            resp = await client.post(url=u, headers=h, json=d)  
            result = resp.json()  
            print(result)  
    # 显现接口回来  
    def show_conversation(self,msg_list):  
        for msg in msg_list:  
            if msg['role'] == 'user':  
                print(f"Me: {msg['content']}\n")  
            else:  
                print(f"ChatGPT: {msg['content']}\n")  
    # 提示chatgpt  
    def ask(self,prompt):  
        self.chat_list.append({"role":"user","content":prompt})  
        response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.chat_list)  
        answer = response.choices[0].message['content']  
        # 增加前史对话,形成上下文联系  
        self.chat_list.append({"role":"assistant","content":answer})  
        self.show_conversation(self.chat_list)  
if __name__ == '__main__':  
    chat = ChatGPT()  
    chat.ask("你是一位南宋词人,词风悠扬,有点相似李清照女士,请运用蝶恋花词牌描绘北方地区春色")  
    chat.ask("请运用别的一种粗狂阳刚的风格再写一遍上面的词")  
    asyncio.run(chat.ask_async("请解释同步恳求接口和异步恳求接口的差异"))

结语

低本钱ChatGPT接口模型gpt-3.5-turbo更容易接入三方的客户端,比如微信、QQ、钉钉群之类,比起ChatGPT网页端,ChatGPT接口的呼应速度更加迅速且稳定,ChatGPT,永久的神,没有之一,且不可替代,最后奉上异步上下文封装项目,与君共觞:github.com/zcxey2911/chatgpt_api_Contextual_async