初探向量数据库pgvector

2024-01-12 07:53:00 浏览数 (3)

概述

pgvector是一款开源的PostgreSQL扩展,充当着向量数据的管家,处理从嵌入存储到向量相似性搜索的所有事务。作为大型语言模型如腾讯混元大模型的重要辅助,它利用矢量表示数据并通过测量这些矢量之间的相似度以找到相关结果。这将获取相关信息的速度和准确度提升至新的高级。可以说,pgvector非常适合在处理大规模数据的场景,在需要进行相关性检索和高维数据处理的任务中,都有着出色的表现。

使用pgvector的过程就像为数据创建一个个专属的向量家,步骤简易流畅。首先启用PostgreSQL的"vector"扩展,建立一个用于储存向量的数据表。然后,便可将每个样本的特征数据以向量形式储存在数据库中。一切都设置完成后,便可以使用pgvector在所有向量数据中进行相似性查询了。

而pgvector的魅力在于,它不仅专门处理向量数据,还给开发者带来了所有PostgreSQL作为一个经过35年长期开发和优化的对象关系数据库系统的优点。换句话说,pgvector不仅维持了PostgreSQL的可靠性、稳健性和性能,还以高效的矢量搜索和处理技术,拓展了PostgreSQL的可能性。这种强大的矢量处理能力和丰富的功能,使pgvector无疑成为向量数据处理的首选方案。

本文主要展示一个构建pgvector库表,使用python访问改库表的过程。

使用Docker搭建pgvector

进入https://hub.docker.com/r/ankane/pgvector,获得下载Docker Image镜像的命令。

代码语言:bash复制
docker pull ankane/pgvector

docker run --name pgvector -v $(pwd)/data:/var/lib/postgresql/data -e POSTGRES_PASSWORD=你的密码 -p 5432:5432 -d ankane/pgvector

使用psql构建库表

代码语言:txt复制
psql --help
psql是PostgreSQL 的交互式客户端工具。
使用方法:
  psql [选项]... [数据库名称 [用户名称]]
通用选项:
  -c, --command=命令       执行单一命令(SQL或内部指令)然后结束
  -d, --dbname=DBNAME      指定要连接的数据库 (默认:"huyiyang")
  -f, --file=文件名        从文件中执行命令然后退出
  -l, --list               列出所有可用的数据库,然后退出
  -v, --set=, --variable=NAME=VALUE
                           设置psql变量NAME为VALUE
                           (例如,-v ON_ERROR_STOP=1)
  -V, --version            输出版本信息, 然后退出
  -X, --no-psqlrc          不读取启动文档(~/.psqlrc)
  -1 ("one"), --single-transaction
                           作为一个单一事务来执行命令文件(如果是非交互型的)
  -?, --help[=options]     显示此帮助,然后退出
      --help=commands      列出反斜线命令,然后退出
      --help=variables     列出特殊变量,然后退出

输入和输出选项:
  -a, --echo-all           显示所有来自于脚本的输入
  -b, --echo-errors        回显失败的命令
  -e, --echo-queries       显示发送给服务器的命令
  -E, --echo-hidden        显示内部命令产生的查询
  -L, --log-file=文件名    将会话日志写入文件
  -n, --no-readline        禁用增强命令行编辑功能(readline)
  -o, --output=FILENAME    将查询结果写入文件(或 |管道)
  -q, --quiet              以沉默模式运行(不显示消息,只有查询结果)
  -s, --single-step        单步模式 (确认每个查询)
  -S, --single-line        单行模式 (一行就是一条 SQL 命令)

输出格式选项 :
  -A, --no-align           使用非对齐表格输出模式
      --csv                CSV(逗号分隔值)表输出模式
  -F, --field-separator=STRING
                           为字段设置分隔符,用于不整齐的输出(默认:"|")
  -H, --html               HTML 表格输出模式
  -P, --pset=变量[=参数]   设置将变量打印到参数的选项(查阅 pset 命令)
  -R, --record-separator=STRING
                           为不整齐的输出设置字录的分隔符(默认:换行符号)
  -t, --tuples-only        只打印记录i
  -T, --table-attr=文本    设定 HTML 表格标记属性(例如,宽度,边界)
  -x, --expanded           打开扩展表格输出
  -z, --field-separator-zero
                           为不整齐的输出设置字段分隔符为字节0
  -0, --record-separator-zero
                           为不整齐的输出设置记录分隔符为字节0

联接选项:
  -h, --host=主机名        数据库服务器主机或socket目录(默认:"本地接口")
  -p, --port=端口          数据库服务器的端口(默认:"5432")
  -U, --username=用户名    指定数据库用户名(默认:"postgres")
  -w, --no-password        永远不提示输入口令
  -W, --password           强制口令提示 (自动)

更多信息,请在psql中输入"?"(用于内部指令)或者 "help"(用于SQL命令),
或者参考PostgreSQL文档中的psql章节.

臭虫报告至<pgsql-bugs@lists.postgresql.org>.
PostgreSQL 主页: <https://www.postgresql.org/>

登陆到PostgreSQL

因此,使用如下命令登陆到PostgreSQL,

代码语言:bash复制
psql -h localhost -p 5432 -U postgres

输入密码,即可进入PostgreSQL。

查看所有数据库列表

要查看当前数据库中的所有数据库列表,可以使用以下 SQL 命令:

代码语言:psql复制
l

在 psql 命令行中执行这个命令会显示所有数据库的列表,包括数据库名、所有者、编码、描述等信息。

切换到另一个数据库

在 PostgreSQL 中,要切换到另一个数据库,可以使用以下命令:

代码语言:psql复制
c database_name

这会将你连接到名为 database_name 的数据库。如果连接成功,命令行提示符将显示新数据库的名称,表明你已成功切换到该数据库。

创建一个新的数据库

要在 PostgreSQL 中创建一个新的数据库,你可以使用以下命令:

代码语言:psql复制
CREATE DATABASE database_name;

在这个命令中,database_name 是你想要创建的数据库的名称。执行这个命令后,将会创建一个新的名为 database_name 的数据库。

显示所有表的列表

在 PostgreSQL 中,d 用于显示数据库对象的信息。可以通过以下两种方式之一运行它:

代码语言:psql复制
d
dt

上面的命令将显示当前数据库中所有表的列表。它显示表名、表类型(例如表、视图等)、拥有者以及其他信息。

另一方面,dt 是 d 命令的一个子集,专门用于列出数据库中的所有表。这与 d 的区别在于,d 还会列出其他类型的数据库对象,例如视图、索引、序列等。

如果你只对表感兴趣,那么使用 dt 更为直观并且更具针对性。

查看表结构

在 PostgreSQL 中,d table_name用于显示数据库表的结构。

代码语言:psql复制
d table_name

使用python sqlalchemy访问pgvector

SQLAlchemy

SQLAlchemy 是 Python 编程语言下的一套 ORM 框架,它为高效和高性能的数据库访问提供了全面的 SQL 接口。它的主要目标是帮助开发人员在对底层数据库进行操作的同时,提供强大并易于使用的 Python API。

示例代码

代码语言:python代码运行次数:0复制
from sqlalchemy import create_engine, Table, MetaData
from sqlalchemy.dialects.postgresql import array
from sqlalchemy.sql import select

engine = create_engine('postgresql://username:password@localhost/dbname')
metadata = MetaData()

vector_table = Table('vector_table', metadata, autoload_with=engine)

# Insert vectors
with engine.connect() as connection:
    data = {'id': 1, 'vector': array([0.1, 0.2, 0.3, 0.4])}
    connection.execute(vector_table.insert().values(data))

# Query vectors
with engine.connect() as connection:
    query = select([vector_table.c.vector]).where(vector_table.c.id == 1)
    result = connection.execute(query)
    for row in result:
        print(row)

在以上的例子中,我们创建了一个 SQLAlchemy engine 来与 PostgreSQL 数据库进行交互。然后,我们定义了一个表(vector_table),这个表在数据库中实际已经存在,包含了我们的向量数据。

接着,我们在数据库中插入一个新的矢量,然后查询在这个表中 id 等于 1 的矢量。

注意这只是一个基础的示例,在实际的情况下可能需要处理更复杂的查询和操作。

总结

总的来说,pgvector作为一款矢量搜索扩展,对于PostgreSQL的功能拓宽不可忽视。通过体现在向量相似性搜索和嵌入处理等方面,它所带来的实际效益当之无愧。无论你是开发者,还是机器学习工作者,如果你正在探索一种处理向量数据的有效方式,pgvector都是一个值得尝试的选项。

0 人点赞