土法炼钢兴趣小组的算法知识备份

【数据库研究前沿】多模态数据库:文本、向量、图、张量的统一存储

文章导航

分类入口
database
标签入口
#multimodal-database#lancedb#chroma#weaviate#surrealdb#lance#parquet#arrow#tensor-storage

目录

过去十年数据库按数据类型划分出了多条支线:关系数据库管表、文档数据库管 JSON、时序数据库管度量、图数据库管关系、向量数据库管 embedding、对象存储管二进制 blob。一个 LLM 应用如果同时要存原文、embedding、知识图谱、模型 checkpoint、图片,通常要接四到五个系统。这种碎片化导致的问题是众所周知的:跨系统事务缺失、元数据漂移、查询需要应用层做 join、运维成本被放大。

多模态数据库(Multi-modal Database)是这一轮合并浪潮的产物。LanceDB、Chroma、Weaviate、SurrealDB 等系统都把”原生支持多种数据形态”作为核心卖点。但它们的架构起点很不相同:有的从列存文件格式做起(LanceDB),有的从向量库扩展到文档和图(Weaviate),有的从文档数据库吸收图和向量(SurrealDB)。这决定了它们各自的优势区间。

本文上半部分讨论为什么”多模态一体化”是真实需求而不是营销概念、几类主流多模态数据库的架构差异、以及列存格式(Lance、Parquet)对张量数据的支持现状。下半部分给出一份选型矩阵和实操建议,并把多模态存储和仓库已有的 ParquetApache Arrow数据湖表格式 文章串起来。

系列上一篇是 GraphRAG:图增强检索的理论与工程 ,讨论了图 + 向量的结合;本文把视角扩展到更广的数据形态。


一、为什么需要多模态一体化

1.1 AI 应用的数据实际形态

一个典型的检索增强生成(RAG)系统的数据构成:

数据类型 存储 查询形态
原文档 chunk(text) 对象存储 / PG SELECT * WHERE id IN ...
embedding(vector, f32) 向量库 ANN search
标量元数据(year、tag) 关系数据库 标量过滤
实体与关系(graph) 图数据库 路径、社区
图片 / 音频原文件(blob) S3 / MinIO URL 取回
模型特征(tensor) 文件系统 / Parquet 批量读取

传统做法是每一类接一个后端,用应用层 ID 做 join。这在数据规模小时可以,但随着数据量增长暴露出几个问题:

这些问题不一定要靠”一库多模”解决(也可以用 Data Lakehouse 架构用一个表格式承载,见 数据湖表格式),但多模态数据库给出了另一条路:在一个引擎里原生表达所有数据类型

1.2 多模态不是”一库通吃”

必须先说清边界。今天的多模态数据库有两种不同承诺:

业界尚无成功的”全模态通用数据库”,对 OLTP 高并发 + OLAP 高并发 + 图遍历 + 向量索引同时 top 的单机系统。多模态并不意味着放弃专用系统。

1.3 列存 + 张量作为技术地基

多模态数据库能同时处理这些类型,核心依托是现代列存格式。传统关系数据库的行存布局对变长、嵌套、高维数据天生不友好。Parquet、ORC 等列存格式能压缩相似值、跳过不相关列、做向量化执行;新一代的 Lance、Nimble(Meta 2024)进一步考虑了张量(tensor)和向量的原生表达。

把 embedding、图像特征、音频 MFCC 当作”张量列”存进列式文件,就不需要为每种模态单独做存储引擎——它们只是同一张表的不同列。这是 LanceDB 最核心的技术思路。


二、四个代表系统的架构对比

2.1 LanceDB:基于 Lance 列式格式的嵌入式多模态库

LanceDB 由 Eto AI 团队推出,技术核心是自研的 Lance 列存格式(Rust 实现,提供 Python、JS 绑定)。Lance 相对 Parquet 的几个差异:

LanceDB 的定位是嵌入式(embedded):无服务器进程,类似 SQLite 或 DuckDB 的使用方式。适合场景:

不适合:

典型用法:

import lancedb

db = lancedb.connect("./data.lance")
table = db.create_table("docs", data=[
    {"id": 1, "text": "hello", "vector": [0.1, 0.2, 0.3, 0.4]},
    {"id": 2, "text": "world", "vector": [0.5, 0.6, 0.7, 0.8]},
])
table.create_index(metric="cosine", num_partitions=64, num_sub_vectors=16)
res = table.search([0.1, 0.2, 0.3, 0.4]).where("id > 0").limit(5).to_list()

2.2 Chroma:开发者友好的嵌入式向量库

Chroma 定位比 LanceDB 更窄:它本质上是一个向量库 + 元数据过滤,把”最小 RAG 栈”做到开发体验极佳。底层存储用 DuckDB / SQLite + 自研向量索引(HNSW)。

Chroma 的取舍:

在”我只想把 embedding 快速存起来、支持简单过滤”场景下 Chroma 是合理起点。但数据规模过千万或需要图结构时,需要换后端。

2.3 Weaviate:Schema + 向量 + 图的混合

Weaviate(Go 实现,SemiTechnologies 出品)是较早把 Schema、向量检索、图关联都内置的系统。核心概念:

Weaviate 的查询语言是 GraphQL,语义上既能做 ANN 搜索也能做关系展开:

{
  Get {
    Document(
      nearVector: { vector: [0.1, 0.2, ...], distance: 0.3 }
      where: { path: ["year"], operator: Equal, valueInt: 2024 }
      limit: 10
    ) {
      title
      year
      _additional { distance }
      author { ... on Author { name affiliation } }
    }
  }
}

Weaviate 的优势在”中等规模 + 业务 schema 固定”的生产场景;限制在于:图能力仅限于 Reference 扩展,没有完整的图遍历算法;水平扩展在 v1.x 需要手工规划分片。

2.4 SurrealDB:文档 + 图 + 向量的全栈尝试

SurrealDB(Rust 实现)把多模态做得最激进:关系表、文档、图、向量、时序都以一等公民形式存在于单一查询语言 SurrealQL 中。

DEFINE TABLE doc SCHEMAFULL;
DEFINE FIELD text ON doc TYPE string;
DEFINE FIELD embedding ON doc TYPE array<float>;
DEFINE INDEX doc_vec ON doc FIELDS embedding MTREE DIMENSION 768;

-- 图关系
RELATE alice->likes->bob;

-- 混合查询
SELECT *, vector::distance::euclidean(embedding, $q) AS d
FROM doc
WHERE year = 2024 AND ->likes->person[?name = "Bob"]
ORDER BY d LIMIT 10;

SurrealDB 的野心很大,但也相应面临质疑:全栈意味着没有任何模态做到业界顶尖。ANN 索引能力对比 Milvus、图遍历对比 Neo4j、关系能力对比 PG 都有明显差距。目前更合适的定位是”中小型一体化应用”的简化方案。

2.5 其他值得了解的系统

2.6 架构对比速览

系统 核心模型 向量 张量 部署形态
LanceDB 列存文件 IVF-PQ / HNSW 原生 FixedSizeList / 多维 嵌入式
Chroma 向量库 + metadata HNSW 嵌入式 / 服务
Weaviate Schema + 向量 + Reference HNSW ⚠️ 一跳 Reference 服务(可集群)
SurrealDB 文档 + 图 + 向量 M-Tree / HNSW ✅ Graph edge 服务(单/集群)
Milvus 向量库 + 标量 HNSW/DiskANN/IVF 分布式
Neo4j 5.x 图 + 向量 HNSW 服务(单/集群)
DuckDB + VSS 列存 + 扩展 HNSW ⚠️ LIST 包装 嵌入式
TileDB 多维数组 ❌(第三方) ✅ 原生 嵌入式 / 服务

✅ 原生完整;⚠️ 部分支持;❌ 无。


2.5 Qdrant、Chroma 与更广的谱系

本节聚焦四个架构差异最明显的系统,但多模态数据库的谱系远不止于此:

“多模态数据库”这个概念本身正在被稀释——传统关系库、搜索引擎、KV 存储都在向多模态扩展。五年后可能不再需要一个独立的”多模态数据库”品类,因为每个成熟系统都会是某种意义上的多模态。

3.1 Parquet 的张量表达

Parquet 自身没有张量类型。常见做法是把张量展平成 LIST<FLOAT>FIXED_LEN_BYTE_ARRAY。这样做的问题:

实践中常用的 workaround:

这些都能工作,但不优雅。参考仓库的 Parquet 深入Apache Arrow 两篇文章里对 list/嵌套类型的详细讨论。

3.2 Lance:为 AI 设计的列存

Lance(lancedb 的底层格式)对张量做了原生支持:

Lance 格式规范见 github.com/lancedb/lance。Arrow 社区本身也在推进 FixedShapeTensor canonical extension,Lance 是早期采用者之一。

3.3 Nimble:Meta 的下一代列存

Nimble(Meta 2024 年在 VLDB 发表,原名 Alpha)是 Meta 内部替换 ORC 的新列存格式。关键设计点:

Nimble 是否会在开源社区成为主流尚待观察,但”列存格式需要为 AI 多模态做一次大升级”是业界共识。

3.4 Arrow 的角色

Apache Arrow 是跨系统内存格式。多模态数据库底层几乎无一例外用 Arrow 作为:

对 Arrow 本身的详细讨论见 Apache Arrow 内存格式 。一个常被忽视的事实:多模态数据库的真正互通不是查询语言层面,而是 Arrow 批次层面。你可以把 LanceDB 读出的 Arrow 批次直接交给 DuckDB 做 SQL 聚合、再传给 Polars 做特征工程,全程零拷贝。


四、选型矩阵

根据数据规模、模态组合、部署约束,给一个决策矩阵:

主要负载 数据规模 多模态需求 推荐
RAG / 语义搜索 < 1 千万 chunk 文本 + 向量 + 标量 Chroma / LanceDB / pgvector
RAG + 业务 schema 千万–亿级 文本 + 向量 + 复杂标量 Weaviate / Milvus
RAG + 图推理 千万 文本 + 向量 + 图 Neo4j 5.x / SurrealDB
特征平台 / 特征检索 亿级行、TB 级 张量 + 标量 + 向量 LanceDB / TileDB + DuckDB
嵌入式应用 < 1 亿向量 文本 + 向量 LanceDB / DuckDB + VSS / Chroma
企业级分布式 十亿以上 向量为主 Milvus
已有 PG / 不想引新系统 <= 5000 万 向量 + 标量 pgvector
多租户复杂业务 全栈(关系 + 图 + 向量) 分库(PG + Milvus + Neo4j)+ 应用层编排

关键判断点:

  1. 数据规模超过单机能力? 是 → 分布式专用系统(Milvus、Neo4j Enterprise、NebulaGraph);否 → 嵌入式方案优先。
  2. 是否需要 ACID 事务? 多数多模态库在向量索引层做不到严格 ACID。若必需强事务,选 PG + 扩展。
  3. 未来演进方向:要不要上 OLAP?要不要接 GPU?这些会影响格式选择——Lance 在 GPU 读取友好度上优于 Parquet。

4.1 多模态 + Lakehouse 的组合

一种经常被低估的架构是:用 Data Lakehouse(Iceberg / Delta / Hudi) + 多模态库做分层

热数据 & 在线查询 → LanceDB / Milvus / Weaviate
    ↑ 批量同步
冷数据 / 历史版本 → Iceberg / Delta (Parquet)

Lakehouse 负责长期存储、版本化、大规模批处理;多模态数据库负责在线向量检索、实时读写。两者通过 Arrow 批次交换。这种架构让成本和性能都不至于失控,是很多生产系统的真实形态。Lakehouse 本身见 数据湖表格式


五、特征平台与多模态数据库的关系

在 AI 工程语境下,Feature Store(特征平台)与多模态数据库的边界经常模糊。两者都处理”向量 + 标量 + 时间戳”,但设计目标完全不同。

5.1 Feature Store 的核心问题

机器学习工程里的特征平台(如 Feast、Tecton、Hopsworks)要解决的问题是:

多模态数据库原则上能存向量,但通常没有点时间正确性(point-in-time joins)、训练数据集生成、离线/线上一致性保证等 feature store 的关键能力。它们解决的是在线检索问题,不是特征工程问题。

5.2 组合使用

比较常见的生产形态:

Feature Store(Feast/Tecton/Hopsworks) → 训练/评估
           ↓ 特征向量化/embedding
Multi-modal DB(LanceDB/Milvus)      → 在线检索

Feature Store 负责特征的一致性与血缘;多模态库负责在线的 ANN 检索与多模态组合。两者通过离线批量同步或实时 CDC 衔接。

六、时序、事件日志与多模态库

很多 AI 应用都有”事件流”维度:用户行为日志、模型推理日志、系统 telemetry。这类数据的核心需求是高吞吐写入 + 时间范围扫描,正是 ClickHouse / InfluxDB / TimescaleDB 的主场。

多模态数据库在”事件流 + 向量”场景下有两种态度:

在”事件量每天数百亿”的场景下,通常选后者。ClickHouse 有成熟的 MergeTree 分区、压缩、sampling;在它基础上加 vector 扩展比反向把向量库改造成高吞吐事件存储更务实。

七、Arrow Flight 与跨系统互通

多模态数据库能”组合”的关键是跨系统的数据交换协议。Apache Arrow Flight(基于 gRPC)正在成为事实标准:

一个现代的数据管线可以是:

LanceDB 取向量 → Arrow batch → DuckDB 做 SQL 聚合
                       → Polars 做特征工程
                       → 直接喂给 PyTorch DataLoader

整条链路零拷贝、零序列化。这比”先导出 CSV / Parquet 再重新加载”快一到两个数量级。对多模态数据库选型的一个实用建议是:优先选 Arrow-native 的系统。这让未来更容易换单点组件、也更容易接入 Lakehouse 生态。

八、一个真实演进案例

以一个中等规模(团队 10 人、数据量月增百万 chunk)的 RAG 产品为例,架构演进通常是:

阶段 1:单体 pgvector(0–3 个月)。所有东西塞进 PG,embedding 作为 vector 列,业务表和向量同表。优点:快速启动、无额外依赖。问题出现在数据量过 500 万行后——HNSW 建索引 2 小时、磁盘增长快、UPDATE embedding 触发索引重建。

阶段 2:pgvector + 专用向量库(3–9 个月)。把 embedding 搬到 Milvus / LanceDB,PG 继续管业务 + 元数据。问题:两边要同步(双写或 CDC),数据一致性需要应用层处理;跨系统 JOIN 变成 N+1 查询。

阶段 3:加入图(9 个月 +)。业务侧希望多跳问答,引入 Neo4j 跑 GraphRAG。现在同一个 chunk 的元数据存在于三个系统。团队开始讨论”是否用 SurrealDB 或 Weaviate 合并两个”。

阶段 4:落到 Lakehouse(1 年 +)。历史 chunk + embedding + 图数据全部落到 Iceberg,热数据保留在 Milvus + Neo4j,后台按日同步。批量训练、大数据分析都走 Lakehouse 路径。

这个演进在不少团队重复过。关键教训:

多模态数据库”一库通吃”是否能终结这个演进循环,目前还没有确定答案。但可以肯定:碎片化比过早统一更容易应对。

九、几个容易踩的坑

9.1 把”多模态”当成银弹

不是所有 AI 应用都需要多模态数据库。如果你只存 embedding + 一两个标量,pgvector 或 Chroma 就够。引入 SurrealDB 这种全栈系统反而带来运维负担和性能天花板。先问”现有系统哪个接不动?“再选。

9.2 向量索引的代价被低估

多模态数据库卖点是”一库通吃”,但向量索引本身是资源大户。在同一节点上跑 HNSW + 图遍历 + 关系查询,容易互相抢内存和 CPU。生产部署时要有明确的资源隔离或分库策略。

9.3 张量列不等于原生张量语义

多数系统所谓”支持张量”只是能存 LIST<FLOAT>,但查询层没有 reshape、slice、broadcast 等张量操作。真正的张量数据库(TileDB)有专用 API;用通用多模态库做特征存储,还是要靠应用层处理张量逻辑。

9.4 数据一致性

跨模态写入(chunk + vector + graph 三份)在多数多模态库里还不是强事务。LanceDB 有版本化但不是 MVCC;Weaviate 默认异步索引构建;SurrealDB 的多表事务在向量索引路径上有限制。设计时要把”部分写入成功”作为必须考虑的错误场景。

9.5 数据迁移成本

一旦选定某个多模态库,迁移成本比想象高:向量索引需要重建(可能几小时到几天)、Schema 可能不能直接映射、图模型难以互译。选型时要评估未来 2–3 年的数据增长和可能的架构切换代价。


十、小结与展望

到 2024 年底,多模态数据库的格局还远未收敛。几条可观测的趋势:

没有银弹。选型的正确方式仍是:先澄清数据和查询模式,再匹配工具,而不是反过来。系列下一篇 HTAP:混合事务分析处理的现实 会从另一个角度讨论”不同负载在同一系统共存”的话题,和多模态问题在架构哲学上遥相呼应。


参考文献

  1. LanceDB, “Lance: modern columnar data format for ML”, https://github.com/lancedb/lance
  2. Weaviate Documentation, https://weaviate.io/developers/weaviate
  3. Chroma Documentation, https://docs.trychroma.com/
  4. SurrealDB Documentation, https://surrealdb.com/docs
  5. TileDB, “The Universal Storage Engine for Arrays”, https://tiledb.com/
  6. Meta Engineering. “Nimble: A Next-Generation Columnar File Format.” VLDB, 2024. https://github.com/facebookincubator/nimble
  7. Apache Arrow, “Canonical Extension Types: FixedShapeTensor”, https://arrow.apache.org/docs/format/CanonicalExtensions.html
  8. Apache Parquet Format, https://parquet.apache.org/docs/file-format/
  9. Apache Iceberg, https://iceberg.apache.org/
  10. Delta Lake, https://delta.io/
  11. Feng, X., et al. “KuzuDB: An Embeddable Graph Database Management System for Query Composability.” CIDR, 2023.
  12. DuckDB VSS Extension, https://duckdb.org/community_extensions/extensions/vss.html
  13. Neo4j Vector Search, https://neo4j.com/docs/cypher-manual/current/indexes/semantic-indexes/vector-indexes/
  14. Milvus Documentation, https://milvus.io/docs
  15. pgvector, https://github.com/pgvector/pgvector

上一篇GraphRAG:图增强检索的理论与工程 下一篇HTAP:混合事务分析处理的现实

同主题继续阅读

把当前热点继续串成多页阅读,而不是停在单篇消费。


By .