这四者的关系可以理解为 从底层驱动到高层抽象的技术栈协作,共同实现 PostgreSQL 数据库的常规操作和向量检索能力。以下是它们的层级关系和协作流程:
1. 四者角色定位
组件 | 层级 | 核心职责 |
---|---|---|
PostgreSQL | 数据库层 | 关系型数据库,提供数据存储和 SQL 执行能力,通过 pgvector 扩展支持向量操作。 |
pgvector | 数据库扩展层 | 为 PostgreSQL 添加向量存储和相似度搜索功能(如 <-> 运算符)。 |
psycopg2-binary | 驱动层 | Python 与 PostgreSQL 通信的底层接口,执行原始 SQL 和二进制数据传输。 |
SQLAlchemy | ORM 框架层 | 提供 Python 对象与数据库表的映射,简化 CRUD 和向量操作。 |
2. 协作关系图解
3. 具体协作场景
(1) 常规数据库操作(无 pgvector)
SQLAlchemy 生成标准 SQL(如
SELECT * FROM users
)。psycopg2-binary 将 SQL 发送给 PostgreSQL 并返回结果。
PostgreSQL 执行查询并返回关系型数据。
(2) 向量检索(使用 pgvector)
启用扩展:
# 通过 psycopg2 或 SQLAlchemy 执行 CREATE EXTENSION IF NOT EXISTS vector;
存储向量:
# SQLAlchemy 模型定义(需 pgvector 的 Vector 类型) class Document(Base): embedding = Column(Vector(1536)) # 存储 OpenAI 嵌入向量
相似度搜索:
# 使用 pgvector 的余弦距离运算符 results = session.query(Document).order_by(Document.embedding.cosine_distance(query_vec)).limit(5)
SQLAlchemy 生成包含
<->
运算符的 SQL。psycopg2-binary 将查询发送到 PostgreSQL。
PostgreSQL 通过 pgvector 执行向量计算。
4. 依赖关系总结
SQLAlchemy 依赖 psycopg2-binary 连接 PostgreSQL。
pgvector 是 PostgreSQL 的扩展,需先在数据库中启用。
psycopg2-binary 是唯一直接与 PostgreSQL 通信的组件。
SQLAlchemy 和 pgvector 通过 psycopg2-binary 间接协作。
5. 典型代码流程示例
# 安装依赖:pip install sqlalchemy psycopg2-binary pgvector from sqlalchemy import create_engine, Column, Integer from pgvector.sqlalchemy import Vector from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base import numpy as np # 1. 初始化连接(psycopg2 驱动) engine = create_engine("postgresql+psycopg2://user:password@localhost/db") # 2. 启用 pgvector 扩展 with engine.connect() as conn: conn.execute("CREATE EXTENSION IF NOT EXISTS vector;") # 3. 定义模型(SQLAlchemy + pgvector) Base = declarative_base() class Item(Base): __tablename__ = 'items' id = Column(Integer, primary_key=True) embedding = Column(Vector(3)) # 3维向量示例 Base.metadata.create_all(engine) # 4. 插入和查询向量 Session = sessionmaker(bind=engine) session = Session() # 插入数据 item = Item(embedding=np.array([1.0, 2.0, 3.0])) session.add(item) session.commit() # 相似度搜索 query_vec = np.array([1.1, 2.1, 3.1]) results = session.query(Item).order_by( Item.embedding.cosine_distance(query_vec) ).limit(5).all()
6. 常见问题
Q: 能否不用 SQLAlchemy,直接通过 psycopg2 操作 pgvector?
A: 可以!但需手动编写 SQL:
import psycopg2 conn = psycopg2.connect("dbname=vector_db") cursor = conn.cursor() cursor.execute("SELECT id FROM items ORDER BY embedding <-> %s LIMIT 5", (query_vec,))
Q: pgvector 和 Milvus 如何选择?
A:
pgvector:适合中小规模(百万级向量)、已使用 PostgreSQL 的场景。
Milvus:适合超大规模(十亿级)、需要分布式和高级向量功能的场景。