如何用Streamlit和LangChain1.0构建问答系统?

摘要:Streamlit 是一款专为数据科学家和机器学习工程师设计的 Python 库,可快速将数据脚本转换为交互式 Web 应用,无需前端开发经验,所以最近研究了一下,结合LangChain 1.0 实现了简单的智能问答前后端应用,大模型使用D
Streamlit + LangChain 1.0 简单实现智能问答前后端 概述 Streamlit 是一款专为数据科学家和机器学习工程师设计的 Python 库,可快速将数据脚本转换为交互式 Web 应用,无需前端开发经验,所以最近研究了一下,结合LangChain 1.0 实现了简单的智能问答前后端应用,大模型使用DeepSeek。 依赖库 streamlit:用于构建Web交互界面 langchain 及相关组件:处理LLM交互逻辑 python-dotenv:加载环境变量,比如加载存储在配置文件中的API KEY。 Highlight code 1. 初始化配置 # 加载环境变量 load_dotenv() # 配置页面 st.set_page_config( page_title="DeepSeek 问答应用", page_icon="🤖", layout="wide", initial_sidebar_state="expanded" ) 使用 load_dotenv() 加载 .env 文件中的环境变量 st.set_page_config() 配置页面基本属性,包括标题、图标和布局 2. 页面UI构建 # 设置页面标题和说明 st.title("🤖 DeepSeek 智能问答应用") st.markdown("使用 LangChain 1.0 和 Streamlit 构建的对话系统") 通过 st.title() 和 st.markdown() 设置页面标题和说明文字 3. 侧边栏配置 with st.sidebar: st.header("配置选项") # API 密钥配置 deepseek_api_key = st.text_input( "DeepSeek API Key", value=os.getenv("DEEPSEEK_API_KEY", ""), type="password", help="请输入您的 DeepSeek API Key" ) # 清除对话历史按钮 if st.button("清除对话历史", type="secondary"): st.session_state["messages"] = [] st.rerun() 使用 st.sidebar 创建侧边栏配置区域 提供API密钥输入框(密码类型),默认从环境变量获取 实现清除对话历史功能,通过操作 st.session_state 实现 4. 对话历史管理 # 初始化对话历史 if "messages" not in st.session_state: st.session_state["messages"] = [] # 显示对话历史 for message in st.session_state["messages"]: if isinstance(message, HumanMessage): with st.chat_message("user"): st.markdown(message.content) elif isinstance(message, AIMessage): with st.chat_message("assistant"): st.markdown(message.content) 使用 st.session_state 存储对话历史,实现页面刷新后数据保留 区分用户消息(HumanMessage)和助手消息(AIMessage)并分别显示 5. 用户输入处理 user_input = st.chat_input("请输入您的问题...") if user_input: # 验证API密钥 if not deepseek_api_key: st.error("请在侧边栏配置您的 DeepSeek API Key") st.stop() # 添加用户消息到会话历史 st.session_state["messages"].append(HumanMessage(content=user_input)) # 显示用户消息 with st.chat_message("user"): st.markdown(user_input) 使用 st.chat_input() 获取用户输入 进行API密钥验证,确保调用模型前密钥已配置 将用户消息添加到历史记录并显示 6. AI响应生成 # 显示助手思考中状态 with st.chat_message("assistant"): with st.spinner("正在思考..."): chat_model=init_chat_model(model="deepseek:deepseek-chat") # 创建提示模板 prompt = ChatPromptTemplate.from_messages([ ("system", "你是一个智能助手,使用中文回答用户问题,保持友好和专业。"), *st.session_state["messages"] ]) # 创建链 chain = prompt | chat_model | StrOutputParser() try: # 生成回答 response = chain.invoke({}) # 显示回答 st.markdown(response) # 添加助手消息到会话历史 st.session_state["messages"].append(AIMessage(content=response)) except Exception as e: st.error(f"请求失败: {str(e)}") st.error("请检查您的API密钥或网络连接") 使用 st.spinner() 显示加载状态,提升用户体验 通过 init_chat_model() 初始化DeepSeek模型 使用LangChain 1.0的链(Chain)语法:prompt | chat_model | StrOutputParser() 异常处理确保错误时能友好提示用户 关键技术点 Streamlit 会话状态:利用 st.session_state 保存对话历史,实现状态管理 LangChain 1.0 链语法:采用新的管道运算符 | 构建处理流程 消息类型区分:使用 HumanMessage 和 AIMessage 区分不同角色的消息 API 密钥管理:支持环境变量和手动输入两种方式配置API密钥 错误处理:完善的异常捕获和用户提示 运行 streamlit run LC_RAG_07a_Streamlit.py run后面替换成自己的文件名就可以启动运行。 完整版本的代码可以在如下位置找到: https://github.com/microsoftbi/Langchain_DEMO/blob/main/RAG/LC_RAG_07a_Streamlit.py 后记 相对Vue,steamlit的学习成本更低一些。适合独立的开发和学习。但是在生产中主流还是更推荐Vue等前端框架,尤其在细节的前端定制化开发中。 后续可以扩充下比如streamlit如何响应langchain的middleware等功能,比如HITL。