如何做到实时停止Chatgpt的内容输出?

        我们在以流的模式开发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大计。

猜你喜欢

转载自blog.csdn.net/m0_74037076/article/details/131944676