如何流式传输 OpenAi gpt-3.5 响应并在 tkinter 框架 python 中显示?

问题描述 投票:0回答:1

我想流式传输 Openai gpt-3.5 响应并在 tkinter 框架中显示。下面的代码工作正常,但问题是每个流式块都显示在新行中。我想正确地加入这些流式块并在聊天框架中显示为完整的句子。我不知道如何正确执行此操作。有人可以帮忙吗?下面是我的代码:

import tkinter as tk
from tkinter import ttk
from datetime import datetime
import openai
import json
import requests


history = []
# Create a function to use ChatGPT 3.5 turbo to answer a question based on the prompt
def get_answer_from_chatgpt(prompt, history):
    openai.api_key = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    print("Trying")

    messages = [
            {"role": "system", "content": "You are a helpful assistant."}
        ]

    for sender, message in history:
            messages.append({"role": sender, "content": message})

    try:
        stream = openai.chat.completions.create(
            model="gpt-3.5-turbo",
            messages=messages,
            stream=True,
            
        )
        for chunk in stream:
            #answer = chunk.message.content.strip()
            if chunk.choices[0].delta.content is not None:
               chunk = chunk.choices[0].delta.content          
               append_to_chat_log("Gpt-3.5-turbo", chunk)
               #answer = response.choices[0].message.content.strip()
               history.append(("assistant", chunk))
               print(chunk)
        print("Streamig complete")        
    except Exception as e:
        print(e)
        return "Sorry, an error occurred while processing your request."

# Create a function to use OpenAI to answer a question based on the search results

def append_to_chat_log(sender, message):
    chat_log.config(state=tk.NORMAL)
    chat_log.insert(tk.END, f"{sender}:\n\n", ("sender",))
    chat_log.insert(tk.END, f"{message}\n\n\n")
    chat_log.tag_config("sender", font=('Arial', 12, 'bold'))
    chat_log.config(state=tk.DISABLED)
    chat_log.see(tk.END)


def send_message(event=None):
    global history
    message = message_entry.get(1.0, "end-1c") 
    message = message.strip()
    message_entry.delete(1.0, tk.END)
    message_entry.update()
    
    if not message:
        pass 
    else:
              
        append_to_chat_log("User", message)
        history.append(("user", message))
        if len(history) >4:
            history = history[-4:]
        print(message)
        response = get_answer_from_chatgpt(message, history)
        append_to_chat_log("Gpt", response)
        history.append(("assistant", response))

root = tk.Tk()

root.title("Chat")

# Maximize the window
root.attributes('-zoomed', True)

chat_frame = tk.Frame(root)
chat_frame.pack(expand=True, fill=tk.BOTH)

chat_log = tk.Text(chat_frame, state='disabled', wrap='word', width=70, height=30, font=('Arial', 12), highlightthickness=0, borderwidth=0)
chat_log.pack(side=tk.LEFT, padx=(500,0), pady=10)

message_entry = tk.Text(root, padx=17, insertbackground='white', width=70, height=1, spacing1=20, spacing3=20, font=('Open Sans', 14))
message_entry.pack(side=tk.LEFT, padx=(500, 0), pady=(0, 70))  # Adjust pady to move it slightly above the bottom
message_entry.insert(1.0, "Ask me anything...")
message_entry.mark_set("insert", "%d.%d" % (0,0))
message_entry.bind("<Return>", send_message)

root.mainloop()
python tkinter tkinter-entry tkinter-layout tkinter-button
1个回答
0
投票

如果您希望将所有块记录为单个句子,则需要修改

append_to_chat_log()
,以便在插入块后不插入换行符:

def append_to_chat_log(sender=None, message=None):
    chat_log.config(state="normal")
    if sender:
        chat_log.insert("end", f"{sender}:\n", "sender")
    if message:
        chat_log.insert("end", message)
    chat_log.config(state="disabled")
    chat_log.see("end")
    chat_log.update()

然后修改

get_answer_from_chatgpt()
以适应更改:

def get_answer_from_chatgpt(prompt, history):
    ...
    try:
        ...
        # log the sender only
        append_to_chat_log("Gpt-3.5-turbo")
        for chunk in stream:
            # log the chunk only
            append_to_chat_log(message=chunk)
        # if you want, append newlines after inserting all the chunks
        append_to_chat_log(message="\n\n\n")
        print("Streaming complete")
    except:
        ...

请注意,您还需要修改

send_message()
以适应
append_to_chat_log()
的更改。

创建

chat_log.tag_config("sender", font=("Arial", 12, "bold"))
后还需要调用
chat_log

© www.soinside.com 2019 - 2024. All rights reserved.