我们在以流的模式开发Chatgpt的应用时,通常会需要有一个能够停止Chatgpt内容输出的功能。如下图所示:
我们如果用OpenAI的模块开发这样的代码时,一般会这样写实现代码:
import time
import openai# 设置OpenAI API访问密钥
openai.api_key = "YOUR_API_KEY"class ChatGPTStream:def __init__(self):self.stop_flag = Falsedef callback(self, response):# 在回调函数中处理ChatGPT的响应# 这里只是简单地打印响应内容,您可以根据需求进行其他处理print(response['choices'][0]['text'])def generate(self):# 创建Completion对象completion = openai.Completion.create(engine='text-davinci-003',prompt='What is your question?',temperature=0.7,max_tokens=100)# 获取生成的回调URLcallback_url = completion['choices'][0]['callback_url']# 使用长轮询来获取ChatGPT的响应while not self.stop_flag:response = openai.Completion.fetch(callback_url)self.callback(response)time.sleep(3) # 每个循环等待3秒def start(self):self.stop_flag = Falseself.generate()def stop(self):self.stop_flag = True# 示例使用方法
stream = ChatGPTStream()
stream.start()# 点击按钮来停止生成请求
stream.stop()
可以看到,这种方式并不是真正意义上的实时停止,我们只是暂停了 openai.Completion.fetch
获取输出内容,但OpenAI还是会源源不断继续发送内容过来,造成了token的实际消耗。
那么,究竟如何实现实时停止Chatgpt的内容输出呢?
这里提供两种思路:
- 如果我们是直接用
EventSource
协议直连OpenAI的话,也是可以通过eventSource.close()
方法真正实时中断内容输出的。 - 如果我们是采用
WebSocket
协议的话,如Bmob AI SDK的采用的方式,可以直接通过关闭WebSocket
连接,同样可以达到实时中断内容输出的目的。
当然了,不管是什么样的方法,都要优先考虑可行性,分析这两种协议的优缺点,找出对你最有利的实现方式出来。不管黑猫白猫,能抓老鼠的就是好猫。
欢迎对AI应用感兴趣的朋友联系我(微信:xiaowon12),一起交流AI大计。
本文链接:https://my.lmcjl.com/post/10404.html
展开阅读全文
4 评论