一、引言:当数据科学家遇见“应用工厂”

想象这样一个场景:数据科学家小王花了三周时间,训练出一个精准的销售预测模型。现在,他想让业务部门的同事也能用上这个模型——输入几个参数,就能看到预测结果。面对这个需求,小王有两个选择:要么花两周时间学习HTML、CSS和JavaScript,从头搭建一个网页应用;要么用三天时间,把现有的Python脚本改造成一个可交互的Web界面。

小王最终选择了后者。他用了一个叫Streamlit的工具,写了不到50行代码,一个漂亮的预测看板就上线了。

这个故事揭示了Streamlit诞生的初衷:让数据科学家和开发者用纯Python代码,就能快速构建交互式Web应用,无需学习任何前端技术

而现在,更令人兴奋的是,用同样的工具,花同样的时间,就能构建出一个功能完整的AI聊天界面——就像ChatGPT那样,用户输入问题,AI实时回答。


二、Streamlit是什么?

Streamlit是一个开源的Python库,专为数据科学家和机器学习工程师设计,用于快速创建和分享交互式的Web应用。它的核心理念可以用一句话概括:

“把Python脚本变成交互式网页应用,只需要几分钟,而不是几周。”

2.1 它解决了什么问题?

在Streamlit出现之前,数据科学家要把分析结果或模型展示给非技术人员,通常需要借助Flask、Django等传统Web框架。这些框架虽然强大,但需要:

  • 编写大量模板和视图代码
  • 掌握HTML/CSS/JavaScript知识
  • 处理前后端分离的复杂配置

Streamlit的出现彻底改变了这一局面。它让开发者可以使用熟悉的Python语法,专注于数据和业务逻辑,而无需为界面细节分心。

2.2 核心优势

Streamlit能够成为数据科学领域最受欢迎的工具之一,主要得益于以下几个特点:

1. 纯Python,无需前端知识

  • st.title()生成网页标题
  • st.write()展示任何内容
  • 所有UI元素都通过Python函数调用实现

2. 极快的开发效率

  • 几行代码即可生成功能完整的应用
  • 修改代码后页面自动热重载,即时预览效果

3. 原生支持数据生态

  • 完美集成Pandas、Matplotlib、Plotly、Altair等数据科学库
  • 可以直接展示数据框、图表、地图等

4. 强大的AI应用构建能力

  • 提供st.chat_message()创建对话气泡
  • 提供st.chat_input()实现聊天输入框
  • 与LangChain、Ollama、OpenAI等AI工具无缝集成

5. 开源免费,社区活跃

  • 已在GitHub收获数万星标
  • 提供免费部署平台Streamlit Community Cloud

三、具体使用步骤

3.1 环境准备

第一步:确认Python版本

Streamlit要求Python 3.8及以上版本:

python --version

第二步:安装Streamlit

pip install streamlit

如果还需要调用本地大模型,建议一并安装Ollama的Python库:

pip install ollama

验证安装是否成功:

streamlit hello

如果浏览器自动打开了一个包含多个交互式Demo的欢迎页面,说明安装成功。

3.2 创建第一个应用

第三步:创建Python脚本

新建app.py

import streamlit as st

st.title("我的第一个Streamlit应用")
st.write("你好,欢迎使用Streamlit!")

第四步:运行应用

streamlit run app.py

浏览器会自动打开http://localhost:8501,页面就出来了。


四、构建AI聊天界面(完整实战)

这是本文的核心章节。我们将从零开始,构建一个完整的AI聊天应用,界面风格类似ChatGPT,支持对话历史记录。

4.1 基础版:最简单的对话界面

import streamlit as st

# 1. 页面配置
st.set_page_config(page_title="AI助手", page_icon="🤖")
st.title("🤖 AI智能助手")

# 2. 创建对话气泡
msg = st.chat_message("assistant")
msg.write("你好,我是你的AI助手,有什么可以帮你吗?")

# 3. 创建聊天输入框
user_input = st.chat_input("请输入你的问题...")

# 4. 处理用户输入
if user_input:
    # 显示用户消息
    st.chat_message("user").write(user_input)
    # 模拟AI回复
    st.chat_message("assistant").write(f"你说的是:{user_input}")

4.2 进阶版:带对话历史的AI聊天

关键问题:每次交互页面都会刷新,如何保存对话记录?

Streamlit提供了st.session_state来解决状态持久化问题。完整代码如下:

import streamlit as st

# ========== 1. 页面配置 ==========
st.set_page_config(page_title="AI助手", page_icon="🤖")
st.title("🤖 AI智能助手")

# ========== 2. 初始化会话状态(保存对话历史) ==========
if "messages" not in st.session_state:
    st.session_state.messages = []

# ========== 3. 显示所有历史消息 ==========
for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.write(msg["content"])

# ========== 4. 接收用户输入 ==========
user_input = st.chat_input("请输入你的问题...")

if user_input:
    # 4a. 添加用户消息到历史
    st.session_state.messages.append(
        {"role": "user", "content": user_input}
    )
    with st.chat_message("user"):
        st.write(user_input)
    
    # 4b. 模拟AI回复(后续可以替换成真实的大模型调用)
    response = f"我收到了你的问题:{user_input}"
    
    # 4c. 添加AI回复到历史
    st.session_state.messages.append(
        {"role": "assistant", "content": response}
    )
    with st.chat_message("assistant"):
        st.write(response)

4.3 完整版:接入Ollama大模型

将上面的模拟回复替换为真实的AI调用,即可实现真正的AI聊天

import streamlit as st
import ollama  # 需要先 pip install ollama

# ========== 1. 页面配置 ==========
st.set_page_config(page_title="AI助手", page_icon="🤖")
st.title("🤖 AI智能助手")

# ========== 2. 模型选择 ==========
MODEL_NAME = "qwen2.5:0.5b"  # 可改为 llama3、qwen2.5等

# ========== 3. 初始化会话状态 ==========
if "messages" not in st.session_state:
    st.session_state.messages = []

# ========== 4. 显示历史消息 ==========
for msg in st.session_state.messages:
    with st.chat_message(msg["role"]):
        st.write(msg["content"])

# ========== 5. 接收并处理用户输入 ==========
user_input = st.chat_input("请输入你的问题...")

if user_input:
    # 5a. 保存并显示用户消息
    st.session_state.messages.append(
        {"role": "user", "content": user_input}
    )
    with st.chat_message("user"):
        st.write(user_input)
    
    # 5b. 调用 Ollama 生成回复
    with st.chat_message("assistant"):
        # 创建占位符,实现流式输出效果
        response_placeholder = st.empty()
        full_response = ""
        
        # 流式调用大模型
        stream = ollama.chat(
            model=MODEL_NAME,
            messages=st.session_state.messages,
            stream=True  # 开启流式输出
        )
        
        # 逐块拼接并显示
        for chunk in stream:
            content = chunk.get("message", {}).get("content", "")
            full_response += content
            response_placeholder.write(full_response + "▌")
        
        # 显示完整回复(去除光标符号)
        response_placeholder.write(full_response)
    
    # 5c. 保存AI回复到历史
    st.session_state.messages.append(
        {"role": "assistant", "content": full_response}
    )

4.4 功能增强:清空对话

为应用添加一个“清空对话”按钮,提升用户体验:

# 在标题下方添加
col1, col2 = st.columns([6, 1])
with col1:
    st.title("🤖 AI智能助手")
with col2:
    if st.button("🗑️ 清空"):
        st.session_state.messages = []
        st.rerun()

五、常用组件速查

功能 代码示例 说明
标题 st.title("标题") 页面主标题
文本 st.write("内容") 万能展示函数
滑块 st.slider("标签", 0, 100, 50) 数值选择器
按钮 st.button("点击我") 触发事件
输入框 st.text_input("请输入") 文本输入
下拉菜单 st.selectbox("选项", ["A","B"]) 单选下拉
数据表格 st.dataframe(df) 展示Pandas DataFrame
图表 st.line_chart(df) 折线图
侧边栏 with st.sidebar: 侧边栏布局
列布局 col1, col2 = st.columns(2) 分列布局
对话气泡 st.chat_message("assistant") AI聊天专用
聊天输入框 st.chat_input("提示语") 带提交按钮的输入框

六、部署与分享

6.1 本地部署(局域网访问)

streamlit run app.py --server.port=8501 --server.address=0.0.0.0

6.2 云端部署(Streamlit Cloud)

  1. 将代码上传到GitHub仓库(公开)
  2. 用GitHub账号登录 share.streamlit.io
  3. 选择仓库、分支和启动文件,点击Deploy

注意事项

  • 云端部署时无法访问本地的Ollama服务
  • 如需云端部署AI聊天应用,需要改用云端API(如OpenAI API、通义千问API等)

七、总结

Streamlit让数据科学家和开发者摆脱了前端开发的束缚,把精力集中在数据和模型本身。无论你是想快速验证一个想法、构建一个内部工具,还是向客户展示产品原型,Streamlit都能让你在几分钟内从Python脚本走到可交互的Web应用

而构建AI聊天界面,Streamlit更是提供了开箱即用的解决方案:

3个核心APIst.chat_message + st.chat_input + st.session_state
1个第三方库ollama(或其他大模型SDK)
不到50行代码:一个完整的AI聊天应用

代码即应用,数据即界面——这就是Streamlit的哲学,也是AI应用开发的未来方向。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐