Gradio 聊天机器人:如何导出单独的对话历史?
我正在开发一个聊天机器人,之后会在心理实验中使用和测试。这是我第一次做真正的编程项目。我使用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 个回答
暂无回答