当前位置: 首页 > news >正文

PgVectore的使用

PgVectore的使用

一、PgVector的安装

参照博客:https://blog.csdn.net/u012953777/article/details/147013691?spm=1001.2014.3001.5501

二、PgVector的使用

1、创建表与插入数据​

  • ​​定义向量字段​​:
CREATE TABLE items (
  id SERIAL PRIMARY KEY,
  embedding VECTOR(768),  -- 768维向量(如BERT模型输出)
  metadata JSONB
);
  • ​​插入向量数据​​
INSERT INTO items (embedding, metadata) VALUES 
  ('[0.1, 0.3, ..., 0.8]', '{"title": "文档1"}'),
  ('[0.4, 0.2, ..., 0.7]', '{"title": "文档2"}');

2、 索引优化​

pgvector 支持两种索引类型,针对不同场景优化:

HNSW 索引​

  • 适用场景​​:高查询速度,适合静态数据(较少更新)。
  • ​​创建索引​​:
CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops)
  WITH (m = 16, ef_construction = 64);
  • m:每层的最大邻居数(默认16,范围4-100)
  • ef_construction:构建时的搜索范围(默认100,影响构建速度和精度)

IVFFlat 索引​​

​​适用场景​​:快速构建,适合动态数据(频繁更新)。
​创建索引​​:

CREATE INDEX ON items USING ivfflat (embedding vector_l2_ops)
  WITH (lists = 100);

运算符类选择​​

vector_l2_ops:欧氏距离(L2)
vector_ip_ops:内积相似度
vector_cosine_ops:余弦相似度

3、相似性搜索​

  • ​​基础查询​​:
SELECT * FROM items
ORDER BY embedding <-> '[0.5, 0.1, ..., 0.9]'  -- 按L2距离排序
LIMIT 10;
  • 动态调整搜索参数​​(HNSW):
SET hnsw.ef_search = 200;  -- 扩大搜索范围以提高召回率
  • 余弦相似度查询​​:
SELECT id, 1 - (embedding <=> '[0.3, ..., 0.2]') AS cosine_similarity
FROM items
ORDER BY cosine_similarity DESC
LIMIT 5;

4、性能优化技巧​​

  • ​​索引构建时机​​:在数据导入后创建索引,避免频繁更新导致重建。

  • ​参数调优​​:

    • ​​HNSW​​:增大 ef_construction 和 ef_search 提高精度,但会降低速度
    • ​IVFFlat​​:增加 lists 提升准确性,但增加内存占用
  • ​归一化处理​​:使用余弦相似度前,确保向量已归一化(模长为1)

5、高级用法​

混合搜索(向量 + 条件过滤)​

SELECT * FROM items
WHERE metadata->>'category' = '科技'
ORDER BY embedding <=> '[0.2, ..., 0.6]'
LIMIT 10;

分页查询​

SELECT * FROM items
ORDER BY embedding <-> '[0.7, ..., 0.1]'
OFFSET 20 LIMIT 10;

6、维护操作​

  • 重建索引​​:
REINDEX INDEX items_hnsw_index;
  • ​​更新索引参数​​:
ALTER INDEX items_hnsw_index SET (ef_construction = 128);

7、注意事项​​

​* ​维度限制​​:pgvector 支持最高 ​​16,000 维​​。
​* ​内存管理​​:大规模数据需确保足够内存,尤其是IVFFlat索引。
​* ​数据一致性​​:频繁更新时,IVFFlat可能需要定期重建索引。

http://www.dtcms.com/a/113601.html

相关文章:

  • REASONING THOUGHT和REASONING分别是什么意思,有什么区别
  • C语言:字符串
  • Baklib企业CMS的核心要素是什么?
  • 贪心算法之最小生成树问题
  • Sentinel实战(五)、系统保护规则、限流后统一处理及sentinel持久化配置
  • 多GPU训练
  • C++_类和对象(上)
  • 【简单数论】(模运算,快速幂,乘法逆元,同余,exgcd,gcd,欧拉函数,质数,欧拉筛,埃式筛,调和级数枚举,约数,组合数)
  • 4.4日欧篮联,NBA全扫盘,雷霆 vs 火箭单关预测已出
  • 来聊聊C++中的vector
  • C++学习之线程
  • [Android安卓移动计算]:新建项目和配置环境步骤
  • 力扣DAY35 | 热100 | LRU缓存
  • 在windows环境下通过docker-compose脚本自动创建mysql和redis
  • SQL Server常见问题的分类解析(二)
  • 分治-归并排序-逆序对问题
  • 计算机视觉图像处理基础系列:滤波、边缘检测与形态学操作
  • 小迪安全110-tp框架,版本缺陷,不安全写法,路由访问,利用链
  • Android使用OpenGL和MediaCodec渲染视频
  • AI浪潮下,“内容创作平台”能否借势实现内容价值跃升?
  • Turtle图形化编程知识点汇总:让编程更有趣
  • IDEA 2024.3.5 中修改 web.xml 的 Servlet 版本(比如从 4.0 修改为 5.0)
  • I.MX6ULL开发板与linux互传文件的方法--NFS,SCP,mount
  • AbstractBeanFactory
  • 基于SSM的车辆管理系统的设计与实现(代码+数据库+LW)
  • kd树和球树
  • Java中使用OpenCV实现怀旧滤镜时遇到的UnsatisfiedLinkError问题及解决方案
  • 一文读懂 MCP!
  • chromadb
  • Swift 扩展