数据科学团队常面临一个交付缺口:Notebook 里是分析和模型,业务同事要的却是可以在浏览器里安全操作、随参数更新的结果。Mercury(MLJAR 开发,MIT 协议)正是解决这个断层的开源框架:把 Jupyter Notebook 直接暴露成 Web 应用,运行时可动态接收参数、执行代码并展示输出,无需重写前端,也不离开数据分析流程。它的核心做法是在 Notebook 首端增加一段 YAML 元数据定义控件,浏览器端完成参数录入、文件上传与结果查看;服务端支持用户认证、隐藏源代码、多用户并发执行,并可通过 CLI/Docker 像普通服务一样发布。本文按安装 → 上手 → 核心能力 → 部署 → 选型 → 常见误区的顺序,带你完整走一遍从 Notebook 到 Web 应用的发布路径。
掌握 Mercury,意味着将日常 Notebook 实验直接升级为可交互的 Web 程序,数据分析到业务交付的链路可压缩到几十分钟,算法成果的可见度与复用率显著提升。
目录
速览卡是工具类内容的固定首屏模块:30 秒判断「这工具是什么、能不能商用、适不适合我」。
为什么需要 Mercury:Notebook 交付的断点
传统做数据交付的链路是断裂的:业务同事收到 .ipynb 文件后,需要自行安装 Python 和依赖,逐个单元格运行才能看到结果;一旦想换一组参数,就必须理解代码并手动修改,门槛极高。要绕过这个门槛,团队往往得调度前后端资源,为同一个分析重新开发一个 Web 界面,耗时远超分析本身。Notebook 里沉淀的分析逻辑,就此停留在“能看不能用”的状态。
Mercury 的解法是把“数据代码”和“交互界面”直接绑定在 Notebook 上。你在 Notebook 最前面加一段 YAML 元数据,声明标题、描述、需要暴露的参数以及参数类型(文本框、滑块、下拉选项、文件上传等),其余代码保持原样。运行 mercury run 启动服务后,浏览器中访问该地址即可看到自动生成的表单;每提交一组参数,Mercury 会在服务端重新执行整个 notebook,并展示最新的图表、表格和文字结果。整个过程无需掌握 HTML/CSS/JS,也不需要迁移代码。
与同类工具相比,Mercury 的气质差异明显:Streamlit 要求以脚本为中心重写逻辑,Voilà 更偏静态展示,而 Mercury 尊重已有的 Notebook 资产,适合“从研究到交互演示”的跳跃,尤其适合已经用 Notebook 完成建模、只差一个发布出口的 AI 团队。
安装与环境配置:3 步就绪
第一步,安装 PyPI 包。Mercury 依赖较少,pip 会自动处理 Jupyter 生态相关依赖,不需要单独安装 JupyterLab 扩展。
第二步,准备一个存放 notebook 的目录。实际生产中建议一个应用一个目录,便于后续用 Docker 打包。
第三步,启动服务并验证。mercury run 默认监听 8000 端口,启动后终端会显示访问地址,用浏览器或 curl 确认返回 200 即安装成功。
注意事项:如果你之前装过早期版本,升级后用 pip show mercury 查看版本号,避免继续使用旧命令入口。
# 安装 Mercurypip install mercury # 创建并进入应用目录mkdir -p notebooks && cd notebooks # 启动服务(默认端口 8000)mercury run --port 8000 # 验证服务已启动curl -I http://127.0.0.1:8000
快速上手:15 分钟跑通第一个示例
思路很直接:新建一个 notebook,在顶部加一个 Raw 单元格写 YAML 参数定义,在代码单元格中直接使用参数对应的变量名,保存后启动服务即可。最小可用流程不涉及任何前端代码。
1. 在 Jupyter 中新建 notebook,插入一个空白单元格。
2. 通过菜单 Cell → Cell Type → Raw NBConvert 将该单元格改为 Raw。
3. 在 Raw 单元格中粘贴 YAML 配置(见下方代码块),定义应用标题、是否显示代码和两个参数控件。
4. 新建一个代码单元格,写入使用 name 和 clicks 变量的 Python 逻辑。
5. 保存 notebook,在终端运行 mercury run --port 8000。
6. 浏览器打开 http://127.0.0.1:8000,左侧列表中选择刚保存的 notebook,页面上会出现文本框、滑块和 Run 按钮。
7. 把滑块值从 20 改为 50,点击 Run,直方图会按新参数重新计算并刷新。
结果是一个可交互的直方图应用:修改滑块、点击 Run,图表立刻更新。进阶技巧:把 show-code 改为 true 可以让访问者看到代码;把 text 控件换成 select 或 file,即可扩展成“选择分组”或“上传 CSV 后分析”的真实业务场景。
---title: 我的第一个 Mercury 应用description: 数据科学团队内部演示show-code: falseparams: name: input: text label: 你的名字 value: 数据科学家 clicks: input: slider label: 模拟次数 min: 1 max: 100 value: 20---
import numpy as npfrom matplotlib import pyplot as plt # 这里的 name、clicks 由 Mercury 在运行时注入# value 字段的值就是 notebook 离线运行的默认值print(f"你好,{name}!下面是用 {clicks} 次模拟生成的直方图:")plt.hist(np.random.randn(clicks), bins=10)plt.show()
核心能力详解:参数化、执行引擎与发布能力
参数化控件自动生成。 Mercury 的参数定义放在 notebook 顶部 Raw 单元格的 YAML 块中,格式以 --- 包裹。params 下的键名必须与 notebook 代码中出现的变量名一致;value 字段不仅是控件默认值,也是 notebook 脱离 Mercury 独立运行时的回退值。框架按 input 字段映射控件类型:text 映射文本框,numeric 映射数字输入,slider 映射滑杆,select 和 multiselect 映射单选/多选下拉,date 映射日期选择器,file 映射文件上传。min、max、step 等键控制数值约束。这意味着给 Notebook 增加交互能力不需要新框架,只需要一段声明式 YAML。
服务端执行引擎与多用户状态。 当用户在网页上提交参数,Mercury 不会改动你的 notebook 源文件:它创建一个独立执行实例,把表单值替换为同名变量,执行全部单元格,再把图表、print 输出、DataFrame 渲染回页面。多个用户同时操作同一个应用时,各自的任务独立排队,互不干扰。执行过程中的 stdout 和 stderr 会显示在页面上,方便使用者判断任务是否成功。需要留意的是,每次执行都是一次完整重跑,应用的响应时间约等于 notebook 从上到下跑完一遍的时间。
发布与保护能力。 show-code 字段控制代码在浏览器端的可见性,设为 false 时源码不会发送到浏览器,只传输执行结果。服务端支持用户名/密码的 Basic Auth,以及 GitHub、Google 的 OAuth 登录,适合挂在公司内网给非技术同事使用。官方提供 Docker 镜像 mljar/mercury,可以一键把多个 notebook 打包成独立服务,嵌入现有基础设施。对 AI 团队而言,从 notebook 到可交付应用的路径被压缩到“写 YAML + 跑服务”两步。
生产部署与监控:从上线到运维
单机部署。 生产环境最直接的方案是把 mercury run --port 8000 交给 systemd 或 supervisor 常驻运行,前面架一层 Nginx 做域名和 TLS 终结,反代到 8000 端口。内部工具场景下这个架构足够稳定;如果涉及文件上传,需要同步调整 Nginx 的请求体大小限制和超时配置。
Docker 化部署。 官方镜像 mljar/mercury 自带运行环境。写一个极简 Dockerfile:FROM mljar/mercury,把 notebooks 目录 COPY 进镜像,WORKDIR 指向该目录,EXPOSE 8000,最后用 CMD ["mercury", "run", "--port", "8000"] 启动。用 docker-compose 统一管理资源限制、重启策略和日志卷,交付给运维团队时比裸机方案更可复现。流量增长后可以加多副本,前面用负载均衡分发。
可观测性。 Mercury 把应用内日志输出到控制台,建议统一收集 stdout/stderr 到 Loki 或 ELK。监控重点有三个:应用响应延迟(从反向代理侧统计)、执行失败率(检查终端日志中的 traceback)、内存与 CPU 占用(频繁整本重跑大型 notebook 会显著拉高资源)。页面上的执行状态本身就是一种粗粒度监控——用户在页面看到进度和报错信息,能第一时间反馈给负责人。
<p class="para-label">避坑清单:</p>
<ul class="dash-list"><li>旧 Python 环境直接安装失败:建议在 Python 3.9+ 的干净虚拟环境中安装,避免和 Conda 基础环境冲突,安装后用 pip show mercury 验证。</li><li>YAML 变量名与代码不一致:params 的键必须与 notebook 代码中的变量名严格对应,否则用户修改控件后,执行结果不会变化。</li><li>依赖未固化导致运行报错:notebook 中 import 了 pandas、scikit-learn,但部署镜像没装,一执行就 ModuleNotFoundError;务必用 requirements.txt 随镜像一起构建。</li><li>把重型训练直接放进交互应用:每次提交参数都会整本重跑,训练类任务会拖垮单机;交互应用只放推理和分析,训练放到异步批处理。</li><li>低估敏感代码的暴露风险:未设置 show-code 时代码默认可见,涉及密钥或机密逻辑的 notebook 应隐藏代码并开启认证后再发布。</li></ul>
| 维度 | Mercury | Streamlit | Voilà | Dash |
|---|---|---|---|---|
| 定位 | Notebook 到 Web 应用转换 | Python 脚本到 Web 应用 | Notebook 到只读/轻交互页面 | 数据应用与仪表盘框架 |
| 编排范式 | .ipynb + YAML 参数元数据 | .py 脚本自上而下执行 | .ipynb + ipywidgets | .py 布局 + 回调函数 |
| 类型约束 | text/slider/select/file 等十余种控件 | 原生组件丰富,支持状态管理 | 依赖 ipywidgets 组件 | 组件库庞大,可控性最强 |
| 学习曲线 | 低(复用已有 Notebook) | 低(纯脚本) | 低 | 中高(需理解回调机制) |
| 生态集成 | Jupyter、pandas、matplotlib | pandas、Plotly、缓存机制 | JupyterHub、Binder | Plotly 图表为核心 |
| 生产部署 | mercury run / Docker / 官方云 | Community Cloud / 自托管 | JupyterHub 或静态托管 | Gunicorn 等 WSGI 部署 |
| License | MIT | Apache 2.0 | BSD-3-Clause | MIT |
| 适合谁 | 已有 Notebook 且要交付的数据团队 | 从零构建快速原型的开发者 | 偏展示和静态报告的团队 | 深度定制生产级仪表盘的团队 |
选型建议:如果你手里已经有一套运行良好的 Notebook,且目标是让业务同事在浏览器里交互调参,Mercury 是成本最低的路径;从零开始做数据分析原型,选 Streamlit 更灵活;只需要把 Notebook 变成只读页面分享,选 Voilà;需要复杂联动、强定制和高并发仪表盘,则应该直接考虑 Dash。
AI 应用场景
内部数据分析看板
阶段:数据产品交付与交互报告
解决的问题:传统方式下分析师把统计结论整理成 PPT 或 Excel,业务方只能看静态结果,无法自行更换参数。Mercury 把“参数化分析 notebook”变成 Web 页面后,业务方直接在浏览器切换渠道、日期、品类等维度,图表和明细表同步刷新,省去反复提需求的沟通成本。
具体案例:电商团队把“销售周报”notebook 发布到公司内网,运营每次只需在页面上改两个下拉框,几分钟内拿到对应维度的图表和明细;原先每份定制报告需要分析师半天,现在压缩到分钟级自助查询。
模型推理演示
阶段:模型推理与效果展示
解决的问题:模型训练完成后,算法团队常被要求“给业务方看看效果”。写临时 demo 或录屏都无法实时交互,说服力有限。用 Mercury 把加载模型、单条推理、输出概率的 notebook 参数化发布,业务方可自行调整特征输入,实时观察模型输出。
具体案例:风控团队发布一个“评分卡试算器”,产品经理在评审会上输入收入、负债、历史违约次数等字段,即时得到评分和理由,原先数天的 demo 开发周期被压缩到几小时。
交互式教学与培训
阶段:知识传递与实验
解决的问题:培训时让学员配置 Python 环境成本很高,且环境不可复现。Mercury 将教学 notebook 发布为统一 URL,学员只用浏览器调参就能体验代码行为和结果,不接触环境和安装步骤。
具体案例:数据团队训练营把“AB 检验统计功效”实验做成 Mercury 应用,学员调整样本量、显著性和效应量,实时看到功效曲线变化,学习反馈链路显著缩短,讲师也不需要逐个排查学员环境问题。
常见误区
误区Mercury 应该是把 Jupyter 放到公网上,大家可以在浏览器里编辑代码跑模型的那种在线 Notebook 工具。
正解Mercury 的定位是把 Jupyter Notebook 转换成 Web 应用。最终用户看到的是参数控件和输出结果,而不是代码单元格;他们无法直接编辑代码。需要多人协作编辑代码的在线环境应使用 JupyterHub,而非 Mercury。
为何常见:Mercury 与 Jupyter 深度绑定,应用页面又包含代码输出和图表,容易让人误以为它和 JupyterHub 是同一类服务。
误区发布一个可交互 Web 应用,起码得会 HTML、CSS、JavaScript,或者把整个分析重写成 Python 框架。
正解Mercury 不需要写任何前端代码。你把 YAML 参数块加到 Notebook 头部,页面上的输入控件由框架自动生成;业务逻辑代码保持原样。前端开发经验在 Mercury 场景下不是必需条件。
为何常见:大多数 Web 应用采用传统前后端架构,而 Mercury 这种以 Notebook 为中心的生成式模式超出直觉,容易让人默认它有很高的 Web 开发门槛。
误区网页总能查看源码,所以 Mercury 隐藏代码只是心理安慰,用户用开发者工具就能看到。
正解在 show-code: false 时,Notebook 源码不会发送到浏览器,传输到客户端的只有执行结果。这不是视觉隐藏,而是传输层面的过滤。当然,涉及敏感数据时仍应同时开启认证,避免未授权用户调用应用。
为何常见:Web 前端源码可见是普遍认知,用户习惯性地把"Mercry"的代码保护理解为前端遮挡,忽略了服务端渲染和传输截断的差异。
误区既然 Notebook 能在服务端执行,那我可以在浏览器里跑深度学习训练,边拖滑块边看 loss 变化。
正解Mercury 的执行模型是“参数变化 → 整本 Notebook 重跑”(从离线笔记推算出的基本执行单元)。它适合秒级到分钟级的分析、推理和报表生成;训练和长时间计算应放在作业调度或异步批处理中,不要放进交互应用。
为何常见:用户已习惯在本地 Jupyter 中长时间运行训练,交互式 UI 容易让人误以为服务端资源是无限的。
误区必须在 JupyterHub 或 JupyterLab 环境里才能跑 Mercury,运维成本很高。
正解Mercury 是独立的 Python 服务和 CLI 工具。装好 pip install mercury 后,无论是否安装 JupyterLab,mercury run 都能直接启动 Web 服务。生产环境可以直接用 Docker 镜像打包,与 Jupyter 相关的底层组件只是依赖,不是必需的平台。
为何常见:Mercury 处理的是 .ipynb 文件,和 Jupyter 关系紧密,容易让人误以为它必须托管在 Jupyter 平台上。
面试题
Q1. 安装 Mercury 使用的命令是?
- A.brew install mercury
- B.pip install mercury← 正确答案
- C.conda install mercury
- D.apt-get install mercury
答案:B。Mercury 发布在 PyPI,官方安装方式是 pip install mercury。conda 渠道和系统包管理器并不官方提供该包,Brew 也不适用于 Python 包安装。
Q2. 在本地启动 Mercury 服务,正确的命令是?
- A.mercury serve
- B.mercury run← 正确答案
- C.jupyter run
- D.nbconvert run
答案:B。Mercury 提供的 CLI 启动入口是 mercury run,通过 --port 参数可指定监听端口。serve、jupyter run 和 nbconvert run 都不是 Mercury 的启动命令。
Q3. Mercury 作为应用载体的最小单元是什么?
- A.HTML 文件
- B.Jupyter Notebook← 正确答案
- C.Python 模块
- D.Docker 镜像
答案:B。Mercury 接受 .ipynb 格式的 Notebook 作为输入,访问 URL 后由服务端渲染成 Web 页面。HTML 和 Docker 镜像是部署产物或输出形式,不是应用输入单元。
Q4. 在 Notebook 中声明参数控件的正确位置是?
- A.任意代码单元格的注释中
- B.前端 Raw 单元格的 YAML 块中← 正确答案
- C.独立 requirements.txt 中
- D.环境变量配置中
答案:B。Mercury 解析 notebook 顶部 Raw 单元格中的 YAML 元数据,其中 params 段定义控件;requirements.txt 只管理依赖,环境变量负责运行时配置,均不能定义参数控件。
Q5. 当 YAML 中 show-code: false 时,浏览器端如何处理代码?
- A.加水印后发送到前端
- B.完全不向浏览器发送← 正确答案
- C.压缩后发送到单页应用
- D.加密后发送给管理员
答案:B。show-code: false 时,Notebook 源码不会进入浏览器,服务端只传回执行结果。这不是视觉层面的隐藏,而是传输层面的过滤,比“前端遮挡”更安全。
Q6. 下列哪个 YAML input 类型允许用户在浏览器上传文件?
- A.text
- B.file← 正确答案
- C.select
- D.slider
答案:B。file 类型会在页面生成文件上传控件,用户选择的文件内容可传入 notebook 变量进一步处理;text、select、slider 分别是文本框、下拉和滑杆,不具备文件上传能力。
Q7. Mercury 支持启用哪些认证方式?
- A.用户名与密码← 正确答案
- B.Google OAuth← 正确答案
- C.GitHub OAuth← 正确答案
- D.短信验证码
答案:ABC。Mercury 的认证能力包括 Basic Auth(用户名/密码)以及 Google、GitHub 的 OAuth 登录。短信验证码不在其内置能力范围内,属于额外开发需求。
Q8. 以下哪些部署方式适合 Mercury 应用?
- A.本地服务器配合 Nginx 反向代理← 正确答案
- B.Docker 容器← 正确答案
- C.Kubernetes 与 Ingress← 正确答案
- D.纯静态托管(如 GitHub Pages)
答案:ABC。Mercury 依赖服务端执行 Notebook,静态托管只能提供静态文件,无法完成参数化重跑。A、B、C 三种方式都能支撑服务端执行,是实际可用的部署路径。
Q9. 用户在浏览器修改参数并触发执行后,Mercury 服务端的默认行为是?
- A.仅重跑被修改参数的单元格
- B.以新参数重新执行整个 Notebook← 正确答案
- C.在浏览器本地执行代码单元格
- D.直接返回上一次的缓存结果
答案:B。Mercury 的参数化执行逻辑是以新值整本重跑 Notebook,从而保证输出与当前输入一致;它不会做单元格级增量计算,也不在浏览器本地执行,更不会默认返回缓存。
Q10. 关于 Mercury,下列说法正确的是?
- A.复用已有 Notebook 代码,无需重写前端← 正确答案
- B.YAML 中 value 兼作默认值和离线回退值← 正确答案
- C.用户可以直接编辑 Notebook 源码
- D.支持多用户并发执行与任务排队← 正确答案
答案:ABD。A、B、D 与官方能力一致:YAML 声明参数、代码直接复用,value 提供离线默认值,服务端支持并发与排队;C 错误,最终用户只能操作参数控件,不能编辑源码。