经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python3 » 查看文章
重新定义性价比!人工智能AI聊天ChatGPT新接口模型gpt-3.5-turbo闪电更新,成本降90%,Python3.10接入
来源:cnblogs  作者:刘悦的技术博客  时间:2023/3/6 9:14:05  对本文有异议

北国春迟,春寒料峭略带阴霾,但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,就必须同步安装最新版本:

  1. pip3 install openai==0.27.0

随后建立chat.py文件:

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

程序返回:

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

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

gpt-3.5-turbo,对得起turbo的加成,带涡轮的ChatGPT就是不一样。

ChatGPT聊天上下文

我们知道ChatGPT的最大特色就是可以联系语境中的上下文,换句话说,ChatGPT可以根据之前的回答来优化之后的回答,形成上下文关系,让人机对话更加连贯和富有逻辑性。

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

  1. import openai
  2. openai.api_key = "apikey"
  3. class ChatGPT:
  4. def __init__(self,chat_list=[]) -> None:
  5. # 初始化对话列表
  6. self.chat_list = []
  7. # 显示接口返回
  8. def show_conversation(self,msg_list):
  9. for msg in msg_list:
  10. if msg['role'] == 'user':
  11. print(f"Me: {msg['content']}\n")
  12. else:
  13. print(f"ChatGPT: {msg['content']}\n")
  14. # 提示chatgpt
  15. def ask(self,prompt):
  16. self.chat_list.append({"role":"user","content":prompt})
  17. response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.chat_list)
  18. answer = response.choices[0].message['content']
  19. # 添加历史对话,形成上下文关系
  20. self.chat_list.append({"role":"assistant","content":answer})
  21. self.show_conversation(self.chat_list)

这里每一次会话都会加入chat_list的聊天列表,角色为assistant,为了让ChatGPT分析上下文,下面开始测试:

  1. if __name__ == '__main__':
  2. chat = ChatGPT()
  3. chat.ask("你是一位南宋词人,词风婉约,有点类似李清照女士,请使用蝶恋花词牌描写北国春光")

程序返回:

  1. Me: 你是一位南宋词人,词风婉约,有点类似李清照女士,请使用蝶恋花词牌描写北国春光
  2. ChatGPT: 北国春光,清冽宜人。望眼欲穿的远山如翠起伏,遥远而缥缈。层层叠叠的林木,新绿徜徉,婆娑摇曳。风儿吹起,沁人心脾,点点梅花飘至,宛如仙境。
  3. 花间蝶恋,春色满园。莺莺燕燕,鸟鸣花落,时时惹人遐思。碧空万里,蓝天白云,彩云飘飘,缤纷夺目。柳絮飘飘,轻羽翩翩,小河潺潺,流水声声,婉转动人。
  4. 清风拂面,落英缤纷。听着草虫唱起,充满阳光的气息,轻轻飘荡,仿佛一条无形的小河,展开春天的美好,留下美好的记忆。人间万象,却只有这春色无边,似乎奔向远方的快乐。

此时再次发问:

  1. chat.ask("请使用另外一种粗狂阳刚的风格再写一遍上面的词")

程序返回:

  1. Me: 请使用另外一种粗狂阳刚的风格再写一遍上面的词
  2. ChatGPT: 北国春光,不柔不媚,金色的阳光照在地上,充满了男子气概。
  3. 草原上风吹不断,那些疯狂的野花,在春风中舞蹈。
  4. 看!那些猛禽静静地盘旋在高空,监视着整片草原,威武雄壮。
  5. 花丛间,一只雄性蜂鹰跃跃欲飞,看上去仿佛要冲破天际。
  6. 这里的春天有时带着风沙,但这并不能阻止狂放豪迈的草原奔腾前行,而这样的北国春光,怎会轻易被遗忘!

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

需要注意的是,token不仅计算ChatGPT的接口返回内容,也会计算用户的发送内容,token的计算方法不是简单的一词一个,例如中文输入,一个中文汉字占2个字节数,而对于一次中文测试中,50个汉字被算为100个tokens,差不多是英文的一倍,而token还计算api发送中的角色字段,如果像上文一样实现上下文操作,就必须发送ChatGPT接口返回的历史聊天列表,这意味着ChatGPT上下文聊天的成本并不是我们想象中的那么低,需要谨慎使用。

原生ChatGPT接口异步访问

除了官方的SDK,新接口模型也支持原生的Http请求方式,比如使用requests库:

  1. pip3 install requests

直接请求openai官方接口:

  1. import requests
  2. h = {
  3. 'Content-Type': 'application/json',
  4. 'Authorization': 'Bearer apikey'
  5. }
  6. d = {
  7. "model": "gpt-3.5-turbo",
  8. "messages":[{"role": "user", "content": "请解释同步请求和异步请求的区别"}],
  9. "max_tokens": 100,
  10. "temperature": 0
  11. }
  12. u = 'https://api.openai.com/v1/chat/completions'
  13. r = requests.post(url=u, headers=h, json=d).json()
  14. print(r)

程序返回:

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

ChatGPT原生接口也支持异步方式请求,这里使用httpx:

  1. pip3 install httpx

编写异步请求:

  1. h = {
  2. 'Content-Type': 'application/json',
  3. 'Authorization': 'Bearer apikey'
  4. }
  5. d = {
  6. "model": "gpt-3.5-turbo",
  7. "messages":[{"role": "user", "content": "请解释同步请求和异步请求的区别"}],
  8. "max_tokens": 100,
  9. "temperature": 0
  10. }
  11. u = 'https://api.openai.com/v1/chat/completions'
  12. import asyncio
  13. import httpx
  14. async def main():
  15. async with httpx.AsyncClient() as client:
  16. resp = await client.post(url=u, headers=h, json=d)
  17. result = resp.json()
  18. print(result)
  19. asyncio.run(main())

程序返回:

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

我们也可以将异步请求方式封装到对话类中,完整代码:

  1. import openai
  2. import asyncio
  3. import httpx
  4. openai.api_key = "apikey"
  5. h = {
  6. 'Content-Type': 'application/json',
  7. 'Authorization': f'Bearer {openai.api_key}'
  8. }
  9. d = {
  10. "model": "gpt-3.5-turbo",
  11. "messages":[{"role": "user", "content": "请解释同步请求和异步请求的区别"}],
  12. "max_tokens": 100,
  13. "temperature": 0
  14. }
  15. u = 'https://api.openai.com/v1/chat/completions'
  16. class ChatGPT:
  17. def __init__(self,chat_list=[]) -> None:
  18. # 初始化对话列表
  19. self.chat_list = []
  20. # 异步访问
  21. async def ask_async(self,prompt):
  22. d["messages"][0]["content"] = prompt
  23. async with httpx.AsyncClient() as client:
  24. resp = await client.post(url=u, headers=h, json=d)
  25. result = resp.json()
  26. print(result)
  27. # 显示接口返回
  28. def show_conversation(self,msg_list):
  29. for msg in msg_list:
  30. if msg['role'] == 'user':
  31. print(f"Me: {msg['content']}\n")
  32. else:
  33. print(f"ChatGPT: {msg['content']}\n")
  34. # 提示chatgpt
  35. def ask(self,prompt):
  36. self.chat_list.append({"role":"user","content":prompt})
  37. response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.chat_list)
  38. answer = response.choices[0].message['content']
  39. # 添加历史对话,形成上下文关系
  40. self.chat_list.append({"role":"assistant","content":answer})
  41. self.show_conversation(self.chat_list)
  42. if __name__ == '__main__':
  43. chat = ChatGPT()
  44. chat.ask("你是一位南宋词人,词风婉约,有点类似李清照女士,请使用蝶恋花词牌描写北国春光")
  45. chat.ask("请使用另外一种粗狂阳刚的风格再写一遍上面的词")
  46. asyncio.run(chat.ask_async("请解释同步请求接口和异步请求接口的区别"))

结语

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

原文链接:https://www.cnblogs.com/v3ucn/p/17182516.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号