我们在以流的模式开发Chatgpt的应用时,通常会需要有一个能够停止Chatgpt内容输出的功能。如下图所示:
我们如果用OpenAI的模块开发这样的代码时,一般会这样写实现代码:
import time
import openai
# 设置OpenAI API访问密钥
openai.api_key = "YOUR_API_KEY"
class ChatGPTStream:
def __init__(self):
self.stop_flag = False
def 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
)
# 获取生成的回调URL
callback_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 = False
self.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大计。