LanceDB:给 AI 数据造一个多模态的家

Yicheng 于 2026-03-14 发布

最近在折腾 AI 应用的数据层,自然就开始用起来了:LanceDB

LanceDB 是什么

一句话:开源的多模态 AI 数据湖(Lakehouse)

它底层基于 Lance 列式存储格式(类似 Parquet,但是在随机读取上做了优化),可以在同一张表里同时存储:

而且它是嵌入式数据库——跟 SQLite 一个思路,不需要单独部署服务器,npm install 完就能用。

核心特性

1. 真正的多模态存储

不是那种”我也能存图片哦”的噱头。Lance 格式原生支持高效的 Blob 编码和惰性加载(lazy loading)——存一张 10MB 的图,查询时如果你只要 metadata,它不会傻乎乎地把整张图都读进内存。

2. 向量搜索,快得离谱

官方说比 Parquet 快 100 倍。实测没那么夸张,但确实能感受到速度差距,特别是随机访问场景。

3. 零基础设施

不用 Docker,不用 K8s,不用任何服务端进程。

import * as lancedb from "@lancedb/lancedb";
const db = await lancedb.connect("./my_data");

甚至可以直接把数据放在 S3 上,从 网页前端 里直接查询。

4. 多语言 SDK

Python、TypeScript/JavaScript、Rust 三个 SDK 。这意味着你可以:

三个语言操作同一份数据,无缝衔接。

最近的工作都是用Python来读写lance文件。正好想要探索一下应用层的一些玩法,所以就来试试 LanceDB 的 TypeScript SDK。Vibe coding with LanceDB!

用 TypeScript 存一张多模态表

用 LanceDB 的 TypeScript SDK 演示一下:创建一张包含日期、描述文字、图片二进制数据的多模态表

安装

npm install @lancedb/lancedb apache-arrow

写入数据

import * as lancedb from "@lancedb/lancedb";
import * as fs from "fs";

// 连接(本地目录即数据库)
const db = await lancedb.connect("./lance_data");

// 构造数据:每行包含日期、描述、图片二进制
const rows = [];
for (let i = 0; i < 50; i++) {
  const imageBuf = fs.readFileSync(`./images/photo_${i}.png`);
  rows.push({
    date: "25-12-2024",
    description: "Mountain sunrise over alpine meadow",
    image: imageBuf,  // Buffer 直接存,LanceDB 会识别为二进制列
  });
}

// 一行代码建表 + 写入
const table = await db.createTable("posts", rows);
console.log(await table.countRows()); // 50

重点:image 列直接传 Buffer,LanceDB 会自动推断 schema,把它存为二进制列。不需要你手动 base64 编码或指定数据类型。

读取数据

const db = await lancedb.connect("./lance_data");
const table = await db.openTable("posts");

// 查询所有数据
const allData = await table.query().toArray();

// 随机取 5 行
const sample = allData.sort(() => Math.random() - 0.5).slice(0, 5);

// image 列会以 Buffer/Uint8Array 返回
sample.forEach(row => {
  const base64 = Buffer.from(row.image).toString("base64");
  console.log(`${row.date} | ${row.description} | image size: ${row.image.length} bytes`);
});

效果展示

下面这个表格就是从 Lance 文件中读取的真实数据——我用上面的脚本创建了 50 行多模态数据(日期 + 描述 + 程序生成的彩色图片),然后随机抽取 5 行渲染出来:

在浏览器中用 SQL 查询

更酷的是——我们可以用 DuckDB WASM 直接在浏览器里用 SQL 查询从 Lance 导出的数据。零后端,纯前端执行。

下面这个 SQL 编辑器连接的是 DuckDB 的 WebAssembly 版本,数据来自上面创建的 50 行 Lance 表(导出为 JSON 后加载)。随便写个 SQL 试试:

试试点击 SearchGroup by year 按钮,或者自己写 SQL。所有这些查询都运行在你的浏览器里,没有任何后端请求

和其他方案对比

特性 LanceDB ChromaDB Pinecone pgvector
部署方式 嵌入式/Serverless 嵌入式/C-S 纯云服务 PostgreSQL 扩展
多模态原生支持 ✅ Blob 一等公民 ❌ 只存 metadata ❌ 只存 metadata ❌ 需要额外表
向量搜索 ANN + kNN ANN ANN 精确 + ANN
全文检索 ✅ 混合搜索 ✅ (tsvector)
TypeScript SDK ✅ 原生支持 ❌ (SQL)
存储格式 Lance (开源) 私有 托管 PostgreSQL
价格 免费/开源 免费/开源 按量付费 取决于 PG 托管

适合什么场景

说了这么多好话,也要说说 LanceDB 不是万能药的部分:

适合:

不太适合:

总的来说,LanceDB 解决的是一个很实际的问题:AI 应用的数据越来越”多模态”,但存储和检索工具还停留在”文本+向量”的时代。它用一个统一的格式把这些东西都管起来了,而且不需要额外的基础设施。对于正在做 AI 应用的开发者来说,值得花半小时试一下。跑通上面那个 demo 你就知道它有多爽了。