矢量数据库简单介绍:在 Postgres使用 pg_vector

news2024/11/16 19:40:46

矢量数据库简单介绍:在 Postgres使用 pg_vector

作为向人工智能大规模转变的一部分,矢量数据库越来越受欢迎。它们也称为矢量化数据库,在人工智能领域发挥着至关重要的作用,因此了解它们的工作原理非常重要。为此,我们首先需要了解什么是向量。

什么是向量?

向量是表示文本或图像等 非结构化数据 的数字数组。

例如,让我们将这些句子表示为向量:

s1 = “I love data”
s2 = “I love candy”

我们可以采用所有单词并创建具有四个维度(每个术语一个)的所谓“词袋”(BoW)模型:

BoW 的问题在于,它们依赖于词频,并且假设每个单词独立于其他单词出现,这是不切实际的假设。这是一个显着的简化,因为在自然语言中,上下文和含义通常在很大程度上取决于词序和词之间的关系。例如,“not good”和“good”在 BoW 模型中被视为相同的两个单词,即使由于“not”的存在而导致它们的含义相反。

为了解决这些限制,开发了更先进的技术。其中包括诸如词嵌入(或嵌入)之类的模型,它们通过考虑单词出现的上下文来捕获更多语义信息。

什么是嵌入(Embedding)?

由神经网络创建的具有大量维度的向量,这些向量是通过预测每个单词的相邻单词可能是什么来创建的。

下面是使用 200 个维度的 Word2Vec 模型生成的嵌入的可视化。您可以使用 Tensorflow Projector 进行模拟.

这个想法是将这些嵌入保存到数据库中以便快速检索。

什么是矢量索引与矢量数据库?

“索引”是一种提高数据库表数据检索操作速度的数据结构。

矢量索引是一种用于根据矢量内容有效地组织和检索矢量的机制。

矢量数据库是一种专门为高效处理和存储矢量数据而设计的数据库。它是一个数据库,包含旨在管理矢量数据的功能,包括存储、检索和查询处理。它可以利用向量索引作为其高效面向向量操作策略的一部分。

什么是 pg_vector?

Postgres 的开源矢量相似性搜索。如果您现在拥有或使用 Postgres,则可以安装 pg_vector 扩展以向 Postgres 添加矢量数据库功能。转到项目GitHub - pgvector/pgvector: Open-source vector similarity search for Postgres以获取安装说明。

pg_vector 入门

要在 Postgres 中启用它,只需执行以下命令:

CREATE EXTENSION IF NOT EXISTS vector;

接下来,创建一个表来保存嵌入向量。在此示例中,我们将把图像转换为嵌入向量并将它们存储在 Postgres 的图像表中。

DROP TABLE IF EXISTS images;
CREATE TABLE images (
    id bigserial PRIMARY KEY,
    path varchar(64),
    embedding vector(512)
)

请注意,有一个embedding列,它有 512 个维度。

现在,我们可以添加向量索引。

添加向量索引

pg_vector 有两个向量索引:HNSW 和 IVFFLAT。下面的示例使用 HNSW。

CREATE INDEX ON images USING hnsw (embedding vector_l2_ops);

向向量列添加索引时,必须提供距离算法。 pg_vector 带有三种不同的距离算法:

  • L2距离(欧氏距离)

  • Inner product 内积

  • Cosine distance 余弦距离

距离算法决定点周围的半径。半径内的任何记录都被视为在该距离内。

这将有助于有效地在图像表中找到相似的嵌入向量。

现在我们有一个表,其中包含用索引定义的embedding列,我们如何将图像转换为嵌入以将其插入到images表中?

Embeddings Model

为了将图像转换为嵌入,我们将使用 CLIP 模型(由 Hugging Face 提供)和 Python psycopg 连接 Postgres数据库。

import psycopg
from sentence_transformers import SentenceTransformer
from PIL import Image

image_path = './my_image.png'
model = SentenceTransformer('clip-ViT-B-32')
img_emb = model.encode(Image.open(image_path))

conn = psycopg.connect(dbname="postgres", autocommit=True)
cur.execute('INSERT INTO images (embedding, path) VALUES (%s,%s)', (img_emb.tolist(), image_path))

请注意,我们已在表中添加了一个path列。重要的是要知道embedding不包含图像本身,因此一旦找到相似的记录,我们需要一种方法来查找图像。这在本文后面将变得更加重要。

相似性搜索

下面的 Python 代码执行以下操作:

  • 让用户描述她想要查看的图像。

  • 将用户描述转换为embedding。

  • 对embedding描述的图像表执行 select 语句并返回结果。

  • 显示找到的图像以及与描述embedding的距离。

from matplotlib import pyplot as plt
from matplotlib import image as mpimg

query_string = input("What image to you want to see:")
text_emb = model.encode(query_string)

cur = conn.cursor()
cur.execute("""
    SELECT id, path, embedding <-> %s AS distance
    FROM images ORDER BY embedding::vector(512) <-> %s
    """,
    (str(text_emb.tolist()),str(text_emb.tolist())))

rows = cur.fetchall()
path = rows[0][1]
distance = rows[0][2]

plt.title(f'{path} {distance}')
image = mpimg.imread(path)
plt.imshow(image)
plt.show()

换句话说,假设此应用程序询问您想要查看什么图像,然后您输入:

“a white bike in front of a red brick wall”

矢量数据库返回如下图像:

总之:

  • 拍摄图像 → 使用 CLIP 模型从图像生成嵌入 → 将它们插入到 启用pg_vector的 Postgres 中。

  • 获取图像的描述(文本)→ 使用 SAME CLIP 模型从文本生成embedding。

  • 使用 SQL 生成 select 语句,并使用文本嵌入在图像表中搜索相似的embedding。

我们正在比较图像嵌入和文本嵌入!!!!!!

pg_vector 进行相似性搜索以查找与图像描述最相似的图像path。

原文地址

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

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

相关文章

某准网招聘接口逆向之WebPack扣取

​​​​​逆向网址 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20v 逆向链接 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vc2VhcmNoP3BhZ2VOdW09MSZxdWVyeT1weXRob24mdHlwZT01 逆向接口 aHR0cHM6Ly93d3cua2Fuemh1bi5jb20vYXBpX3RvL3NlYXJjaC9qb2IuanNvbg 逆向过程 请求方式&#xff1a;GET 参数构成…

FPGA高端项目:FPGA基于GS2971的SDI视频接收+纯verilog图像缩放+多路视频拼接,提供8套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收转HDMI输出应用本方案的SDI接收图像缩放应用本方案的SDI接收HLS图像缩放HLS多路视频拼接应用本方案的SDI接收OSD多路视频融合叠加应用本方案的SDI接收HLS多路视频融合叠加应用本方案的SDI接收GTX…

基于Redis自增实现全局ID生成器(详解)

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P48 - P49 目录 全局ID生成器介绍 基于Redis自增实现全局ID 实现代码 全局ID生成器介绍 背景介绍 当用户在抢购商品时&#xff0c;就会生成订单并保存到数据库的某一张表中&#…

Python 读取写入excel文件

使用Python读取和写入excel的xlsx、xls文件 目录 读取xlsx文件 安装三方库 引入三方库 读取数据 打开文件 表名 最大行数 最大列数 读取一张表 读取整个文件 返回xls整体内容 安装三方包 读取内容 写入xls文件 引入三方库 创建文件并写入数据 报错及解决 报错…

SSL 证书,了解一下常识

公司的网站、应用怎么才能保证在互联网上安全运行&#xff0c;不被攻击、盗取数据呢&#xff1f; 创业必经之路&#xff0c;一步一步走就对了&#xff0c;可能没赶上红利期&#xff0c;但不做就等于0。 概述 SSL 证书&#xff08;SSL Certificates&#xff09;又称数字证书&am…

3/7—21. 合并两个有序链表

代码实现&#xff1a; 方法1&#xff1a;递归 ---->难点 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* mergeTwoLists(struct ListNode *list1, struct ListNode *list2) {/*1.如果l1为…

Vivado使用记录(未完待续)

一、Zynq开发流程 二、软件安装 三、软件使用 字体大小修改&#xff1a;Setting、Font 四、Vivado基本开发流程 1、创建工程 Quick Start 组包含有 Create Project&#xff08;创建工程&#xff09;、 Open Project&#xff08;打开工程&#xff09;、 Open Example Project&…

智慧视频终端解决方案

依托富瀚微智慧视频SOC&#xff0c;提供以视频为核心的智能产品及解决方案

ubuntu設定QGC獲取pixhawk Mini4(PX4 Mini 4) 的imu信息

ubuntu20.04 QGC使用v4.3.0的版本 飛控pixhawk Mini4 飛控上只使用一條micor USB連接電腦&#xff0c;沒有其他線 安裝命令 sudo apt-get remove modemmanager -y sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y sudo apt install libf…

邮件营销新手必读指南?怎样做好邮件营销?

邮件营销的全流程及步骤&#xff1f;做好邮件营销有哪些注意点&#xff1f; 邮件营销作为一种传统却依然高效的推广手段&#xff0c;被众多企业所青睐。对于新手来说&#xff0c;如何开展邮件营销&#xff0c;却是一个值得探讨的话题。AokSend将为你提供一份邮件营销新手必读指…

Java面试题总结10之MySQL索引和锁

索引的基本原理 把无需的数据变成有序的查询 1&#xff0c;把创建了索引的列的内容进行排序 2&#xff0c;对排序结果生成倒排表 3&#xff0c;到倒排表内容上拼上数据地址链 4&#xff0c;在查询的时候&#xff0c;先拿到倒排表内容&#xff0c;再取出数据地址链&#xf…

【HarmonyOS】ArkTS-函数

目录 函数-Function函数基本使用函数的参数箭头函数 函数-Function 函数&#xff1a;是可以被重复使用的代码块 作用&#xff1a;函数可以把具有相同或相似逻辑的代码“包裹”起来&#xff0c;有利于代码复用。 函数基本使用 定义函数 function 函数名() { 函数体 }调用函数 …

白酒:蒸馏技术的优化与新型蒸馏设备的研发

蒸馏技术是豪迈白酒生产中的重要环节&#xff0c;直接关系到产品的质量和风格。云仓酒庄在蒸馏技术的优化和新型蒸馏设备的研发方面进行了大量探索和实践&#xff0c;旨在提升白酒的品质和口感。 首先&#xff0c;蒸馏技术的优化对于豪迈白酒的品质至关重要。传统的蒸馏技术通常…

0环PEB断链

在操作系统层面上&#xff0c;进程本质上就是一个结构体&#xff0c;当操作系统想要创建一个进程时&#xff0c;就分配一块内存&#xff0c;填入一个结构体&#xff0c;并为结构体中的每一项填充一些具体值。而这个结构体&#xff0c;就是EPROCESS 在0x088 偏移处有一个指针Act…

关于JVM的小总结(待补充)

JVM组成及他们之间的关系 装载类子系统字节码执行引擎运行时数据区 装载类子系统 类加载器字节码调节器类加载运行时数据区 字节码执行引擎 运行时数据区 线程私有 虚拟机栈本地方法栈程序计数器 线程共享 堆方法区&#xff08;元空间&#xff09;

基于Vue的分类招生App设计与实现

目 录 摘 要 I Abstract II 引 言 1 1 绪论 3 1.1 项目的研究背景与意义 3 1&#xff0e;1 研究背景 31&#xff0e;2 研究意义 3 1.2 研究现状 4 1.3 技术简介 43&#xff0e;1 前端开发技术 43&#xff0e;2 服务端开发技术 53&#xff0e;3 数据库 6 1.4 本章小结 6 2 项目…

MercadoLibre(美客多)运营策略:补单操作的重要性与条件要求

在美客多平台上&#xff0c;许多商家普遍认为&#xff0c;店铺的重要性远超产品本身&#xff0c;同时竞争环境也显得相对宽松。因此&#xff0c;他们倾向于认为在美客多进行补单操作并非必要之举。然而&#xff0c;深入剖析美客多平台的运营规则后&#xff0c;我们不难发现补单…

基于springboot的大学生智能消费记账系统的设计与实现(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

nestjs10.x使用jwt生成token

1 安装依赖&#xff1a; pnpm install --save nestjs/jwtpnpm install passport passport-jwt nestjs/jwtpnpm install types/passport-jwt --save-dev 2 可以使用命令新建auth鉴权文件夹 nest g mo auth // auth.module.ts nest g s auth // auth.service.ts nest g co …

记录 | mac报错:not prividing “FindClang.cmake“

报错&#xff1a; CMake Error at CMakeLists.txt:72 (find_package): By not providing "FindClang.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "Clang", but CMake did not find one.…