你是不是也有过这样的想法——做了一个很棒的 AI 小工具,但苦于不会写前端,只能把代码放在 GitHub 上吃灰?
写 React 组件?学 CSS 布局?配路由?光是搭环境就花了两三天。
Streamlit 的存在就是为了消灭这个问题。你只需要写 Python,剩下的界面、交互、部署全部自动搞定。今天这篇教程,我会带着你用 Streamlit 从零搭建一个完整的 AI 应用前端,整个过程不到 15 分钟。
一、为什么选 Streamlit?
先说结论:如果你会 Python,你就会 Streamlit。
它和其他前端框架的区别在于:
| 特性 | Streamlit | React/Vue | Flask/FastAPI |
|---|---|---|---|
| 学习曲线 | 几乎为零 | 陡峭 | 中等 |
| 代码量 | 少 | 多 | 中等 |
| 适合人群 | Python 开发者 | 前端工程师 | 后端工程师 |
| UI 定制程度 | 基础 | 无限 | 依赖模板 |
| 部署难度 | 一键 | 需要配置 | 需要配置 |
Streamlit 的理念很简单:每一行 Python 代码就是一个 UI 组件。你不需要写 HTML、CSS 或 JavaScript。
二、安装和环境准备
# 创建虚拟环境(推荐)
python -m venv streamlit-env
source streamlit-env/bin/activate
# 安装 Streamlit
pip install streamlit
# 如果要接入 OpenAI API
pip install openai
# 启动开发服务器
streamlit hello
打开浏览器访问 http://localhost:8501,你会看到 Streamlit 自带的示例应用。这说明安装成功了。
三、第一个 AI 应用:聊天机器人界面
让我们写一个最基础的 AI 聊天界面。新建一个文件 app.py:
import streamlit as st
import openai
st.set_page_config(page_title="AI 聊天助手", page_icon="🤖")
st.title("🤖 AI 聊天助手")
st.markdown("基于 OpenAI 的智能对话,支持多轮上下文。")
# 初始化会话历史
if "messages" not in st.session_state:
st.session_state.messages = []
# 显示历史消息
for message in st.session_state.messages:
with st.chat_message(message["role"]):
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)
# 调用 OpenAI API
client = openai.OpenAI(api_key=st.secrets["OPENAI_API_KEY"])
response = client.chat.completions.create(
model="gpt-4o",
messages=st.session_state.messages
)
# 显示 AI 回复
ai_reply = response.choices[0].message.content
st.session_state.messages.append({"role": "assistant", "content": ai_reply})
with st.chat_message("assistant"):
st.markdown(ai_reply)
运行 streamlit run app.py,你就得到了一个完整的聊天界面。不需要写一行 HTML。
四、进阶:添加更多交互组件
一个实用的 AI 工具通常不止一个聊天框。下面是 Streamlit 常用组件的速查:
侧边栏配置面板
with st.sidebar:
st.header("⚙️ 设置")
model = st.selectbox(
"选择模型",
["gpt-4o", "o3", "claude-sonnet"]
)
temperature = st.slider("温度", 0.0, 1.0, 0.7)
api_key = st.text_input("API Key", type="password")
clear_btn = st.button("清空对话")
侧边栏非常适合放配置项,用户可以在不离开主界面的情况下调整参数。
数据展示
import pandas as pd
# 模拟 AI 分析结果
data = {
"指标": ["准确率", "召回率", "F1分数", "AUC"],
"数值": [0.95, 0.89, 0.92, 0.94]
}
df = pd.DataFrame(data)
st.dataframe(df, use_container_width=True)
st.metric("总耗时", "2.3 秒")
st.progress(0.95, "模型置信度")
Streamlit 内置了对 Pandas DataFrame 的支持,几行代码就能展示表格、进度条、指标卡片。
文件上传和处理
uploaded_file = st.file_uploader("上传 CSV 文件", type=["csv"])
if uploaded_file is not None:
df = pd.read_csv(uploaded_file)
st.write(df.head())
# 让 AI 分析数据
if st.button("让 AI 分析数据"):
with st.spinner("正在分析..."):
summary = analyze_with_ai(df)
st.success("分析完成!")
st.write(summary)
这是 Streamlit 最强大的场景之一——用户上传文件,后端用 AI 处理,结果实时展示。
五、完整示例:AI 数据分析工具
下面是一个稍微完整的例子,结合了前面的所有组件:
import streamlit as st
import pandas as pd
import io
st.set_page_config(page_title="AI 数据分析助手", layout="wide")
st.title("📊 AI 数据分析助手")
st.markdown("上传数据文件,AI 自动分析并生成报告。")
# 左侧:上传和设置
col1, col2 = st.columns([1, 2])
with col1:
uploaded = st.file_uploader("上传数据", type=["csv", "xlsx", "json"])
if uploaded:
if uploaded.name.endswith(".csv"):
df = pd.read_csv(uploaded)
elif uploaded.name.endswith(".json"):
df = pd.read_json(uploaded)
st.subheader("数据预览")
st.dataframe(df.head(10), use_container_width=True)
st.subheader("数据统计")
st.metric("行数", len(df))
st.metric("列数", len(df.columns))
prompt_text = st.text_area(
"描述你想分析的内容",
value="请分析这份数据的分布特征,找出异常值,并给出可视化建议。"
)
if st.button("🔍 开始分析", type="primary"):
with st.spinner("AI 正在分析数据..."):
# 这里调用你的 AI API
result = generate_analysis(df, prompt_text)
st.success("分析完成!")
st.markdown(result)
with col2:
if uploaded:
st.subheader("可视化建议")
chart_type = st.selectbox(
"图表类型",
["折线图", "柱状图", "散点图", "热力图"]
)
st.plotly_chart(generate_chart(df, chart_type), use_container_width=True)
这个应用包含了文件上传、数据预览、统计指标、AI 分析、可视化展示——全部用 Python 完成。
六、部署上线
写好了本地运行没问题,但别人怎么用?Streamlit 提供了多种部署方式:
方式 1:Streamlit Cloud(免费)
- 把代码推到 GitHub
- 访问 streamlit.io 登录
- 选择仓库,点击 Deploy
免费额度足够个人项目使用。
方式 2:Docker 部署
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8501
CMD ["streamlit", "run", "app.py", "--server.port=8501"]
方式 3:Navbox 集成
你也可以把 Streamlit 应用封装成 navbox 上的在线工具。用户不需要安装任何东西,直接在浏览器里用。
七、常见问题
Q:Streamlit 每次重新运行整个脚本,数据丢了怎么办?
A:用 st.session_state 保存状态。它在用户会话期间持久化,类似浏览器的 localStorage。
Q:界面不够好看怎么办?
A:Streamlit 支持 CSS 注入:
st.markdown("""
<style>
.main-header { font-size: 2rem; color: #1f77b4; }
</style>
""", unsafe_allow_html=True)
Q:数据量大时页面卡顿?
A:用 @st.cache_data 装饰器缓存计算结果:
@st.cache_data(ttl=3600)
def heavy_computation(data):
return process(data)
八、总结
Streamlit 是目前最快把 Python 脚本变成 Web 应用的方式。你不需要学前端知识,不需要配置服务器,甚至不需要懂 HTTP 协议。
15 分钟,一个 AI 应用就上线了。
如果你手头有现成的 Python 脚本或 Jupyter Notebook,不妨把它改造成 Streamlit 应用试试。你会发现,以前觉得麻烦的前端工作,现在只需要加十几行代码。
你的第一个 Streamlit 应用打算做什么?评论区聊聊。