PostgreSQL向量检索:pgvector入门指南

PostgreSQL向量检索:pgvector入门指南

    • [一. 什么是 pgvector?](#一. 什么是 pgvector?)
    • [二. 为什么选择 PostgreSQL + pgvector?](#二. 为什么选择 PostgreSQL + pgvector?)
    • [三. 安装与启用](#三. 安装与启用)
    • [四. 基本数据结构](#四. 基本数据结构)
    • [五. 基本操作](#五. 基本操作)
      • [5.1 插入向量](#5.1 插入向量)
      • [5.2 查询向量最近邻](#5.2 查询向量最近邻)
      • [5.3 常用距离运算符](#5.3 常用距离运算符)
      • [5.4 其他操作](#5.4 其他操作)
    • [六. Python 示例](#六. Python 示例)
    • [七. 小结](#七. 小结)

前言

这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。

作者:神的孩子都在歌唱

一. 什么是 pgvector?

pgvector 是 PostgreSQL 的开源扩展,用于在数据库中存储和处理向量数据,特别是高维嵌入向量(embedding)。

功能与特点

  1. 向量存储:可将向量数据直接存入表中。
  2. 距离计算:支持 L2(欧氏距离)、Inner Product(内积)、Cosine(余弦相似度)等。
  3. 最近邻搜索:支持精确搜索和近似搜索(IVFFlat / HNSW)。
  4. 兼容 SQL:可以直接与表中的其他列一起做查询、过滤和排序。
  5. 可扩展性:适合中小规模向量存储,也能应对大数据量场景。

二. 为什么选择 PostgreSQL + pgvector?

  1. 数据整合:向量与原始数据存放在同一数据库,无需单独部署向量数据库。
  2. 事务和安全:继承 PostgreSQL 的事务、权限控制、备份与复制机制。
  3. 易于扩展:可以直接使用 SQL 做 JOIN、过滤条件,实现混合检索。
  4. 降低维护成本:只需要维护一个数据库系统,减少运维复杂度。
  5. 可视化和监控:可以使用 PostgreSQL 现有工具进行监控和分析。

三. 安装与启用

  1. 确保 PostgreSQL 支持扩展(通常 PostgreSQL 13+)
  2. 安装 pgvector

启用扩展:

sql 复制代码
CREATE EXTENSION IF NOT EXISTS vector;

验证安装:

sql 复制代码
SELECT * FROM pg_extension WHERE extname='vector';

成功后即可在表中创建向量列。

四. 基本数据结构

  • 向量列类型:vectorvector(n),其中 n 是向量维度。
  • 示例表结构:
sql 复制代码
CREATE TABLE documents (
    id BIGSERIAL PRIMARY KEY,
    embedding VECTOR(3) -- 假设嵌入向量是 3 维
);

小贴士:向量列的维度必须固定,查询和索引时保持一致。

五. 基本操作

5.1 插入向量

sql 复制代码
INSERT INTO documents (embedding) VALUES ('[1,2,3]'), ('[4,5,6]'),('[4,0,5]');

5.2 查询向量最近邻

sql 复制代码
-- 使用 L2 距离
SELECT id,embedding <-> '[1,2,3]' as score,embedding FROM documents ORDER BY embedding <-> '[1,2,3]' LIMIT 5;

根据score的得分,就能查询出相近的向量,值越小代表越相似 ,算法如下
公式

d ( q , v ) = ∑ i = 1 n ( q i − v i ) 2 d(q, v) = \sqrt{\sum_{i=1}^{n} (q_i - v_i)^2} d(q,v)=i=1∑n(qi−vi)2

计算例子

假设查询向量 (q = [1,2,3]),表中某行向量 (v = [4,0,5]):
d ( q , v ) = ( 1 − 4 ) 2 + ( 2 − 0 ) 2 + ( 3 − 5 ) 2 = 9 + 4 + 4 = 17 ≈ 4.123 d(q, v) = \sqrt{(1-4)^2 + (2-0)^2 + (3-5)^2} = \sqrt{9 + 4 + 4} = \sqrt{17} \approx 4.123 d(q,v)=(1−4)2+(2−0)2+(3−5)2 =9+4+4 =17 ≈4.123

5.3 常用距离运算符

操作符 相似度度量 说明 推荐场景 值越小代表
<-> 欧氏距离 (L2 Distance) 计算两个向量之间的几何距离 图像、音频、地理数据检索 越相似
<#> 负内积 (- Inner Product) 取负号后的内积,用于最大内积搜索 推荐系统、模型打分 越相似
<=> 余弦距离 (Cosine Distance) 1 - 余弦相似度,对向量长度不敏感 文本语义检索、跨语言向量匹配 越相似

后面会出一篇关于这些运算符计算使用的文章

5.4 其他操作

sql 复制代码
# 向现有表中添加向量列
ALTER TABLE items ADD COLUMN embedding vector(3);
# 更新向量
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;
# 删除向量
UPDATE items SET embedding = '[1,2,3]' WHERE id = 1;

六. Python 示例

使用 pgvector-pythonpsycopg2 处理向量:

python 复制代码
import numpy as np
import psycopg2
from pgvector.psycopg2 import register_vector

# 连接数据库
conn = psycopg2.connect(host='192.168.1.101', dbname='test-agent', user='postgres', password='123456', port=5433)
register_vector(conn)  # 注册 vector 类型
cur = conn.cursor()

# 插入示例向量
embedding = np.random.rand(3).astype('float32')
print(embedding)
cur.execute(
    "INSERT INTO documents (embedding) VALUES (%s)",
    (embedding,)  # 注意这里的逗号,确保是元组格式
)
conn.commit()

# 查询最近邻
query_embedding = np.random.rand(3).astype('float32')
print(query_embedding)
cur.execute(
    "SELECT id, embedding,embedding <-> %s as score  FROM documents ORDER BY embedding <-> %s LIMIT 5",
    (query_embedding, query_embedding,)
)
rows = cur.fetchall()
for r in rows:
    print(r)

cur.close()
conn.close()

七. 小结

  • pgvector 是 PostgreSQL 的向量扩展,支持高维嵌入向量存储与检索。
  • 提供精确与近似最近邻查询,并可与 SQL 完美结合。
  • 基础操作包括创建表、插入向量、查询最近邻以及选择合适的距离运算符。

作者:神的孩子都在歌唱

本人博客:https://blog.csdn.net/weixin_46654114

转载说明:务必注明来源,附带本人博客连接。

相关推荐
last_zhiyin10 小时前
Oracle sql tuning guide 翻译 Part 6-4 --- Hint使用准则和Hint使用报告
数据库·sql·oracle·sql tunning
chenchihwen11 小时前
AI代码开发宝库系列:FAISS向量数据库
数据库·人工智能·python·faiss·1024程序员节
小光学长11 小时前
基于Vue的课程达成度分析系统t84pzgwk(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js
摇滚侠11 小时前
全面掌握PostgreSQL关系型数据库,备份和恢复,笔记46和笔记47
java·数据库·笔记·postgresql·1024程序员节
周杰伦fans12 小时前
Navicat - 连接 mysql 、 sqlserver 数据库 步骤与问题解决
数据库·mysql·sqlserver
码以致用13 小时前
StarRocks笔记
数据库·starrocks·olap·1024程序员节
auspicious航13 小时前
PostgreSQL数据库关于pg_rewind的认识
数据库·postgresql·oracle
武子康14 小时前
Java-159 MongoDB 副本集容器化 10 分钟速查卡|keyfile + –auth + 幂等 init 附 docker-compose
java·数据库·mongodb·docker·性能优化·nosql·1024程序员节
zz-zjx14 小时前
MySQL 索引深度指南:原理 · 实践 · 运维(适配 MySQL 8.4 LTS)
运维·数据库·mysql
摇滚侠14 小时前
全面掌握PostgreSQL关系型数据库,设置远程连接,笔记05,笔记06
java·数据库·笔记·postgresql