lakebase_vector

Important

此功能在 Beta 版中。 工作区管理员可以从 预览 页控制对此功能的访问。 请参阅 Manage Azure Databricks 预览版

lakebase_vector 扩展通过 lakebase_ann 索引类型向 Lakebase 添加近似近邻 (ANN) 向量搜索。 它是 pgvector 的下拉配套:相同的矢量类型、距离运算符和查询语法工作,无需修改。

Install

首先,在项目设置中 启用 Lakebase 搜索 。 然后安装扩展:

CREATE EXTENSION IF NOT EXISTS lakebase_vector CASCADE;

关键字 CASCADE 自动安装 pgvector 为依赖项。

快速入门

-- Create a table with a vector column
CREATE TABLE items (id BIGSERIAL PRIMARY KEY, embedding VECTOR(3));

-- Insert sample data
INSERT INTO items (embedding)
SELECT ARRAY[random(), random(), random()]::real[]
FROM generate_series(1, 1000);

-- Create a lakebase_ann index
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops);

-- Query using standard pgvector distance operators
SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 5;

从同步表填充

如果你是从 Unity 目录加载嵌入,而不是直接插入, 同步表 可以在同步时将 Lakehouse 嵌入列直接映射到 Postgres vector 列,而不是默认 JSONB 映射。 参见湖 底搜索的自定义类型映射

配置索引

在索引创建时设置 build_mode ,以控制准确性/速度权衡:

  • standard (默认):平衡召回和索引构建时间。 用于大多数工作负荷。
  • quality:提升回忆能力,但需要更长时间积累。
CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (build_mode = 'quality');

fast构建模式仍支持以实现向后兼容。

默认情况下, lakebase_ann 会根据表的统计数据和索引的配置选择列表。 设置为 lists 显式控制分区布局:

CREATE INDEX ON items USING lakebase_ann (embedding vector_l2_ops)
WITH (lists = '1000');

索引构建时间

更大的 shared_buffers 尺寸可以显著缩短索引的构建时间。 Lakebase 仅在 更大且固定规模的计算中实现了这种优化。 优化索引构建前先检查当前数值:

SHOW shared_buffers;

如果 shared_buffers 1 GB 或更小,建议在开始索引构建前暂时调整为更大的固定计算大小。

你还可以通过增加并行工作者的数量来加快索引的创建。

max_parallel_maintenance_workers配置参数决定了通过单个工具命令(如 CREATE INDEX)可启动的最大并行工作者数量。

max_parallel_workers配置参数设定计算支持的最大并行操作工作者数量。 超过该限制的数值 max_parallel_maintenance_workers 无影响。

max_worker_processes配置参数设定计算器可支持的最大后台进程数量。 Lakebase 根据计算量来管理这个设置。 超过该限制的数值 max_parallel_workers 无影响。

SHOW max_worker_processes;
-- Set both values to the desired parallelism minus one.
SET max_parallel_workers = 15;
SET max_parallel_maintenance_workers = 15;

并发生成索引

用于 CREATE INDEX CONCURRENTLY 生成而不锁定表,然后在 REINDEX CONCURRENTLY 不停机的情况下重新生成:

CREATE INDEX CONCURRENTLY items_embedding_ann ON items
  USING lakebase_ann (embedding vector_l2_ops);

REINDEX INDEX CONCURRENTLY items_embedding_ann;

优化搜索准确性

在优化之前,调用lakebase_ann_index_info(index_name)以获取索引和listsdefault_probesdefault_epsilon值。

在查询时使用 lakebase_ann.probes 以控制搜索多少IVF分区。 较高的值以查询速度为代价提高召回率。 默认值为 'auto'。 测试不同的数值以达到你的回忆目标。

probes 形状必须与的 lists形状相匹配。 调用 lakebase_ann_index_info 以找到你的 lists 数组,然后为一级索引设置一个值,或为两级索引设置两个逗号分隔值:

lists 从索引信息 probes 设置为
[] (空) ''
[222] '22'
[3333, 33333] '33, 333'

注释

在小数据集上,使用lakebase_ann精确(平面)搜索代替试管婴儿划分,返回lakebase_ann_index_info空和listsdefault_probes。 此时,将 设''probes 。 当 lists 不为空时, probes 形状不匹配 lists 的值会导致错误。

-- Check your index's lists array first
SELECT lakebase_ann_index_info('items_embedding_ann');

-- Then set probes to match the shape of lists.
-- One-level index (single-value lists): set one value.
SET lakebase_ann.probes TO '10';

-- Two-level index: set two ascending comma-separated values, for example '10, 20'.
-- Flat index (empty lists): leave probes set to ''.

SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 10;

lakebase_ann.epsilon 控制有多少候选人会被重新排序,使用全精度距离。 数值越高,重新排序的候选人越多,所需时间越长。 对于大多数工作负荷,默认值 'auto' 非常有效。 在小数据集上的平面搜索中,仍 epsilon 控制全精度重新排序。

预滤波器

默认情况下,Postgres 在 ANN 索引返回候选行后应用非向量过滤条件。 能够 lakebase_ann.prefilter 在全精度距离重新排序前评估这些条件:

SET lakebase_ann.prefilter TO on;

SELECT * FROM items
WHERE id % 100 = 0
ORDER BY embedding <-> '[3,1,2]'
LIMIT 10;

预过滤效果最好,因为过滤器评估成本低且能去除大部分行。 对于匹配多行或需要昂贵计算的过滤器,不要关闭,因为在索引内评估过滤器会增加开销。

运算符类

距离指标 运算符类 查询运算符
L2 (尤克利丹) vector_l2_ops <->
负内部积 vector_ip_ops <#>
余弦相似度 vector_cosine_ops <=>

选择与嵌入训练方式匹配的运算符类,并为索引和查询使用相同的指标:

  • vector_cosine_ops<=>) 是余弦相似性。 将其用于大多数文本嵌入。 这是最常见的选择。
  • vector_l2_ops<->) 是尤克利丹 (L2) 距离。 当绝对空间距离很重要且矢量未规范化时使用。
  • vector_ip_ops<#>) 是负内积。 当向量预规范化为单位长度时使用它。 对于单位向量,内部积等于余弦相似性,通常更快。

索引选项参考

选项 类型 违约 Description
build_mode 字符串 'standard' 控制准确度和速度的权衡。 'quality'为了更好的记忆,但牺牲了更长的索引构建。 'fast' 仍支持向后兼容。
lists 字符串 'auto' 设置试管婴儿的分区布局。 当 'auto'时,扩展根据表的统计量和索引的配置选择一个值。 设置一个整数,例如 '1000' 一级索引,或两个升序的逗号分隔整数,例如 '100, 1000' 两级索引。

GUC 参考

参数 类型 违约 Description
lakebase_ann.probes 字符串 'auto' 每个层级需要扫描的试管婴儿分区数量。 较高的值以查询速度为代价提高召回率。 形状必须与 中的lakebase_ann_index_info数组相匹配lists
lakebase_ann.epsilon 字符串 'auto' 控制有多少候选人会被重新排序,使用全精度距离。 数值越高,重新排序的候选人越多,所需时间越长。
lakebase_ann.prefilter 枚举 off 在全精度距离重新排序前,评估非向量滤波器。 有效值为 onoff。 它最适合用便宜的过滤器,去除大部分候选行。

实用函数

Function Returns Description
lakebase_ann_prewarm(regclass) 无效 将索引加载到内存中,以消除第一个查询的冷启动延迟。
lakebase_ann_index_info(regclass) 文本消息 以文本的形式返回索引元数据,包括listsdefault_probesdefault_epsilon

后续步骤