Streamlit聊天机器人添加点赞/点踩反馈功能的问题求助
Streamlit聊天机器人反馈功能优化需求
正在为基于Streamlit的聊天机器人添加点赞/点踩按钮及用户反馈功能,使用st.chat_message构建聊天界面,选用streamlit-feedback Python包实现该功能。
当前核心实现代码
import streamlit as st from streamlit_feedback import streamlit_feedback ... def handle_feedback(): st.write(st.session_state.fb_k) st.toast("✔️ Feedback received!") if "df" in st.session_state: if prompt := st.chat_input(placeholder=""): ... with st.form('form'): streamlit_feedback(feedback_type="thumbs", optional_text_label="Enter your feedback here", align="flex-start", key='fb_k') st.form_submit_button('Save feedback', on_click=handle_feedback)
现有问题
- 操作冗余:用户需先点击反馈组件的“SUBMIT”按钮,再点击“Save feedback”按钮才能完成反馈提交;若直接点击“Save feedback”,
st.session_state.fb_k会返回None。 - 界面不美观:嵌套在
st.form中的反馈组件展示效果不佳,希望移除st.form。
on_submit参数尝试无效
尝试使用streamlit-feedback的on_submit参数绑定handle_feedback函数,代码如下,但函数未产生任何输出(既不显示st.write内容,也不弹出st.toast提示),on_submit参数未生效:
streamlit_feedback(feedback_type="faces", optional_text_label="[Optional] Please provide an explanation", align="flex-start", key='fb_k', on_submit = handle_feedback)
完整应用代码
from langchain.chat_models import AzureChatOpenAI from langchain.memory import ConversationBufferWindowMemory # ConversationBufferMemory from langchain.agents import ConversationalChatAgent, AgentExecutor, AgentType from langchain.callbacks import StreamlitCallbackHandler from langchain.memory.chat_message_histories import StreamlitChatMessageHistory from langchain.agents import Tool from langchain.prompts import PromptTemplate from langchain.chains import LLMChain import pprint import streamlit as st import os import pandas as pd from streamlit_feedback import streamlit_feedback def handle_feedback(): st.write(st.session_state.fb_k) st.toast("✔️ Feedback received!") os.environ["OPENAI_API_KEY"] = ... os.environ["OPENAI_API_TYPE"] = "azure" os.environ["OPENAI_API_BASE"] = ... os.environ["OPENAI_API_VERSION"] = "2023-08-01-preview" @st.cache_data(ttl=72000) def load_data_(path): return pd.read_csv(path) uploaded_file = st.sidebar.file_uploader("Choose a CSV file", type="csv") if uploaded_file is not None: # If a file is uploaded, load the uploaded file st.session_state["df"] = load_data_(uploaded_file) if "df" in st.session_state: msgs = StreamlitChatMessageHistory() memory = ConversationBufferWindowMemory(chat_memory=msgs, return_messages=True, k=5, memory_key="chat_history", output_key="output") if len(msgs.messages) == 0 or st.sidebar.button("Reset chat history"): msgs.clear() msgs.add_ai_message("How can I help you?") st.session_state.steps = {} avatars = {"human": "user", "ai": "assistant"} for idx, msg in enumerate(msgs.messages): with st.chat_message(avatars[msg.type]): # Render intermediate steps if any were saved for step in st.session_state.steps.get(str(idx), []): if step[0].tool == "_Exception": continue # Insert a status container to display output from long-running tasks. with st.status(f"**{step[0].tool}**: {step[0].tool_input}", state="complete"): st.write(step[0].log) st.write(step[1]) st.write(msg.content) if prompt := st.chat_input(placeholder=""): st.chat_message("user").write(prompt) llm = AzureChatOpenAI( deployment_name = "gpt-4", model_name = "gpt-4", openai_api_key = os.environ["OPENAI_API_KEY"], openai_api_version = os.environ["OPENAI_API_VERSION"], openai_api_base = os.environ["OPENAI_API_BASE"], temperature = 0, streaming=True ) prompt_ = PromptTemplate( input_variables=["query"], template="{query}" ) chain_llm = LLMChain(llm=llm, prompt=prompt_) tool_llm_node = Tool( name='Large Language Model Node', func=chain_llm.run, description='This tool is useful when you need to answer general purpose queries with a large language model.' ) tools = [tool_llm_node] chat_agent = ConversationalChatAgent.from_llm_and_tools(llm=llm, tools=tools) executor = AgentExecutor.from_agent_and_tools( agent=chat_agent, tools=tools, memory=memory, return_intermediate_steps=True, handle_parsing_errors=True, verbose=True, ) with st.chat_message("assistant"): st_cb = StreamlitCallbackHandler(st.container(), expand_new_thoughts=False) response = executor(prompt, callbacks=[st_cb, st.session_state['handler']]) st.write(response["output"]) st.session_state.steps[str(len(msgs.messages) - 1)] = response["intermediate_steps"] response_str = f'{response}' pp = pprint.PrettyPrinter(indent=4) pretty_response = pp.pformat(response_str) with st.form('form'): streamlit_feedback(feedback_type="thumbs", optional_text_label="[Optional] Please provide an explanation", align="flex-start", key='fb_k') st.form_submit_button('Save feedback', on_click=handle_feedback)
现寻求解决上述问题的可行方案,可基于streamlit-feedback包或其他实现方式。
内容的提问来源于stack exchange,提问作者illuminato
相关产品推荐
相关产品推荐

