Gradio 聊天机器人:如何导出单独的对话历史?

0 投票
0 回答
21 浏览
提问于 2025-04-12 05:24

我正在开发一个聊天机器人,之后会在心理实验中使用和测试。这是我第一次做真正的编程项目。我使用OpenAI的API来提供语言模型,使用Gradio来做用户界面。我想添加一个功能,让我可以导出每个用户的对话,这样我和我的团队就可以后续分析这些对话。我对怎么实现这个功能有一些粗略的想法,但在具体实现上需要帮助。这是我目前的代码,没有额外的功能:

from openai import OpenAI
import gradio as gr

client = OpenAI(
    api_key="OUR API KEY"
)

instructions = "OUR SYSTEM PROMPT"

def chat(system_prompt, user_prompt, model='gpt-4', temperature=0.0):
    response = client.chat.completions.create(
        temperature=temperature,
        model=model,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ])

    res = response.choices[0].message.content
    return res


def format_chat_prompt(message, chat_history, max_convo_length):
    prompt = ""
    for turn in chat_history[-max_convo_length:]:
        user_message, bot_message = turn
        prompt = f"{prompt}\nUser: {user_message}\nAssistant: {bot_message}"
    prompt = f"{prompt}\nUser: {message}\nAssistant:"
    return prompt


def respond(message, chat_history, max_convo_length=1000000):
    formatted_prompt = format_chat_prompt(message, chat_history, max_convo_length)
    bot_message = chat(system_prompt=f'''{instructions}''',
                       user_prompt=formatted_prompt,
                       temperature=0.7,
                       )
    chat_history.append((message, bot_message))
    return "", chat_history


with gr.Blocks() as demo:
    chatbot = gr.Chatbot(height=300)
    msg = gr.Textbox(label="Prompt")
    btn = gr.Button("Submit")
    clear = gr.ClearButton(components=[msg, chatbot], value="Clear console")

    btn.click(respond, inputs=[msg, chatbot], outputs=[msg, chatbot])
    msg.submit(respond, inputs=[msg, chatbot], outputs=[msg, chatbot])  
gr.close_all()
demo.launch(share=True)

我尝试过以下方法,这确实在项目目录中创建了一个txt文件:

from openai import OpenAI
import gradio as gr

client = OpenAI(
    api_key="OUR API KEY"
)

instructions = "OUR SYSTEM PROMPT"

def chat(system_prompt, user_prompt, model='gpt-4', temperature=0.0):
    response = client.chat.completions.create(
        temperature=temperature,
        model=model,
        messages=[
            {"role": "system", "content": system_prompt},
            {"role": "user", "content": user_prompt}
        ])

    res = response.choices[0].message.content
    return res


def format_chat_prompt(message, chat_history, max_convo_length):
    prompt = ""
    for turn in chat_history[-max_convo_length:]:
        user_message, bot_message = turn
        prompt = f"{prompt}\nUser: {user_message}\nAssistant: {bot_message}"
    prompt = f"{prompt}\nUser: {message}\nAssistant:"
    return prompt


def respond(message, chat_history, max_convo_length=1000000):
    formatted_prompt = format_chat_prompt(message, chat_history, max_convo_length)
    bot_message = chat(system_prompt=f"{instructions}", user_prompt=formatted_prompt, temperature=0.7)
    chat_history.append((message, bot_message))
    
    export_conversation(chat_history)

    return "", chat_history


def export_conversation(chat_history, filename="conversation.txt"):
    with open(filename, "w") as file:
        for turn in chat_history:
            user_message, bot_message = turn
            file.write(f"User: {user_message}\nAssistant: {bot_message}\n")


with gr.Blocks() as demo:
    chatbot = gr.Chatbot(height=300)
    msg = gr.Textbox(label="Prompt")
    btn = gr.Button("Submit")
    clear = gr.ClearButton(components=[msg, chatbot], value="Clear console")

    btn.click(respond, inputs=[msg, chatbot], outputs=[msg, chatbot])
    msg.submit(respond, inputs=[msg, chatbot], outputs=[msg, chatbot])  #press enter to submit
gr.close_all()
demo.launch(share=True)

但问题是,这个txt文件只包含了用户最近的一次对话和最新的输入。很明显,我需要一种方法来识别每个用户。也许我可以创建一个字典,用用户的ID作为键,把每个人的对话作为值。有什么好的、容易实现的方法来进行用户识别吗?还有,我需要调整代码的哪些其他部分才能让它正常工作?

0 个回答

暂无回答

撰写回答