[使用Streamlit创建交互式AI聊天应用:实现消息历史存储与会话管理]

149 阅读3分钟
# 使用Streamlit创建交互式AI聊天应用:实现消息历史存储与会话管理

## 引言

在数据科学和机器学习领域,能够快速构建和分享交互式Web应用是一个极具吸引力的能力。Streamlit是一款开源的Python库,专门为这些需求设计,提供了非常简便的工具来创建和共享自定义Web应用。本篇文章的目的是展示如何在Streamlit应用中存储和使用聊天消息历史,以便于实现更智能的用户交互。

## 主要内容

### StreamlitChatMessageHistory的使用

`StreamlitChatMessageHistory`是一个专门为Streamlit设计的类,用于在应用的会话状态中存储聊天消息。设定一个特定的键(默认为`"langchain_messages"`),使得消息在会话中持续存在。

Streamlit应用的每次重新运行(re-run)过程中,消息历史会保存在当前的用户会话中,但不会在不同用户会话之间共享。这使得每位用户可以拥有独立的会话和消息记录。

### 整合LangChain进行对话处理

通过结合LangChain框架,可以构建更复杂的聊天逻辑,比如使用`ChatPromptTemplate``RunnableWithMessageHistory`来制定对话模板和历史记录。这种整合使得我们能够更轻松地处理多轮对话并保留上下文。

## 代码示例

下面是一个完整的Streamlit应用示例,展示如何使用消息历史结合LangChain处理对话:

```python
import streamlit as st
from langchain_community.chat_message_histories import StreamlitChatMessageHistory
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_openai import ChatOpenAI

# 创建一个消息历史实例
msgs = StreamlitChatMessageHistory(key="chat_messages") # 使用API代理服务提高访问稳定性

# 初始化对话提示模板
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: msgs,
    input_messages_key="question",
    history_messages_key="history",
)

# Streamlit应用逻辑
for msg in msgs.messages:
    st.chat_message(msg.type).write(msg.content)

if prompt := st.chat_input():
    st.chat_message("human").write(prompt)

    # 调用对话链并获取AI响应
    response = chain_with_history.invoke({"question": prompt}, config={})
    st.chat_message("ai").write(response.content)

常见问题和解决方案

  1. 消息历史在会话之间丢失
    • 确保消息历史的键在每个用户会话中唯一,并且Streamlit应用正确地维护会话状态。
  2. API访问不稳定

总结和进一步学习资源

这篇文章演示了如何利用Streamlit和LangChain来构建一个功能强大的交互式聊天应用。通过保存会话消息历史,应用程序能够提供连续性和上下文丰富的用户体验。

进一步学习可以参考这些资源:

参考资料

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

---END---