使用Gemini-Pro开发LLM聊天机器人时遇Type Error求助
解决Gemini-Pro聊天机器人的st.session_state类型错误及会话管理问题
错误原因分析
出现TypeError大概率是因为Streamlit的st.session_state在初始化阶段未被正确识别为字典类型,或是使用了存在兼容性问题的旧版本Streamlit。此外原代码未实现会话重置逻辑,无法满足结束对话后清空历史的需求。
修复方案及完整代码
以下是修复类型错误并实现会话保存、重置功能的完整代码:
import os import streamlit as st from dotenv import load_dotenv import google.generativeai as gen_ai load_dotenv() # 页面配置 st.set_page_config( page_title="Chat with Gemini Pro", page_icon=":brain:", layout="centered" ) # 配置Gemini-Pro GOOGLE_API_KEY = os.getenv("GOOGLE_API_KEY") gen_ai.configure(api_key=GOOGLE_API_KEY) model = gen_ai.GenerativeModel("gemini-pro") # 角色转换:适配Streamlit的chat_message组件 def translate_role_for_streamlit(user_role): return "assistant" if user_role == "model" else user_role # 初始化会话状态:兼容session_state类型问题 if not hasattr(st.session_state, "chat_session") or st.session_state.chat_session is None: st.session_state.chat_session = model.start_chat(history=[]) # 页面标题及重置按钮 col1, col2 = st.columns([3,1]) with col1: st.title("CAIE Bot") with col2: if st.button("重置会话"): st.session_state.chat_session = model.start_chat(history=[]) st.rerun() # 渲染历史对话 for message in st.session_state.chat_session.history: with st.chat_message(translate_role_for_streamlit(message.role)): # 处理空内容的异常情况 if message.parts: st.markdown(message.parts[0].text) # 用户输入处理 user_prompt = st.chat_input("Ask CAIE bot...") if user_prompt: # 显示用户消息 with st.chat_message("user"): st.markdown(user_prompt) # 调用Gemini-Pro获取响应 gemini_response = st.session_state.chat_session.send_message(user_prompt) # 显示助手响应 with st.chat_message("assistant"): st.markdown(gemini_response.text)
关键修改说明
- 修复类型错误:改用
hasattr检查chat_session是否存在,避免直接字典键检查时的类型异常;同时确保会话对象为空时重新初始化。 - 添加会话重置功能:新增"重置会话"按钮,点击后清空历史并重启会话,通过
st.rerun()刷新页面。 - 异常防护:渲染历史消息时增加空内容检查,避免因消息格式异常导致报错。
- 布局优化:将标题和重置按钮分栏布局,提升交互体验。
内容的提问来源于stack exchange,提问作者Buddy Holly
相关产品推荐
相关产品推荐

