embedding-atlas
Apple 开源的交互式 Embedding 可视化工具,UMAP + Rust/WASM + We
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
Apple 开源的交互式 Embedding 可视化工具,UMAP + Rust/WASM + We
加载项目详情…
本应用为开源项目,仅供学习研究,请遵守其开源协议。
你花了两天时间,用 Sentence-Transformers 跑完了 200 万条文本数据,得到了 200 万个 768 维的向量。所有 cosine similarity 计算都通过了,但这堆数字到底长什么样?哪些聚类在一起?哪些是离群点?有没有数据分布不均匀的问题?你盯着终端里的一行行数字,一阵茫然——数据有了,却没有「看见」数据的能力。
Embedding Atlas 就是来解决这个问题的。它来自苹果机器学习团队(ML research group),最初发表在 arXiv(2505.06386),核心目标只有一个:把高维向量变成可以交互操作的 2D 地图,让你像用地图导航一样探索 embedding 空间。

图1:Embedding Atlas Dark Mode 界面,可以看到高维嵌入空间被映射为可交互的 2D 散点图,支持密度等高线、最近邻搜索和聚类自动标注。

图2:苹果机器学习研究团队出品,代码开源在 GitHub,MIT 许可证。
搞 AI 的朋友都熟悉 Embedding——本质上就是把图片、文本、音频这些东西编码成固定维度的数字向量。但高维向量有一个根本性的困难:人脑只能理解 2-3 维,超过这个维度,我们就没有直觉了。
传统的可视化方案有两个路线:
Embedding Atlas 走的是第三条路:把降维做成实时的、可交互的、多视图联动的。 你不仅能看到 embedding 的 2D 投影,还能实时搜索最近邻、切换聚类标签、拖动密度等高线——整个过程像用 Google Maps 探索城市一样流畅。
从代码架构来看,Embedding Atlas 是个典型的多语言 monorepo,分成了 9 个 npm workspace 包:
| 包名 | 技术栈 | 职责 |
|---|---|---|
| packages/umap | Rust | UMAP 降维算法核心实现,包含 nndescent 近似最近邻图构建 |
| packages/umap/umap-wasm | Rust → WASM | UMAP 算法编译为 WebAssembly,在浏览器端直接运行 |
| packages/density-clustering | Rust | 密度聚类算法,支持 CLI 和 WASM 双形态 |
| packages/component | TypeScript | Svelte 5 基础 UI 组件库 |
| packages/viewer | TypeScript + Svelte | 主可视化引擎,基于 Mosaic(Vega-Lite 扩展) |
| packages/embedding-atlas | TypeScript + Svelte | 面向终端用户的完整应用,含 WebGPU 渲染层 |
| packages/backend | Python | FastAPI + Click CLI,提供 Python API、Jupyter Widget 和 MCP Server |
| packages/examples | TypeScript | 示例项目 |
UMAP(Uniform Manifold Approximation and Projection)是目前最流行的降维算法之一,兼顾保留局部结构和全局结构。Embedding Atlas 在 Rust 层实现了完整的 UMAP 管线,构建 k-NN 图(用 nndescent 近似最近邻算法,O(n log n) 复杂度),然后做模糊单纯复形,最后做交叉熵最小化优化低维嵌入。
把 Rust 编译成 WASM 是整个架构最聪明的设计——降维计算直接在浏览器里跑,数据不需要上传服务器,最大程度保护了数据隐私。这对于处理医疗记录、隐私文档等敏感数据的用户尤其有价值。
除了 UMAP,Apple 团队还发表了一篇配套论文(2504.07285),介绍了一种可扩展的 embedding 投影聚类方法(A Scalable Approach to Clustering Embedding Projections)。这个算法会自动识别 embedding 图中的高密度区域,并给每个聚类生成一个语义化的标签——比如「正面评论聚集区」「技术术语区」。
聚类标签是通过聚合该聚类中最具代表性的文档片段来自动生成的,不需要人工标注。这让完全不了解数据结构的用户也能快速理解聚类的含义。
Embedding Atlas 宣称可以处理数百万个点,这在浏览器端是非常激进的目标。实现方式是 WebGPU——新一代浏览器图形 API,绕过 JavaScript 直接访问 GPU 计算单元。
传统 Canvas 2D 或 SVG 在渲染几万点时就开始卡顿,而 WebGPU 提供了更现代、更高效的计算着色器。Embedding Atlas 的渲染层把密度计算和点渲染都下放到了 GPU,真正实现了「拖动缩放如同操作本地应用」的流畅感。
渲染密集的点云还有一个视觉问题:当多个点在 2D 投影中重叠时,谁在前面?传统的深度排序会产生错误的遮挡感。Embedding Atlas 实现了顺序无关透明度(Order-Independent Transparency, OIT),让重叠区域的颜色自然混合,呈现正确的视觉效果。
Embedding Atlas 的产品设计非常务实,提供了三种不同的使用入口,覆盖了不同的用户场景:
一行命令,读取 CSV/Parquet 文件,自动做 embedding + UMAP 降维 + 可视化。背后依赖 sentence-transformers 做编码,pandas + duckdb 做数据处理,pyarrow 做列式存储加速。
底层技术栈:Python ≥ 3.11,Click CLI,FastAPI(本地 server),uvloop(Linux/macOS 高性能事件循环),litellm(统一 LLM 接口),narwhals(DataFrame API 抽象层)。
数据科学家可以在 Jupyter 里直接嵌入交互式可视化,边分析边探索,不需要切换工具。对于需要反复实验、对比不同 embedding 方案效果的场景,这个入口比 CLI 更方便。
底层用的是 anywidget(Jupyter Widget 的 modern 实现)+ streamlit(作为本地 web server)。
面向前端开发者,可以把可视化能力集成到自己的 Web 应用里。这是一个嵌入式组件库,提供 React 版本和 Svelte 版本开箱即用。
今年 AI Agent 火遍全网,Embedding Atlas 也跟上了这个趋势。它内置了一个 MCP Server(Model Context Protocol),让 AI Agent 可以:
这意味着 Agent 可以在做数据分析时,把 Embedding Atlas 当成一个带视觉能力的数据探索工具来调用。比如 Agent 发现某个聚类区域密度异常,可以自动截图并报告给用户。
值得特别强调的是,Embedding Atlas 的所有降维计算默认在本地运行。WASM 版在浏览器里做 UMAP,Python CLI 版在本地跑——数据不离开用户的机器。
这对隐私敏感场景(医疗、金融、法律)非常有意义。一个典型的场景是:医院训练了一个肿瘤影像 embedding 模型,想让医生可视化探索模型对哪些区域最敏感——用 Embedding Atlas,医生可以在本地打开模型分析,不需要把患者影像数据上传到任何云端。
Embedding Atlas 带了一个完整的多视图仪表盘系统(基于 Mosaic/Vega-Lite)。支持以下图表类型:
更重要的是,这些图表和 embedding 图是联动的——你在 embedding 图里框选一个区域,仪表盘里的图表会自动过滤到只显示选中区域的数据。这叫跨过滤(Cross-filtering),是数据分析工具中的高级特性。
Embedding Atlas 不仅支持文本 embedding,还原生支持图片、音频、数值、类别、时间等多种数据类型。对于每种类型,都有对应的 viewer 组件负责渲染——图片列会显示缩略图,音频列会显示波形图,时间列会做时间轴布局。
这种设计让它不只是一个「embedding 可视化工具」,而是一个通用的多模态数据探索平台。
好消息:
挑战:
结论:适合本地使用,不适合无服务器的云端部署。
Embedding Atlas 的出现,填补了 embedding 可视化这个细分的空白。过去,AI 研究者要么用 TensorBoard(偏重训练曲线),要么用静态的 matplotlib/seaborn 图——两者都无法满足「实时交互 + 多模态数据 + 密度分析」的综合需求。
从更宏观的角度看,Apple 开源这个项目,体现了大厂在 AI 可解释性(Explainable AI)方向上的投入。当模型越来越复杂,AI 的可解释性工具会变得越来越重要——Embedding Atlas 正是这个方向上一个高质量的、有生产力的工具。
数据来源:GitHub(apple/embedding-atlas,MIT License)、arXiv 论文(2505.06386、2504.07285、2607.08746)。分析时间:2026-07-26。