乐趣区

关于后端:人工智能AI聊天ChatGPT新接口模型gpt35turbo闪电更新成本降90Python310接入

南国春迟,春寒料峭略带阴郁,但 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

退出移动版