数据科学团队常面临一个交付缺口:Notebook 里是分析和模型,业务同事要的却是可以在浏览器里安全操作、随参数更新的结果。Mercury(MLJAR 开发,MIT 协议)正是解决这个断层的开源框架:把 Jupyter Notebook 直接暴露成 Web 应用,运行时可动态接收参数、执行代码并展示输出,无需重写前端,也不离开数据分析流程。它的核心做法是在 Notebook 首端增加一段 YAML 元数据定义控件,浏览器端完成参数录入、文件上传与结果查看;服务端支持用户认证、隐藏源代码、多用户并发执行,并可通过 CLI/Docker 像普通服务一样发布。本文按安装 → 上手 → 核心能力 → 部署 → 选型 → 常见误区的顺序,带你完整走一遍从 Notebook 到 Web 应用的发布路径。

岗位关联

掌握 Mercury,意味着将日常 Notebook 实验直接升级为可交互的 Web 程序,数据分析到业务交付的链路可压缩到几十分钟,算法成果的可见度与复用率显著提升。

目录
  1. 为什么需要 Mercury:Notebook 交付的断点
  2. 安装与环境配置:3 步就绪
  3. 快速上手:15 分钟跑通第一个示例
  4. 核心能力详解:参数化、执行引擎与发布能力
  5. 生产部署与监控:从上线到运维
  6. AI 应用场景
  7. 常见误区
  8. 面试题
工具类型
Notebook 到 Web 应用的发布/转换框架(开源)
开发商
MLJAR(波兰·华沙)
开源协议
MIT(可商用)
主要语言
Python(Jupyter 生态)
当前版本
1.x(2022 年 6 月发布 1.0,持续迭代)
安装方式
pip install mercury
上手难度
★★☆☆☆(低,熟悉 Notebook 即可)
适合人群
数据科学家、机器学习工程师、数据产品经理
同类工具
Streamlit、Voilà、Dash
托管服务
无

速览卡是工具类内容的固定首屏模块: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 查看版本号,避免继续使用旧命令入口。

bash11 行
# 安装 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 后分析”的真实业务场景。

yaml16 行
---title: 我的第一个 Mercury 应用description: 数据科学团队内部演示show-code: falseparams:    name:        input: text        label: 你的名字        value: 数据科学家    clicks:        input: slider        label: 模拟次数        min: 1        max: 100        value: 20---
python8 行
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>

维度MercuryStreamlitVoilàDash
定位Notebook 到 Web 应用转换Python 脚本到 Web 应用Notebook 到只读/轻交互页面数据应用与仪表盘框架
编排范式.ipynb + YAML 参数元数据.py 脚本自上而下执行.ipynb + ipywidgets.py 布局 + 回调函数
类型约束text/slider/select/file 等十余种控件原生组件丰富,支持状态管理依赖 ipywidgets 组件组件库庞大,可控性最强
学习曲线低(复用已有 Notebook)低(纯脚本)低中高(需理解回调机制)
生态集成Jupyter、pandas、matplotlibpandas、Plotly、缓存机制JupyterHub、BinderPlotly 图表为核心
生产部署mercury run / Docker / 官方云Community Cloud / 自托管JupyterHub 或静态托管Gunicorn 等 WSGI 部署
LicenseMITApache 2.0BSD-3-ClauseMIT
适合谁已有 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 使用的命令是?

单选题 · easy

  • 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 服务,正确的命令是?

单选题 · easy

  • 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 作为应用载体的最小单元是什么?

单选题 · easy

  • A.HTML 文件
  • B.Jupyter Notebook← 正确答案
  • C.Python 模块
  • D.Docker 镜像

答案:B。Mercury 接受 .ipynb 格式的 Notebook 作为输入,访问 URL 后由服务端渲染成 Web 页面。HTML 和 Docker 镜像是部署产物或输出形式,不是应用输入单元。

Q4. 在 Notebook 中声明参数控件的正确位置是?

单选题 · mid

  • A.任意代码单元格的注释中
  • B.前端 Raw 单元格的 YAML 块中← 正确答案
  • C.独立 requirements.txt 中
  • D.环境变量配置中

答案:B。Mercury 解析 notebook 顶部 Raw 单元格中的 YAML 元数据,其中 params 段定义控件;requirements.txt 只管理依赖,环境变量负责运行时配置,均不能定义参数控件。

Q5. 当 YAML 中 show-code: false 时,浏览器端如何处理代码?

单选题 · mid

  • A.加水印后发送到前端
  • B.完全不向浏览器发送← 正确答案
  • C.压缩后发送到单页应用
  • D.加密后发送给管理员

答案:B。show-code: false 时,Notebook 源码不会进入浏览器,服务端只传回执行结果。这不是视觉层面的隐藏,而是传输层面的过滤,比“前端遮挡”更安全。

Q6. 下列哪个 YAML input 类型允许用户在浏览器上传文件?

单选题 · mid

  • A.text
  • B.file← 正确答案
  • C.select
  • D.slider

答案:B。file 类型会在页面生成文件上传控件,用户选择的文件内容可传入 notebook 变量进一步处理;text、select、slider 分别是文本框、下拉和滑杆,不具备文件上传能力。

Q7. Mercury 支持启用哪些认证方式?

多选题 · mid

  • A.用户名与密码← 正确答案
  • B.Google OAuth← 正确答案
  • C.GitHub OAuth← 正确答案
  • D.短信验证码

答案:ABC。Mercury 的认证能力包括 Basic Auth(用户名/密码)以及 Google、GitHub 的 OAuth 登录。短信验证码不在其内置能力范围内,属于额外开发需求。

Q8. 以下哪些部署方式适合 Mercury 应用?

多选题 · mid

  • A.本地服务器配合 Nginx 反向代理← 正确答案
  • B.Docker 容器← 正确答案
  • C.Kubernetes 与 Ingress← 正确答案
  • D.纯静态托管(如 GitHub Pages)

答案:ABC。Mercury 依赖服务端执行 Notebook,静态托管只能提供静态文件,无法完成参数化重跑。A、B、C 三种方式都能支撑服务端执行,是实际可用的部署路径。

Q9. 用户在浏览器修改参数并触发执行后,Mercury 服务端的默认行为是?

单选题 · hard

  • A.仅重跑被修改参数的单元格
  • B.以新参数重新执行整个 Notebook← 正确答案
  • C.在浏览器本地执行代码单元格
  • D.直接返回上一次的缓存结果

答案:B。Mercury 的参数化执行逻辑是以新值整本重跑 Notebook,从而保证输出与当前输入一致;它不会做单元格级增量计算,也不在浏览器本地执行,更不会默认返回缓存。

Q10. 关于 Mercury,下列说法正确的是?

多选题 · hard

  • A.复用已有 Notebook 代码,无需重写前端← 正确答案
  • B.YAML 中 value 兼作默认值和离线回退值← 正确答案
  • C.用户可以直接编辑 Notebook 源码
  • D.支持多用户并发执行与任务排队← 正确答案

答案:ABD。A、B、D 与官方能力一致:YAML 声明参数、代码直接复用,value 提供离线默认值,服务端支持并发与排队;C 错误,最终用户只能操作参数控件,不能编辑源码。