You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Streamlit构建带历史对话记录的问答应用

Streamlit实现带历史记录的连续问答方案

核心思路是利用Streamlit的session_state跨页面加载保存对话历史,这是官方推荐的状态管理方式,能解决页面刷新时数据丢失的问题。

实现步骤与代码示例

  1. 初始化对话历史
    代码开头检查并初始化session_state中的对话存储,确保每次页面加载时历史数据不会丢失:

    import streamlit as st
    
    # 初始化对话历史存储
    if "chat_history" not in st.session_state:
        st.session_state.chat_history = []
    
  2. 展示历史问答记录
    遍历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)
    
  3. 处理新提问与提交
    使用固定输入框和提交按钮,点击按钮时将新问题和生成的回答存入历史,同时清空输入框方便下一次提问:

    # 新提问输入区域
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 21:47:12