如何用 PolarDB 在不确定世界寻找确定答案 (例如图像相似) - vector|pase

本文涉及的产品
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
云原生数据库 PolarDB PostgreSQL 版,标准版 2核4GB 50GB
简介: 背景世界是确定的吗? 不就好像我们拍照, 同一个相机, 同一个地点, 同一个时间连拍几张, 结果都不一样. 更不用说时间地点不一样了.真正确定的数据并不多, 世界充满的是不确定的数据.例如人脸识别, 存在数据库中的数据可能是曾经的照片, 但是你去比对人脸时是实时的, 角度、化妆、发型都可能不一样.未...

背景

世界是确定的吗? 不

就好像我们拍照, 同一个相机, 同一个地点, 同一个时间连拍几张, 结果都不一样. 更不用说时间地点不一样了.

真正确定的数据并不多, 世界充满的是不确定的数据.

例如人脸识别, 存在数据库中的数据可能是曾经的照片, 但是你去比对人脸时是实时的, 角度、化妆、发型都可能不一样.

未来的数据库一定要解决一个问题, 如何在不确定的世界寻找确定的答案?

PolarDB早几年就发布了pase插件, 解决高性能图像识别的问题, 通过将非结构化数据根据特征提取成为一串向量, 然后根据向量进行距离计算, 得到最相似的向量, 从而解决不确定数据的确定性搜索.

后来开源社区也发了一个插件vector, 知识支持的算法只有ivfflat.

本文将介绍如何在开源polardb中安装和使用vector插件, 解决向量数据相似搜索的问题.

PolarDB的安装请参考: 《如何用 PolarDB 证明巴菲特的投资理念》

vector on PolarDB

  1. 启动并进入polardb实例

IT-C02YW2EFLVDL:~ digoal$ docker ps -a  
CONTAINER ID   IMAGE                                    COMMAND                  CREATED        STATUS                        PORTS     NAMES  
67e1eed1b4b6   polardb/polardb_pg_local_instance:htap   "/bin/sh -c '~/tmp_b…"   2 months ago   Exited (137) 10 minutes ago             polardb_pg_htap  
  
IT-C02YW2EFLVDL:~ digoal$ docker start 67e1eed1b4b6  
67e1eed1b4b6  
  
IT-C02YW2EFLVDL:~ digoal$ docker exec -it 67e1eed1b4b6 bash  
[postgres@67e1eed1b4b6 ~]$ which git  
/usr/bin/git  
  1. 下载vector插件

[postgres@67e1eed1b4b6 ~]$ git clone --branch v0.3.2 --depth 1 https://github.com/pgvector/pgvector.git  
Cloning into 'pgvector'...  
remote: Enumerating objects: 80, done.  
remote: Counting objects: 100% (80/80), done.  
remote: Compressing objects: 100% (62/62), done.  
remote: Total 80 (delta 33), reused 29 (delta 15), pack-reused 0  
Unpacking objects: 100% (80/80), done.  
Note: checking out 'a7f712b5a4724cfe55e2793dd1a4b7d48257fa1e'.  
  
You are in 'detached HEAD' state. You can look around, make experimental  
changes and commit them, and you can discard any commits you make in this  
state without impacting any branches by performing another checkout.  
  
If you want to create a new branch to retain commits you create, you may  
do so (now or later) by using -b with the checkout command again. Example:  
  
  git checkout -b new_branch_name  
  1. 安装vector插件

[postgres@67e1eed1b4b6 ~]$ cd pgvector/  
[postgres@67e1eed1b4b6 pgvector]$ ll  
total 48  
-rw-rw-r-- 1 postgres postgres 1877 Dec  1 09:34 CHANGELOG.md  
-rw-rw-r-- 1 postgres postgres  482 Dec  1 09:34 Dockerfile  
-rw-rw-r-- 1 postgres postgres 1104 Dec  1 09:34 LICENSE  
-rw-rw-r-- 1 postgres postgres 1760 Dec  1 09:34 Makefile  
-rw-rw-r-- 1 postgres postgres 1105 Dec  1 09:34 META.json  
-rw-rw-r-- 1 postgres postgres 9495 Dec  1 09:34 README.md  
drwxrwxr-x 2 postgres postgres 4096 Dec  1 09:34 sql  
drwxrwxr-x 2 postgres postgres 4096 Dec  1 09:34 src  
drwxrwxr-x 6 postgres postgres 4096 Dec  1 09:34 test  
-rw-rw-r-- 1 postgres postgres  135 Dec  1 09:34 vector.control  
  
  
[postgres@67e1eed1b4b6 pgvector]$ which pg_config  
~/tmp_basedir_polardb_pg_1100_bld/bin/pg_config  
  
[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make  
[postgres@67e1eed1b4b6 pgvector]$ USE_PGXS=1 make install  
  1. 加载vector插件

[postgres@67e1eed1b4b6 pgvector]$ psql -h 127.0.0.1  
psql (11.9)  
Type "help" for help.  
  
postgres=# create extension vector ;  
CREATE EXTENSION  
  1. 测试向量数据搜索、以及索引加速搜索.

postgres=# CREATE TABLE items (embedding vector(3));  
CREATE TABLE  
postgres=# INSERT INTO items VALUES ('[1,2,3]'), ('[4,5,6]');  
INSERT 0 2  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops) WITH (lists = 100);  
CREATE INDEX  
  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                            QUERY PLAN                              
------------------------------------------------------------------  
 Limit  (cost=1.03..1.04 rows=1 width=40)  
   ->  Sort  (cost=1.03..1.04 rows=2 width=40)  
         Sort Key: ((embedding <-> '[3,1,2]'::vector))  
         ->  Seq Scan on items  (cost=0.00..1.02 rows=2 width=40)  
(4 rows)  
  
postgres=# set enable_seqscan=off;  
SET  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                                       QUERY PLAN                                         
----------------------------------------------------------------------------------------  
 Limit  (cost=4.08..6.09 rows=1 width=40)  
   ->  Index Scan using items_embedding_idx on items  (cost=4.08..8.11 rows=2 width=40)  
         Order By: (embedding <-> '[3,1,2]'::vector)  
(3 rows)  
  
postgres=# SET ivfflat.probes = 10;  
SET  
postgres=# SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
 embedding   
-----------  
 [1,2,3]  
(1 row)  
  
postgres=# explain SELECT * FROM items ORDER BY embedding <-> '[3,1,2]' LIMIT 1;  
                                        QUERY PLAN                                          
------------------------------------------------------------------------------------------  
 Limit  (cost=40.80..42.81 rows=1 width=40)  
   ->  Index Scan using items_embedding_idx on items  (cost=40.80..44.83 rows=2 width=40)  
         Order By: (embedding <-> '[3,1,2]'::vector)  
(3 rows)  

参考

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7月前
|
机器学习/深度学习 数据采集 自然语言处理
OneFlow深度学习框原理、用法、案例和注意事项
OneFlow深度学习框原理、用法、案例和注意事项
76 0
|
8月前
|
人工智能 测试技术 开发者
最强开源背景去除模型​RMBG v1.4
RMBG v1.4是briaai公司最先进的背景去除模型,它可以将一系列类别和图像类型中有效地将前景与背景切分
795 0
最强开源背景去除模型​RMBG v1.4
|
SQL 关系型数据库 分布式数据库
数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换
数据库内核那些事|细说PolarDB优化器查询变换:IN-List变换
156 0
|
7月前
|
机器学习/深度学习 人工智能 分布式计算
人工智能平台PAI产品使用合集之如何使用separator进行多值特征的分割
阿里云人工智能平台PAI是一个功能强大、易于使用的AI开发平台,旨在降低AI开发门槛,加速创新,助力企业和开发者高效构建、部署和管理人工智能应用。其中包含了一系列相互协同的产品与服务,共同构成一个完整的人工智能开发与应用生态系统。以下是对PAI产品使用合集的概述,涵盖数据处理、模型开发、训练加速、模型部署及管理等多个环节。
|
8月前
|
存储 搜索推荐 C++
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
【C++高阶(二)】熟悉STL中的map和set --了解KV模型和pair结构
|
8月前
|
存储 SQL 数据管理
阿里云数据库 SelectDB 内核 Apache Doris 如何基于自增列满足高效字典编码等典型场景需求|Deep Dive 系列
自增列的实现,使得 Apache Doris 可以在处理大规模时展示出更高的稳定性和可靠性。通过自增列,用户能够高效进行字典编码,显著提升了字符串精确去重以及查询的性能。使用自增列作为主键来存储明细数据,可以完美的解决明细数据更新的问题。同时,基于自增列,用户可以实现高效的分页机制,轻松应对深分页场景,有效过滤掉大量非必需数据,从而减轻数据库的负载压力,为用户带来了更加流畅和高效的数据处理体验。
|
存储 算法 NoSQL
​浅谈分布式唯一Id生成器之最佳实践
​浅谈分布式唯一Id生成器之最佳实践
336 1
|
存储 机器学习/深度学习 并行计算
关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph L)系列【一】
1.关于图计算&图学习的基础知识概览:前置知识点学习(Paddle Graph L)系列【一】
|
8月前
|
存储 并行计算 关系型数据库
PolarDB 开源版通过pg_rational插件支持Stern-Brocot trees , 实现高效自定义顺序和调整顺序需求
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB 开源版通过pg_rational插件支持Stern-Bro...
105 0
|
8月前
|
存储 关系型数据库 分布式数据库
使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的进行图像相似搜索
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍使用 PolarDB 开源版 和 imgsmlr 存储图像特征值以及快速的...
144 0