如何用Streamlit构建带历史对话记录的问答应用
Streamlit实现带历史记录的连续问答方案
核心思路是利用Streamlit的session_state跨页面加载保存对话历史,这是官方推荐的状态管理方式,能解决页面刷新时数据丢失的问题。
实现步骤与代码示例
初始化对话历史
代码开头检查并初始化session_state中的对话存储,确保每次页面加载时历史数据不会丢失:import streamlit as st # 初始化对话历史存储 if "chat_history" not in st.session_state: st.session_state.chat_history = []展示历史问答记录
遍历session_state中的对话列表,逐个展示用户问题和AI回答,通过样式区分双方消息:# 遍历并展示历史对话 for user_question, ai_answer in st.session_state.chat_history: # 用户消息用浅蓝色背景区分 st.markdown(f""" <div style='background-color: #e6f2ff; padding: 10px; border-radius: 8px; margin-bottom: 8px;'> <strong>用户:</strong> {user_question} </div> """, unsafe_allow_html=True) # AI消息用浅灰色背景区分 st.markdown(f""" <div style='background-color: #f5f5f5; padding: 10px; border-radius: 8px; margin-bottom: 16px;'> <strong>AI:</strong> {ai_answer} </div> """, unsafe_allow_html=True)处理新提问与提交
使用固定输入框和提交按钮,点击按钮时将新问题和生成的回答存入历史,同时清空输入框方便下一次提问:# 新提问输入区域 user_input = st.text_input("输入你的问题", key="current_question") submit_btn = st.button("提交") if submit_btn and user_input.strip(): # 替换为实际的问答逻辑(比如调用LLM接口) ai_response = f"针对「{user_input}」的回答内容" # 追加对话到历史 st.session_state.chat_history.append((user_input, ai_response)) # 清空输入框 st.session_state.current_question = "" # 强制页面刷新,更新历史展示 st.experimental_rerun()
为何之前的方案没生效
你尝试的计数器生成唯一text_input key的方法,会导致每次页面加载都生成新的输入框,反而造成界面混乱和状态管理失控。而session_state是Streamlit专门设计用来在页面刷新间保留数据的机制,能稳定实现连续问答的历史记录需求。
内容的提问来源于stack exchange,提问作者Atul Bhatia
相关产品推荐
相关产品推荐

