You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于Streamlit实现按需交互式聊天式图表/表格展示?

用Streamlit实现聊天式动态图表生成

Streamlit实现方案

核心思路

利用Streamlit的**会话状态(st.session_state)**保存聊天历史,结合自然语言转数据查询工具解析用户需求,动态生成图表并按聊天顺序展示,新内容自动追加到底部。

步骤与代码示例

  1. 依赖安装
pip install streamlit pandas pandasai python-dotenv
  1. 完整代码
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:57:44