湖仓里怎么存向量?Iceberg、Lance 和专用向量库怎么选?

第 1257 题 约 2 分钟读完

本文目录
  1. 面试怎么回答
  2. 两种需求要分开看
  3. 湖里存向量
  4. 专用向量库
  5. 推荐的分层
  6. 规模小的时候

面试怎么回答

要把向量作为数据资产的存储和在线向量检索服务分开看。湖里可以用 Iceberg 加 Parquet 存向量和片段、元数据、模型版本,复用权限血缘和批处理,但没有向量索引;也可以用 Lance 这类为 AI 设计的格式,支持向量索引、随机读取好、加列便宜,适合数据集级检索和训练样本管理,但要评估和现有引擎的集成。专用向量库擅长低延迟高并发的在线检索、实时写入、过滤和多租户,但不适合当唯一的真相来源。我推荐分层:湖作为可重建的真相来源,向量库作为服务层从湖同步构建索引,增量同步加定期校验,和数仓存数据、OLAP 提供服务的思路一样。规模小时用 pgvector 一个库就够了。

先把这段讲顺;面试官追问时,再展开下面的原理和细节。

详细讲解

公司的数据湖已经是 Iceberg,现在有大量的文档片段和向量。有人建议把向量也存进湖里,有人说向量必须放专用的向量数据库。面试官问这题,想看你能不能区分「向量的存储」和「向量的检索服务」,并做出合理的分层设计。

两种需求要分开看

  1. 向量作为数据资产:需要长期保存、版本管理、和原始数据关联、批量处理(比如重新计算、分析、训练)。这是存储问题;
  2. 在线向量检索:用户提问时,毫秒级找到最相似的向量。这是服务问题。

很多争论的根源是把这两件事混在一起了。

湖里存向量

用 Iceberg / Parquet 存

  • 向量作为数组或二进制列,和片段 ID、文本、元数据、模型版本存在一起;
  • 优点:复用现有的数据湖、权限、血缘、生命周期管理,便于批处理和分析;
  • 缺点:没有向量索引,不能直接做在线的相似度检索;随机读取不是强项。

用 Lance 这类为 AI 设计的格式存

  • 支持向量索引,可以直接在数据上做向量检索;随机读取性能好;加列成本低;
  • 适合:数据集级别的检索、离线分析、训练样本管理,以及对延迟要求不是特别苛刻的检索场景;
  • 需要评估:和现有引擎、Catalog、权限体系的集成程度。

专用向量库

  • 为在线检索优化:低延迟、高并发、实时写入、过滤和多租户;
  • 不适合作为向量数据的「唯一真相来源」:版本管理、批量重算、和原始数据的关联都不如湖。

推荐的分层

  1. 湖作为真相来源:文档、片段、向量、元数据、模型版本都保存在湖里(Iceberg 或 Lance),这是可重建的基础;
  2. 向量库作为服务层:从湖同步数据构建在线索引,服务在线检索。向量库出问题或者需要换产品时,可以从湖里重建;
  3. 同步:增量变化从湖(或上游的变更流)同步到向量库,定期全量校验一致性。

这和「数仓存数据、OLAP 引擎或缓存提供在线服务」的分层思路是一样的。

规模小的时候

如果数据量不大(几百万向量),没必要搞这么复杂:一个支持向量检索的数据库(比如 PostgreSQL + pgvector)同时承担存储和检索,原始文档另存即可。