如何在Streamlit应用中为两个LlamaIndex聊天机器人分离会话状态
解决Streamlit多聊天机器人独立会话状态问题
问题核心是两个聊天机器人共用了同一个st.session_state.messages变量,导致切换时聊天记录互相干扰。要让每个机器人独立维护会话,只需要给每个机器人分配专属的会话存储键即可。
具体修改步骤:
给聊天机器人设置唯一标识
添加一个选择控件让用户切换机器人,比如下拉框,每个机器人对应一个唯一ID(可关联它们的索引或文件名)。改用动态会话键存储消息
把原来全局的messages改成带机器人标识的动态键,比如st.session_state[f"messages_{selected_bot}"],这样每个机器人的聊天记录会存在独立的会话变量里。调整所有会话相关逻辑
初始化、读取、添加消息时,都使用当前选中机器人对应的会话键。
修改后的完整代码示例:
# 假设你有两个索引对应两个机器人,用下拉框让用户选择 bots = { "Bot 1 (File A)": index_a, "Bot 2 (File B)": index_b } selected_bot_name = st.selectbox("选择聊天机器人", options=list(bots.keys())) selected_index = bots[selected_bot_name] chat_engine = selected_index.as_chat_engine(verbose=True) # 生成当前机器人专属的会话键 session_key = f"messages_{selected_bot_name}" # 初始化当前机器人的会话记录(仅当不存在时) if session_key not in st.session_state.keys(): # 根据机器人调整欢迎语,关联对应文件名 file_name = selected_bot_name.split("(")[1].strip(")") st.session_state[session_key] = [ {"role": "assistant", "content": "Hi, Welcome to KnowledgeGPT"}, {"role": "assistant", "content": f"Ask me questions from {file_name}"} ] # 用户输入处理 if prompt := st.chat_input("Your question"): st.session_state[session_key].append({"role": "user", "content": prompt}) # 展示当前机器人的聊天记录 for message in st.session_state[session_key]: with st.chat_message(message["role"]): st.write(message["content"]) # 生成助手回复(仅当最后一条消息是用户发送的) if st.session_state[session_key][-1]["role"] != "assistant": with st.chat_message("assistant"): with st.spinner("Thinking..."): response = chat_engine.chat(prompt) st.write(response.response) message = {"role": "assistant", "content": response.response} st.session_state[session_key].append(message)
关键改动说明:
- 用
selected_bot_name作为标识生成唯一的session_key,确保每个机器人的会话数据完全隔离 - 初始化和操作消息列表时,都针对当前机器人的
session_key进行,不再共用全局变量 - 切换机器人时,会自动加载对应机器人的专属聊天记录,互不干扰
内容的提问来源于stack exchange,提问作者Saksham S
相关产品推荐
相关产品推荐

