
Ai学习的老章
长期跟踪关注统计学、机器学习算法、深度学习、人工智能、大模型技术与行业发展动态,日更精选技术文章。回复机器学习有惊喜资料。
695篇原创内容
公众号
大家好,我是Ai学习的老章
介绍一个用纯 Python 构建交互式 Web 应用和 AI 助手——Shiny for Python
对于广大的 Python 开发者和数据科学家而言,传统的前端开发(HTML, CSS, JavaScript)往往是一道难以逾越的鸿沟。
Shiny for Python 仅使用 Python,就能构建出功能强大、响应迅速、界面精美的交互式 Web 应用和 AI 助手。
比如:可以用自然语言与你的数据对话,让 AI 自动生成 SQL 查询并更新仪表盘:
自然语言查询数据
或者构建一个能理解图片内容并生成详细描述的多模态应用:
AI 图像描述器
本文从零开始,全面、深入地探索 Shiny for Python ,从环境搭建、核心概念,到高级布局、应用部署,最后将重点介绍如何利用它构建前沿的生成式 AI 应用。
Shiny for Python 不仅仅是一个数据可视化工具,它是一个全功能的 Web 应用框架,其设计哲学使其成为数据科学领域的理想选择。
pandas, plotly, matplotlib 等库,将它们无缝集成到交互式应用中。强烈建议在虚拟环境中安装 Shiny,以保持项目依赖的纯净。
# 1. 创建项目目录并进入
mkdir my-shiny-app
cd my-shiny-app
# 2. 创建虚拟环境
python3 -m venv .venv
# 3. 激活虚拟环境
# Mac/Linux
source .venv/bin/activate
# Windows (PowerShell)
# .venv\Scripts\Activate.ps1
# 4. 安装 Shiny
pip install shiny
推荐使用 Positron[3](一个为数据科学优化的 VS Code 分支)或标准的 Visual Studio Code[4]。请务必在 IDE 中安装 Shiny 扩展,它会提供一键运行、调试等便捷功能。
在 IDE 中运行 Shiny 应用
为了获得最佳的类型提示和代码补全体验,建议在你的项目根目录下创建 .vscode/settings.json 文件,并添加以下配置:
{
"python.analysis.typeCheckingMode": "basic",
"python.analysis.diagnosticSeverityOverrides": {
"reportUnusedFunction": "none"
}
}
这会开启基础的类型检查,并忽略“函数未使用”的警告(因为 Shiny 的响应式函数通常是隐式调用的)。
Shiny 的命令行工具(CLI)让创建应用变得异常简单。
# 在你的项目目录中运行
shiny create
该命令会引导选择一个模板并生成一个名为 app.py 的文件。这是你的应用入口。
要运行应用,你可以:
shiny run --reload。--reload 参数会在你保存代码后自动刷新应用。一个 Shiny 应用由两部分组成:
让我们通过一个简单的例子来理解:
# app.py
from shiny.express import input, render, ui
# --- UI ---
# 创建一个名为 "val" 的滑块输入,范围 0-100,默认值 50
ui.input_slider("val", "选择一个数值", min=, max=, value=)
# --- Server ---
# 定义一个文本输出
@render.text
def slider_val():
# 读取滑块 "val" 的当前值,并格式化为字符串返回
return f"滑块的当前值是: {input.val()}"
这个例子完美地展示了 Shiny 的核心机制:
ui.input_slider() 创建了一个前端滑块控件,其 id 是 "val"。@render.text 装饰器声明了一个函数 slider_val,它的返回值将作为文本显示在前端。slider_val 函数内部,我们通过 input.val()读取了滑块的值。这就是响应式编程的魔力:Shiny 自动检测到 slider_val 的输出依赖于 input.val() 的输入。当用户在浏览器中拖动滑块时,input.val() 的值发生变化,Shiny 会自动重新执行slider_val 函数,并将新的返回值更新到前端页面上。整个过程,你无需编写任何事件监听或回调函数。
Shiny 提供了强大的布局工具和组件,能轻松构建复杂的仪表盘。
使用 ui.sidebar 和 ui.layout_columns 等上下文管理器,可以清晰地组织布局。
# 一个带有侧边栏的布局示例
from shiny.express import ui
ui.page_opts(title="我的仪表盘")
with ui.sidebar():
ui.input_slider("n", "选择一个数", , , )
# 主内容区域可以放置图表等输出
@render.plot
def my_plot():
# ... 绘图代码 ...
pass
通过 ui.nav_panel,可以轻松创建多页面或多标签页的应用。
多标签页应用
# 一个多标签页应用示例
from shiny.express import ui
with ui.navset_card_underline(title="数据分析"):
with ui.nav_panel("图表"):
# ... 图表相关的 UI 和 Server 代码 ...
with ui.nav_panel("数据表"):
# ... 数据表相关的 UI 和 Server 代码 ...
通过 shinywidgets 库,可以将 Plotly, Altair, Bokeh 等流行的交互式图表库无缝集成到 Shiny 中。
# 集成 Plotly 示例
import plotly.express as px
from shiny.express import ui
from shinywidgets import render_widget
ui.input_select("var", "选择变量", ["total_bill", "tip"])
@render_widget
def hist():
# Plotly 的图表对象可以直接返回
return px.histogram(px.data.tips(), x=input.var())
分享应用,有多种选择:
Shiny Server 和功能更强大的商业版 Posit Connect。Shiny 是构建生成式 AI 应用的理想前端框架。其响应式和流式特性与大语言模型(LLM)的交互模式完美契合。
Shiny 社区已经涌现出许多令人惊叹的 AI 应用模板:
querychat):用户输入自然语言问题,AI 将其转换为 SQL 查询,执行后动态更新图表。LLM 的知识有其局限性(知识截止日期、不了解私有数据)。RAG 是解决这一问题的关键技术,它能让 LLM 基于你提供的特定文档来回答问题。
RAG 的核心流程如下:
一个基础的 RAG 对比效果:
没有 RAG (模型不知道答案) | 有了 RAG (模型根据上下文回答) |
|---|---|
在 Shiny 中实现 RAG,你需要 sentence-transformers 这样的库来做向量转换,以及 chatlas 或类似库来与 LLM 交互。对于大规模应用,推荐使用专门的向量数据库,如 duckdb 的向量扩展、Pinecone 或 Weaviate。
参考资料
[1]
Starlette: https://www.starlette.io/
[2]
asyncio: https://docs.python.org/3/library/asyncio.html
[3]
Positron: https://positron.posit.co/download.html
[4]
Visual Studio Code: https://code.visualstudio.com/
[5]
shinyapps.io: https://www.shinyapps.io/
[6]
Shiny Gallery: https://shiny.posit.co/py/gallery/
[7]
Get Started: https://shiny.posit.co/py/get-started/
[8]
GenAI Templates: https://shiny.posit.co/py/templates/#gen-ai