AI应用开发:pgvector能帮你解决什么问题

在这篇博客文章中,我们将探讨pgvector如何帮助PostgreSQL中的基于AI的工作负载,使您的数据库向量操作更快、更高效。

pgvector:在PostgreSQL中存储和查询向量

pgvector 是一个PostgreSQL扩展,允许您存储、查询和索引向量。

截至PostgreSQL 16,PostgreSQL还没有原生的向量功能,pgvector旨在填补这一空白。您可以将向量数据与PostgreSQL中的其余数据一起存储,并同时利用PostgreSQL提供的所有出色功能进行向量相似性搜索。

什么时候需要向量相似性搜索?

在处理高维数据时,尤其是在推荐引擎、图像搜索和自然语言处理等应用中,向量相似性搜索是一个关键能力。许多AI应用涉及基于用户行为或内容相似性的查找相似项或推荐。pgvector可以高效地执行向量相似性搜索,使其适用于推荐系统、基于内容的过滤和基于相似性的AI任务。

pgvector扩展与PostgreSQL无缝集成——允许用户在现有的数据库基础设施内利用其能力。这简化了AI应用的部署和管理,因为没有单独的数据存储或复杂的数据传输过程的需要。

向量究竟是什么?

简而言之,向量是数字列表,如【1,2,4,7】。如果您曾经上过线性代数课程,现在是时候收获好处了,因为相似性搜索本质上就是在进行一系列向量操作!

在几何学中,向量代表了一个n维空间中的坐标,其中n是维度的数量。在下面的图像中,有一个二维向量(n=2)。在机器学习中,我们使用高维向量,它不像下面简单展示的向量那么容易想象。

让我们来看一个例子:

在这个例子中,我们将存储一些文档,生成向量嵌入并将它们存储在PostgreSQL中。我们将对嵌入数据建立索引,并在我们的嵌入上运行相似性查询。

环境准备

  • 已安装PostgreSQL(pgvector支持PostgreSQL 11+)
  • 安装了pgvector扩展(参见安装说明),或者直接使用免安装的服务MemFire Cloud
  • 拥有OpenAPI账户并有一些余额,国内有一些相关的服务。

一旦安装了pgvector,您可以通过创建扩展来在您的PostgreSQL数据库中启用它:

postgres=# Create extension vector;
CREATE EXTENSION 

步骤1:为文档创建表

让我们创建一个简单的表来存储文档。这个表中的每行代表一个文档,我们存储了文档的标题和内容。

创建文档表:

CREATE TABLE documents (
    id int PRIMARY KEY,
    title text NOT NULL,
    content TEXT NOT NULL
);

对于我们存储的每个文档,我们将生成一个嵌入,并且在这里我们创建了一个document_embeddings表来存储这些嵌入。您可以看到嵌入向量的大小为1536,这是因为我们使用的OpenAI模型具有1536维。

-- 创建document_embeddings表
CREATE TABLE document_embeddings (
    id int PRIMARY KEY,
    embedding vector(1536) NOT NULL
);

让我们使用HNSW索引对我们的数据建立索引。

CREATE INDEX document_embeddings_embedding_idx ON document_embeddings USING hnsw (embedding vector_l2_ops);

HNSW比IVFFlat具有更好的查询性能,对于IVFFlat索引,建议在表中有一些数据后创建索引,但HNSW索引没有像IVFFlat那样的训练步骤,所以可以在没有数据的表中创建索引。您可能注意到我是在插入数据之前创建索引的。

现在我们可以向表中插入一些示例数据。在这个例子中,我选择了PostgreSQL扩展及其简短描述。

-- 向文档表中插入文档
INSERT INTO documents VALUES ('1', 'pgvector', 'pgvector是一个PostgreSQL扩展,提供了SQL中向量相似性搜索和最近邻搜索的支持。');
INSERT INTO documents VALUES ('2', 'pg_similarity', 'pg_similarity是一个PostgreSQL扩展,为向量列提供了相似性和距离运算符。');
INSERT INTO documents VALUES ('3', 'pg_trgm', 'pg_trgm是一个PostgreSQL扩展,提供了基于三gram匹配确定字母数字文本相似性的功能和运算符。');
INSERT INTO documents VALUES ('4', 'pg_prewarm', 'pg_prewarm是一个PostgreSQL扩展,提供了将关系数据预热到PostgreSQL缓冲缓存中的函数。');

步骤2:生成嵌入

现在我们已经存储了文档,我们将使用嵌入模型将文档转换为嵌入。

但首先,让我们谈谈嵌入。我最喜欢OpenAI文档中的定义,因为它简单明了:

嵌入是一个浮点数向量(列表)。两个向量之间的距离衡量它们的相关性。小距离表示高相关性,大距离表示低相关性。”

因此,如果我们想比较两个文档在语义上的相关性,那么我们就需要将这些文档转换为嵌入,并对它们进行相似性搜索。

在这个例子中,我使用了OpenAI API和Python。有多种API提供商可供选择,您可以使用这些API从您选择的任何语言中使用。由于其简单性以及我对它的先前经验,我选择了OpenAI API,而Python是我的首选语言。示例中使用的嵌入模型是“text-embedding-ada-002”,它将为我们的用例很好地工作,因为它既便宜又简单易用。在实际应用中使用时,您可能需要根据您的具体用例评估不同的模型。

让我们开始。对于下面的Python代码,您需要获取您的OpenAI API密钥,并填写连接到您的PostgreSQL数据库的连接字符串。

# Python代码以预处理和嵌入文档
import openai
import psycopg2

# 加载OpenAI API密钥
openai.api_key = "sk-..." #您自己的API密钥

# 选择嵌入模型
model_id = "text-embedding-ada-002"

# 连接到PostgreSQL数据库
conn = psycopg2.connect(database="postgres", user="gulcin.jelinek", host="localhost", port="5432")

# 从数据库中获取文档
cur = conn.cursor()
cur.execute("SELECT id, content FROM documents")
documents = cur.fetchall()

# 处理并将嵌入存储在数据库中
for doc_id, doc_content in documents:
    embedding = openai.Embedding.create(input=doc_content, model=model_id)['data'][0]['embedding']
    cur.execute("INSERT INTO document_embeddings (id, embedding) VALUES (%s, %s);", (doc_id, embedding))
    conn.commit()

# 提交并关闭数据库连接
conn.commit()

这段代码简单地从数据库中获取文档内容,并使用OpenAI API生成嵌入,然后将它们存储回数据库。这对于我们的小数据库来说是可以的,但在现实世界的场景中,您可能希望对现有数据使用批处理,并可能使用某种事件触发器或更改流来随着数据库的变化保持向量更新。

步骤3:查询嵌入

现在我们已经在数据库中存储了嵌入,我们可以使用pgvector查询它们。下面的代码展示了如何执行相似性搜索以查找与给定查询文档相似的文档。

# Python代码以预处理和嵌入文档
import psycopg2

# 连接到PostgreSQL数据库
conn = psycopg2.connect(database="postgres", user="gulcin.jelinek", host="localhost", port="5432")

cur = conn.cursor()
# 基于它们的描述查找与pgvector相似的扩展
query = """
WITH pgv AS (
    SELECT embedding
      FROM document_embeddings JOIN documents USING (id)
     WHERE title = 'pgvector'
) 
SELECT title, content
  FROM document_embeddings 
JOIN documents USING (id)
WHERE embedding <-> (SELECT embedding FROM pgv) < 0.5;"""
cur.execute(query)

# Fetch results
results = cur.fetchall()

# Print results in a nice format
for doc_title, doc_content in results:
    print(f"Document title: {doc_title}")
    print(f"Document text: {doc_content}")
    print()

查询首先获取标题为“pgvector”的文档的嵌入向量,然后使用相似性搜索获取内容相似的文档。注意<->运算符,那就是所有pgvector魔法发生的地方。它是我们使用HNSW索引获取两个向量之间相似性的方式。0.5是一个相似性阈值,这将高度依赖于用例,并需要在实际应用中进行微调。

当我们在导入的数据上运行我们的查询脚本时,我们看到相似性搜索找到了两个与pgvector相似的文档,其中一个就是pgvector本身。

❯ python3 query.py 
Document title: pgvector 
Document text: pgvector是一个PostgreSQL扩展,提供了SQL中向量相似性搜索和最近邻搜索的支持。  

Document title: pg_similarity 
Document text: pg_similarity是一个PostgreSQL扩展,为向量列提供了相似性和距离运算符。

原文:https://zhuanlan.zhihu.com/p/690423202

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MTK6775/MT6775/曦力P70联发科处理器性能参数资料

联发科MT6775(曦力P70)芯片搭载强大的Arm Cortex-A73/A53八核CPU&#xff0c;并采用台积电12纳米FinFET制程工艺&#xff0c;相较于其他14纳米级别产品&#xff0c;功耗节省达到了15%。此外&#xff0c;曦力P70还配备了高效能的Arm Mali-G72 GPU&#xff0c;相比上一代产品曦力…

《QT实用小工具·三十六》metro风格的主界面

1、概述 源码放在文章末尾 该项目实现了metro风格的主界面&#xff0c;包含访客登记&#xff0c;记录查询&#xff0c;证件扫描&#xff0c;信息打印&#xff0c;系统设置&#xff0c;系统重启等功能&#xff0c;项目demo演示如下所示&#xff1a; 源码下载

JDK 11下载、安装、配置

下载 到Oracle管网下载JDK 11&#xff0c;下载前需要登录&#xff0c;否则直接点下载会出现502 bad gateway。 下载页面链接 https://www.oracle.com/hk/java/technologies/downloads/#java11-windows 登录 有些人可能没有Oracle账号&#xff0c;注册也比较慢&#xff0c;有需…

Springboot 初始化操作

文章目录 程序启动后的初始化ApplicationRunner 接口CommandLineRunner 接口ApplicationRunner 和CommandLineRunner 的区别 Bean的实例化InitializingBean 接口PostConstruct注解BeanInitializingBean 接口、PostConstruct注解、Bean注解区别 总结 前些天发现了一个巨牛的人工…

探索以太坊世界:使用Geth打造你的私人网络

文章目录 概要名词解释Geth&#xff08;Go Ethereum&#xff09;区块链网络种类 具体流程下载geth客户端配置私链新建创世区块启动私链 连接MetaMask钱包小结 概要 在区块链领域&#xff0c;以太坊私链的搭建是学习和开发智能合约的重要一步。私链允许开发者在独立的环境中进行…

IPD集成产品开发(二)

时间&#xff1a;2024年04月21日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;IPD集成产品开发&#xff08;二&#xff09;https://www.ximalaya.com/sound/724309598 大家好&#xff0c;欢迎来到小蒋聊技…

前端开发攻略---Vue项目(Vue2和Vue3)引入高德地图,超详细,超简单,保姆级教程。

1、图片演示 2、引入前的准备 1、前往 高德开放平台 进行账号注册。如果手机上有高德地图App并且已经登录过&#xff0c;则可以直接选择登录 2、注册/登录完成后来到应用管理-->我的应用 3、点击创建新应用 4、填写好应用名称和选择应用类型 5、填写好后点击添加Key 6、填写…

直播回顾 | 长安链可验证数据库技术架构和代码解读

3月29日长安链可验证数据库技术架构和代码解读中&#xff0c;北京大学博士后研究员高健博带开发者一起了解了长安链可验证数据库的应用背景、设计实现方式和功能代码结构。 数据存证以及通过智能合约进行数据共享是目前联盟链最直接、最广泛的应用场景。在很多存证场景中&…

计算请假时间,只包含工作时间,不包含中午午休和非工作时间及星期六星期天,结束时间不能小于开始时间

1.计算相差小时&#xff0c;没有休息时间 computed: {// 计算相差小时time() {let time 0;if (this.ruleForm.date1 &&this.ruleForm.date2 &&this.ruleForm.date3 &&this.ruleForm.date4) {// 开始时间let date1 this.ruleForm.date1;let y date…

Mysql学习一

目录 1.启动数据库&#xff1a; 2.命令行连接到MySQL&#xff08;winr输入cmd&#xff09; 3.MySQL的三重结构&#xff1a; 4.SQL语句分类&#xff1a; 1.启动数据库&#xff1a; winr——输入services.msc进入本地服务 2.命令行连接到MySQL&#xff08;winr输入cmd&#x…

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

【Axure教程0基础入门】05动态面板

05动态面板 1.动态面板是什么&#xff1f; 一个用来存放多个元件的容器&#xff08;container&#xff09; 其中包含多个状态&#xff08;state&#xff09;&#xff0c;但同时只能显示一个 状态之间&#xff0c;可以通过交互动作&#xff08;action&#xff09;控制切换和动…

[激光原理与应用-88]:图解激光在工业加工领域的应用大全以及激光加工的优势

目录 前言&#xff1a; 激光加工分类 一、材料清除 1.1 激光清洗&#xff1a;去除污垢 1.2 激光雕刻&#xff1a;去除多余 1.3 激光划线 1.4 激光切割 1.5 激光打标 1.6 激光打孔 1.7 激光雕刻 二、材料增强 2.1 激光淬火&#xff1a;增加强度 2.2 激光退火&#…

企业常用Linux正则表达式与三剑客/企业生产环境及知识/企业中远程连接ssh工具(为什么连接有时慢?)

企业高薪思维: 1.学习去抓重点有价值知识 2.猛劲学&#xff0c;使劲学&#xff08;能否给别人将会&#xff0c;讲明白&#xff0c;写明白&#xff0c;练习明白&#xff09;&#xff0c;在学习过程中你觉得学会了60-80%&#xff0c;其实你只会了40-50%&#xff0c;你要讲明白会操…

阿里天池-淘宝用户购物行为数据可视化分析

目录 背景&#xff1a;数据说明&#xff1a;任务描述数据分析1. 流量分析2.漏斗分析 背景&#xff1a; 本次可视化分析的目的是针对脱敏过的用户行为数据&#xff08;包括浏览、收藏、加购和购买4类数据&#xff09;进行分析&#xff0c;使用Python、Numpy、Pandas和Matplotli…

面试十七、list和deque

一、 Deque Deque容器是连续的空间&#xff0c;至少逻辑上看来如此&#xff0c;连续现行空间总是令我们联想到array和vector,array无法成长&#xff0c;vector虽可成长&#xff0c;却只能向尾端成长&#xff0c;而且其成长其实是一个假象&#xff0c;事实上(1) 申请更大空间 (…

【C++】 二叉排序树BST(二叉搜索树)

目录 二叉搜索树的概念 二叉搜索树操作 基本框架 插入 二叉搜索树的删除(重点) 二叉搜索树的查找 拷贝构造 析构函数 operator 遍历 递归构造搜索二叉树 插入 删除 查找 二叉树的应用 二叉搜索树的性能分析 代码示例 BSTree.h Test.cpp 二叉搜索树的概念 二…

LMDeploy 量化部署 LLM-VLM 实践——作业

LMDeploy 量化部署 LLM-VLM 实践——作业 一、 基础作业1.1、配置 LMDeploy 运行环境1.2、以命令行方式与 InternLM2-Chat-1.8B 模型对话 二、进阶作业2.1、设置 KV Cache 最大占用比例为0.4&#xff0c;开启 W4A16 量化&#xff0c;以命令行方式与模型对话2.1.1、初始显存占用…

52 文本预处理【动手学深度学习v2】

将文本作为字符串加载到内存中。 将字符串拆分为词元&#xff08;如单词和字符&#xff09;。 建立一个词表&#xff0c;将拆分的词元映射到数字索引;将文本转换为数字索引序列&#xff0c;方便模型操作。

linux_python源码安装及基础设置odoo安装

python源码安装及基础设置 1、资源下载2、源码安装3、 yum安装pip4、pip安装虚拟环境1、安装虚拟环境库2、配置环境变量3、创建自己的虚拟环境 5、安装升级pip的两种方式1、get-pip.py升级2、安装源码升级 6、odoo部署 1、资源下载 python3.13 python版本库 2、源码安装 yum…