如何基于Streamlit实现按需交互式聊天式图表/表格展示?
用Streamlit实现聊天式动态图表生成
Streamlit实现方案
核心思路
利用Streamlit的**会话状态(st.session_state)**保存聊天历史,结合自然语言转数据查询工具解析用户需求,动态生成图表并按聊天顺序展示,新内容自动追加到底部。
步骤与代码示例
- 依赖安装
pip install streamlit pandas pandasai python-dotenv
- 完整代码
import streamlit as st import pandas as pd from pandasai import SmartDataframe from pandasai.llm.openai import OpenAI import os from dotenv import load_dotenv # 加载环境变量(存储OpenAI API Key) load_dotenv() llm = OpenAI(api_token=os.getenv("OPENAI_API_KEY")) # 初始化会话状态的聊天历史 if "messages" not in st.session_state: st.session_state.messages = [] # 加载示例数据集(替换为你的实际数据源) @st.cache_data def load_data(): data = pd.DataFrame({ "country": ["China", "US", "India", "Germany"]*3, "year": [2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2023], "population": [1412, 332, 1393, 83, 1411, 334, 1407, 82, 1409, 336, 1428, 84], "export_usd": [3.36, 2.1, 0.67, 1.6, 3.59, 2.2, 0.77, 1.7, 3.71, 2.3, 0.83, 1.8] }) return data df = load_data() smart_df = SmartDataframe(df, config={"llm": llm}) # 渲染历史聊天记录 for message in st.session_state.messages: with st.chat_message(message["role"]): if message["role"] == "user": st.markdown(message["content"]) else: # 展示生成的图表(PandasAI会自动保存临时图片) if "chart_path" in message: st.image(message["chart_path"]) else: st.markdown(message["content"]) # 处理用户输入 if prompt := st.chat_input("输入你的数据查询需求..."): # 添加用户消息到历史 st.session_state.messages.append({"role": "user", "content": prompt}) with st.chat_message("user"): st.markdown(prompt) # 生成图表 with st.chat_message("assistant"): with st.spinner("生成图表中..."): # 调用PandasAI执行查询并生成图表 result = smart_df.chat(prompt) # PandasAI生成图表时会返回图片路径,文本查询则返回字符串 if isinstance(result, str) and result.endswith(".png"): st.image(result) st.session_state.messages.append({"role": "assistant", "chart_path": result}) else: st.markdown(result) st.session_state.messages.append({"role": "assistant", "content": str(result)})
关键说明
- 会话状态管理:
st.session_state.messages存储所有聊天内容,确保页面刷新时历史不丢失。 - 自然语言解析:使用PandasAI对接大模型,将用户的自然语言查询转换成对DataFrame的操作,自动生成折线图等可视化结果。
- 聊天式布局:
st.chat_message组件自动区分用户和助手消息,新消息默认追加在页面底部,旧内容自动上移,符合聊天窗口的交互逻辑。
替代方案:Gradio实现
如果觉得Streamlit的状态管理稍显繁琐,Gradio的ChatInterface天生支持聊天式交互,代码更简洁:
依赖安装
pip install gradio pandas pandasai python-dotenv
完整代码
import gradio as gr import pandas as pd from pandasai import SmartDataframe from pandasai.llm.openai import OpenAI import os from dotenv import load_dotenv load_dotenv() llm = OpenAI(api_token=os.getenv("OPENAI_API_KEY")) df = pd.DataFrame({ "country": ["China", "US", "India", "Germany"]*3, "year": [2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2023], "population": [1412, 332, 1393, 83, 1411, 334, 1407, 82, 1409, 336, 1428, 84], "export_usd": [3.36, 2.1, 0.67, 1.6, 3.59, 2.2, 0.77, 1.7, 3.71, 2.3, 0.83, 1.8] }) smart_df = SmartDataframe(df, config={"llm": llm}) def respond(message, history): result = smart_df.chat(message) if isinstance(result, str) and result.endswith(".png"): return gr.Image(result) else: return str(result) with gr.Blocks() as demo: gr.ChatInterface(respond) demo.launch()
说明
Gradio的ChatInterface自动处理聊天历史和布局,新消息默认在底部,无需手动管理状态,适合快速搭建聊天式数据查询应用。
内容的提问来源于stack exchange,提问作者drdot
相关产品推荐
相关产品推荐

