【PGCCC】pgvector 0.8.0 发布并可在 Nile 上使用

news2024/11/22 18:08:13

pgvector 社区发布了备受期待的 0.8.0 版本,该版本在性能和功能方面均有显著改进。我们当然迫不及待地想将它提供给 Nile 用户。

发布亮点

根据官方发布说明,pgvector 0.8.0 包括:

  • 增加了对迭代索引扫描的支持
  • 为 sparsevec 添加了数组强制类型转换
  • 改进成本估算,以便在过滤时更好地选择索引
  • 改进了 HNSW 索引扫描的性能
  • 改进了 HNSW 插入和磁盘索引构建的性能
  • 不再支持 Postgres 12

最令人期待的功能是迭代索引扫描,它解决了向量索引长期以来的挑战。以前,过滤器是在索引扫描完成后应用的,这通常会产生比预期更少的结果。根据 pgvector 文档:

对于近似索引,在扫描索引后应用过滤。如果条件匹配 10% 的行,则使用 HNSW 和默认的 hnsw.ef_search 40,平均只有 4
行匹配。

常见的解决方法包括扫描更多行、使用部分索引或分区,但这些方法可能不切实际或不受欢迎。新的迭代扫描功能提供了更直接、更直观的解决方案:

  1. 扫描向量索引
  2. 应用过滤器
  3. 检查是否返回了足够的结果。如果没有,请重复扫描。

让我们用一个很小的例子来看一下它的实际效果。我强烈建议进行一些小实验——即使实际结果不符合你的预期,你也能学到很多东西。请继续学习重要的 pgvector 课程:

首先,我创建一个包含示例数据的表:

CREATE TABLE filtest(id INTEGER, category INTEGER, embedding vector(3));
INSERT INTO filtest VALUES
    (1, 1, '[3, 1, -2]'),
    (2, 1, '[3, 1, -2]'),
    (3, 1, '[3, 1, -2]'),
    (1, 2, '[1.1, 2.2, 3.3]'),
    (2, 2, '[1.1, 2.2, 3.3]'),
    (3, 2, '[1.1, 2.2, 3.3]');
CREATE INDEX ON filtest USING hnsw (embedding vector_cosine_ops);

该表包含六行,分为两类。第 2 类中的向量非常相似[1, 2, 3],而第 1 类中的向量则有很大差异,表示正交(不相关)数据。在实际用例中,类别可以是不同的公司(租户)、同一公司内的不同部门、类型(如果表存储有关电影的信息)等。您可能想要用于过滤的任何内容。

您希望以下查询返回什么?

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1
ORDER BY distance LIMIT 3;

pgvector 0.7.4 中的索引扫描

我从类别 1 中搜索了最接近的 3 个向量[1,2,3],因此正确的答案是返回类别 1 中的所有向量。但是,这是我期望 pgvector 0.7.4 执行的操作:

  1. 扫描向量索引并找到最接近的3个向量[1,2,3],其中一些应该属于类别2。
  2. 过滤结果并仅保留类别 1 的向量。
  3. 返回部分结果。

然而,在实践中:

SELECT extversion FROM pg_extension WHERE extname = 'vector';
 extversion
------------
 0.7.4
(1 row)

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
 id | category |      distance
----+----------+--------------------
  3 |        1 | 1.0714285714285714
  1 |        1 | 1.0714285714285714
  2 |        1 | 1.0714285714285714

为什么我们看到正确的结果?因为 pgvector 默认配置的向量索引中要扫描的行数为 40。因此索引扫描返回了整个表,经过筛选后,我们得到了正确的结果。这就是小示例的问题所在……如果我尝试使用 100 个向量,它会像预期的那样错过一些结果。

让我们尝试调整配置:

SET hnsw.ef_search = 3;
SET

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
 id | category |      distance
----+----------+--------------------
  3 |        1 | 1.0714285714285714
  2 |        1 | 1.0714285714285714
(2 rows)

这是我所期望的部分结果!

pgvector 0.8.0 中的迭代索引扫描

现在让我们看看相同的查询在 pgvector 0.8.0 中的行为:

SELECT extversion FROM pg_extension WHERE extname = 'vector';
 extversion
------------
 0.8.0

SET hnsw.ef_search = 3;
SET

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
 id | category |      distance
----+----------+--------------------
  1 |        1 | 1.0714285714285714
  2 |        1 | 1.0714285714285714
  3 |        1 | 1.0714285714285714
(3 rows)

太棒了!pgvector 0.8.0 交付了!是的,但不是你想的那样:

SHOW hnsw.iterative_scan;
 hnsw.iterative_scan
---------------------
 off
(1 row)

哎呀!hnsw.iterative_scan已禁用。那么它怎么还能工作呢?使用explain显示未使用索引:

EXPLAIN SELECT id, category, embedding<=>'[1,2,3]' AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
                             QUERY PLAN
---------------------------------------------------------------------
 Limit  (cost=25.09..25.10 rows=3 width=16)
   ->  Sort  (cost=25.09..25.11 rows=6 width=16)
         Sort Key: ((embedding <=> '[1,2,3]'::vector))
         ->  Seq Scan on filtest  (cost=0.00..25.02 rows=6 width=16)
               Filter: (category = 1)
(5 rows)

这是由于 pgvector 0.8.0 中的不同改进造成的:

改进成本估算,以便在过滤时更好地选择索引

在扫描 6 行表时使用向量索引确实很愚蠢。因此,随着成本估算的改进,这种情况不再发生。这是个好消息,但我真的想检查迭代扫描。因此,让我们强制使用索引并重试:

SET enable_seqscan=false; -- force use of index, don't do this in production!
SET

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
 id | category |      distance
----+----------+--------------------
  2 |        1 | 1.0714285714285714
  3 |        1 | 1.0714285714285714
(2 rows)

SET hnsw.iterative_scan = relaxed_order; -- enable iterative scan
SET

SELECT id, category, embedding<=>'[1,2,3]'  AS distance
FROM filtest WHERE category=1 ORDER BY distance LIMIT 3;
 id | category |      distance
----+----------+--------------------
  2 |        1 | 1.0714285714285714
  3 |        1 | 1.0714285714285714
  1 |        1 | 1.0714285714285714
(3 rows)

我们可以看到 pgvector 0.8.0 和迭代扫描按预期工作。作为额外收获,我们还看到了成本优化的实际应用,并了解了hnsw.ef_search查询配置。最后一条提示:在生产使用中,您可能需要在用于过滤的列上建立索引,而不仅仅是向量索引。

如果您是 Nile 用户,您已经拥有 pgvector 0.8.0,因此我建议您充分利用它。请前往我们的文档, 详细了解 iterative_scan 选项和花哨的优化。
#PG证书#PG考试#postgresql培训#postgresql考试#postgresql认证
原文链接:https://www.thenile.dev/blog/pgvector-080
作者:Gwen Shapira

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制

基于Altium Designer 23学习版&#xff0c;四层板智能小车PCB 更多AD学习笔记&#xff1a;Altium Designer学习笔记 1-5 工程创建_元件库创建 目录 6、光耦及二极管元件库模型创建 7、元件库模型的调用 二、原理图绘制及编译检查 8、元件的放置 9、器件的复制及对齐 10、…

实验三:构建园区网(静态路由)

目录 一、实验简介 二、实验目的 三、实验需求 四、实验拓扑 五、实验任务及要求 1、任务 1&#xff1a;完成网络部署 2、任务 2&#xff1a;设计全网 IP 地址 3、任务 3&#xff1a;实现全网各主机之间的互访 六、实验步骤 1、在 eNSP 中部署网络 2、配置各主机 IP …

Figma插件指南:12款提升设计生产力的插件

在当今的设计领域&#xff0c;Figma已经成为许多UI设计师和团队的首选原型和数字设计软件。随着Figma的不断更新和插件库的扩展&#xff0c;这些工具极大地提升了设计工作的效率。本文将介绍12款实用的Figma插件&#xff0c;帮助你在UI设计中更加高效。 即时AI 即时AI利用先进…

解决IDEA报包不存在,但实际存在的问题

前言 最近在把一个亿老项目交割给同事&#xff0c;同事在导入项目运行时遇到IDEA报包不存在&#xff0c;但实际存在的问题&#xff0c;最终通过以下方式解决 现象 在IDEA里启动运行项目&#xff0c;报某个类有问题&#xff0c;引入的包不存在。 点击这个引入的包&#xff0c;可…

SemiDrive E3 硬件设计系列---唤醒电路设计

一、前言 E3 系列芯片是芯驰半导体高功能安全的车规级 MCU&#xff0c;对于 MCU 的硬件设计部分&#xff0c;本系列将会分模块进行讲解&#xff0c;旨在介绍 E3 系列芯片在硬件设计方面的注意事项与经验&#xff0c;本文主要讲解 E3 硬件设计中唤醒电路部分的设计。 二、RTC 模…

vue中路由缓存

vue中路由缓存 问题描述及截图解决思路关键代码及打印信息截图 问题描述及截图 在使用某一平台时发现当列表页码切换后点击某一卡片进入详情页后&#xff0c;再返回列表页时页面刷新了。这样用户每次看完详情回到列表页都得再重新输入自己的查询条件&#xff0c;或者切换分页到…

Qt桌面应用开发 第五天(常用控件 自定义控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

android studio无法下载,Could not GET xxx, Received status code 400

-- 1. 使用下面的地址代替 原地址: distributionUrlhttps\://services.gradle.org/distributions/gradle-6.5-all.zip 镜像地址: distributionUrlhttps\://downloads.gradle-dn.com/distributions/gradle-6.5-all.zips 上面的已经不好用了 https\://mirrors.cloud.tencent.c…

【SpringBoot】【log】 自定义logback日志配置

前言&#xff1a;默认情况下&#xff0c;SpringBoot内部使用logback作为系统日志实现的框架&#xff0c;将日志输出到控制台&#xff0c;不会写到日志文件。如果在application.properties或application.yml配置&#xff0c;这样只能配置简单的场景&#xff0c;保存路径、日志格…

【FPGA开发】AXI-Full总线接口介绍、FPGA搭建仿真平台

文章目录 协议解读接口介绍AW—写地址通道W—写数据通道B—写响应通道AR—读地址通道R—读数据通道 FPGA搭建仿真平台 本文主要介绍AXI-FULL的相关基础内容&#xff0c;AXI-Lite请移步&#xff1a; 【FPGA开发】AXI-Lite总线协议解读、Verilog逻辑开发与仿真、Alex Forencich代…

网络安全,文明上网(1)享科技,提素养

前言 在这个信息化飞速发展的时代&#xff0c;科技的快速进步极大地丰富了我们的生活&#xff0c;并为我们提供了无限的可能性。然而&#xff0c;随着网络世界的不断扩张&#xff0c;增强我们的网络素养成为了一个迫切需要解决的问题。 与科技同行&#xff0c;培育网络素养 技术…

springboot基于Spring Boot的古城景区管理系统的设计与实现docx

摘 要 古城景区管理系统是一个集景区导游功能于一体的综合管理平台&#xff0c;旨在提升游客的参观体验和提高管理效率。系统通过提供详尽的热门景点、客房类型、酒店信息、美食类型、特色美食、文创产品及导游服务&#xff0c;使游客能够深入了解古城的历史与文化。该系统集成…

安装JDK

1、JDK下载 Java Downloads | Oracle 中国 确保从Oracle的官网下载最新的稳定版JDK&#xff1a; 选择合适的操作系统与安装包&#xff0c;找到Java SE 23的下载链接Download&#xff0c;下载安装即可。Windows优先选x64 MSI Installer。 安装过程直接双击下一步即可&#xf…

掌握移动端性能测试利器:深入JMeter手机录制功能

引言 在当今移动互联网时代&#xff0c;应用程序的性能和用户体验至关重要。为了确保应用程序在不同设备和网络环境下都能稳定运行&#xff0c;性能测试成为了不可或缺的一环。Apache JMeter作为一款强大的开源性能测试工具&#xff0c;不仅支持传统的PC端性能测试&#xff0c…

初始ArkUI

一. 什么是ArkUI ArkUI基于方舟UI框架为应用的UI开发提供了完整的基础设施&#xff0c;UI语法更加简洁&#xff0c;丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实现界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 &a…

springboot基于数据挖掘的广州招聘可视化分析系统

摘 要 基于数据挖掘的广州招聘可视化分析系统是一个创新的在线平台&#xff0c;旨在通过深入分析大数据来优化和改善广州地区的招聘流程。系统利用Java语言、MySQL数据库&#xff0c;结合目前流行的 B/S架构&#xff0c;将广州招聘可视化分析管理的各个方面都集中到数据库中&a…

NuGet如何支持HTTP源

今天是2024年11月21号&#xff0c;最近更新了VisualStudio后发现HTTP的包源已经默认禁止使用了&#xff0c;生成时会直接报错。如下图&#xff1a; 官方也明确指出了要想使用HTTP包源的解决办法&#xff0c;这里就简单总结一下。 一、全局配置 1、全局NuGet包的配置文件路径在…

go 学习网站,go例子 go demo go学习视频

1. 代码例子&#xff1a; Go by Example 2. b站 视频&#xff1a; 尚硅谷视频&#xff1a; 004_尚硅谷_程序的基本概念_哔哩哔哩_bilibili 3. go技术文档&#xff1a; fmt Go语言中文文档

如何快速将Excel数据导入到SQL Server数据库

工作中&#xff0c;我们经常需要将Excel数据导入到数据库&#xff0c;但是对于数据库小白来说&#xff0c;这可能并非易事&#xff1b;对于数据库专家来说&#xff0c;这又可能非常繁琐。 这篇文章将介绍如何帮助您快速的将Excel数据导入到sql server数据库。 准备工作 这里&…

Spring Web入门练习

加法计算器 约定前后端交互接⼝ 约定 "前后端交互接⼝" 是进⾏ Web 开发中的关键环节. 接⼝⼜叫 API&#xff08;Application Programming Interface), 我们⼀般讲到接⼝或者 API&#xff0c;指的都是同⼀个东西. 是指应⽤程序对外提供的服务的描述, ⽤于交换信息…