pgvector:PostgreSQL 中的嵌入
在 PostgreSQL 中启用 pgvector 扩展,创建包含向量列的表,插入嵌入,并使用 余弦距离运算符执行最近邻查询。
pgvector:PostgreSQL 中的嵌入 是 CoddyKit 上的免费 AI Engineering Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 AI Engineering Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 AI Engineering Academy 课程共包含 4 节课。
pgvector:PostgreSQL 中的向量搜索
pgvector 是一个开源 PostgreSQL 扩展,增加了 vector 数据类型和相似性搜索运算符。它允许您将嵌入与常规应用数据存储在同一个现有数据库中,从而无需单独的向量存储。
对于已经使用 PostgreSQL、希望添加语义搜索且不想引入新的基础设施依赖的团队而言,这是理想选择。
启用 pgvector 扩展
请从官方仓库安装 pgvector,或使用预装该扩展的托管 PostgreSQL 服务(Supabase、Neon、AWS RDS、Render)。然后只需执行一条 SQL 命令即可在数据库中启用它,无需重启。
-- Run this once per database to enable the extension
CREATE EXTENSION IF NOT EXISTS vector;
-- Verify it's installed
SELECT extname, extversion
FROM pg_extension
WHERE extname = 'vector';
-- Returns: vector | 0.7.0 (or similar)创建包含向量列的表
通过指定 vector(n) 添加向量列,其中 n 表示嵌入维度。您还可以将其与常规 PostgreSQL 列结合使用来存储元数据,这样就能使用标准 SQL WHERE 子句按 user_id、created_at 或其他字段进行筛选。
CREATE TABLE documents (
id BIGSERIAL PRIMARY KEY,
content TEXT NOT NULL,
category TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
embedding vector(1536) -- must match your model dimension
);
-- Index on category for fast metadata filtering
CREATE INDEX ON documents (category);
SELECT column_name, data_type
FROM information_schema.columns
WHERE table_name = 'documents';从 Python 插入嵌入向量
使用 psycopg2 或 asyncpg 驱动程序插入包含嵌入向量的行。将 Python 浮点数列表转换为 '[0.1, 0.2, ...]' 格式的字符串,pgvector 就能正确解析。pgvector Python 包提供了 register_vector 辅助工具,可自动完成这一转换。
import psycopg2
from pgvector.psycopg2 import register_vector
from openai import OpenAI
conn = psycopg2.connect('postgresql://user:pass@localhost/mydb')
register_vector(conn)
cur = conn.cursor()
client = OpenAI()
document = 'pgvector adds vector search to PostgreSQL.'
resp = client.embeddings.create(model='text-embedding-3-small', input=document)
embedding = resp.data[0].embedding
cur.execute(
'INSERT INTO documents (content, category, embedding) VALUES (%s, %s, %s)',
(document, 'database', embedding)
)
conn.commit()
print('Inserted document with embedding')使用 <=> 运算符计算余弦相似度
pgvector 提供了三种距离运算符:
<=>— 余弦距离(1 - cosine_similarity)<->— 欧几里得(L2)距离<#>— 负内积(用于点积相似度)
对于文本嵌入,请使用 <=>(余弦距离)。ORDER BY distance ASC 会先返回最相似的文档。
-- Find top 5 documents most similar to a query embedding
-- Replace '[0.1, 0.2, ...]' with the actual query vector
SELECT
id,
content,
category,
1 - (embedding <=> '[0.1, 0.2, 0.3]'::vector) AS cosine_similarity
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, 0.3]'::vector
LIMIT 5;将向量搜索与 SQL 筛选结合
pgvector 的一大优势是可以将 ANN 搜索与标准 SQL WHERE 子句结合使用。这样无需任何特殊语法即可原生筛选元数据,只需编写 SQL 即可。
-- Semantic search filtered to the 'database' category
-- and only recent documents
SELECT
id,
content,
1 - (embedding <=> %s::vector) AS similarity
FROM documents
WHERE
category = 'database'
AND created_at > NOW() - INTERVAL '30 days'
ORDER BY embedding <=> %s::vector
LIMIT 5;
-- In Python with psycopg2:
# cur.execute(sql, (query_embedding, query_embedding))创建 HNSW 索引以提升速度
没有索引时,pgvector 会精确扫描每一行;对于少于 10,000 行的数据这完全可行,但数据规模扩大后会变慢。请创建 HNSW 索引来执行近似最近邻搜索。m(每个节点的连接数)和 ef_construction(构建时的搜索范围)参数需要在索引大小、构建时间和召回准确率之间进行权衡。
-- Create an HNSW index for cosine distance queries
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- At query time, control recall vs speed:
SET hnsw.ef_search = 40; -- higher = better recall, slower
-- Verify the index is being used:
EXPLAIN SELECT * FROM documents
ORDER BY embedding <=> '[0.1]'::vector(1)
LIMIT 5;IVFFlat 索引:HNSW 的替代方案
IVFFlat 索引类型会将向量聚类到 lists 个桶中,并在查询时只搜索最近的 probes 个桶。它比 HNSW 构建更快、占用内存更少,但在相同速度下召回率略低。
经验法则是:如果需要在频繁重新建索引期间加快索引构建,请使用 IVFFlat;对于稳定且需要最高查询速度的数据集,请使用 HNSW。
-- IVFFlat index: good for large, infrequently updated corpora
-- lists ≈ sqrt(n) where n is the number of vectors
CREATE INDEX ON documents
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);
-- At query time, probes controls recall vs speed:
SET ivfflat.probes = 10; -- check 10 of 100 clusters完整的 Python 查询示例
下面是一个完整的 Python 函数:它接收用户查询,生成其嵌入向量,执行带元数据筛选的 pgvector 相似度搜索,并以字典列表的形式返回排名前 k 的结果。
import psycopg2
from pgvector.psycopg2 import register_vector
from openai import OpenAI
conn = psycopg2.connect('postgresql://user:pass@localhost/mydb')
register_vector(conn)
client = OpenAI()
def semantic_search(query, category=None, top_k=5):
resp = client.embeddings.create(model='text-embedding-3-small', input=query)
q_vec = resp.data[0].embedding
sql = '''
SELECT content,
1 - (embedding <=> %s::vector) AS similarity
FROM documents
{where}
ORDER BY embedding <=> %s::vector
LIMIT %s
'''
where = 'WHERE category = %s' if category else ''
params = [q_vec, q_vec, top_k] if not category else [q_vec, category, q_vec, top_k]
cur = conn.cursor()
cur.execute(sql.format(where=where), params)
return [{'text': r[0], 'score': r[1]} for r in cur.fetchall()]pgvector 与 Pinecone 的权衡
比较 pgvector 和 Pinecone:
- pgvector:自行托管、无需额外费用、与 SQL 完美集成,能够良好支持约 500 万个向量,但调优需要 DBA 知识
- Pinecone:完全托管、可扩展到极大规模(数十亿个向量)、提供专门的筛选功能,但价格更高,并且需要单独运维一项服务
如果您已经运行 PostgreSQL 且数据集少于几百万个文档,请选择 pgvector。如果需要极大规模,或认为免除运维负担值得付出相应成本,请选择 Pinecone。
将 pgvector 与 Supabase 搭配使用
Supabase 是一项预装 pgvector 的托管 PostgreSQL 服务。它提供 Python 客户端(supabase-py)和用于向量查询的 REST API,因此无需自行管理数据库服务器,就能轻松搭建生产级 pgvector 环境。
from supabase import create_client
import os
url = os.environ['SUPABASE_URL']
key = os.environ['SUPABASE_SERVICE_KEY']
supabase = create_client(url, key)
# Insert a document with embedding
supabase.table('documents').insert({
'content': 'Supabase hosts PostgreSQL with pgvector.',
'embedding': embedding # list of 1536 floats
}).execute()
# Vector similarity search via RPC (Supabase edge function)
# result = supabase.rpc('match_documents', {'query_embedding': q_vec, 'match_count': 5}).execute()快速检查
测试您对本课 AI 工程概念的理解。
课程回顾
本课您学习了以下内容:pgvector 为 PostgreSQL 添加了向量列类型以及余弦距离和欧几里得距离运算符;HNSW 索引能够在大规模数据上实现快速的近似最近邻搜索;标准 SQL WHERE 子句无需特殊语法即可筛选元数据。接下来,我们将比较各种主要的向量存储方案,帮助您为项目选择合适的方案。
用 AI 导师学习 Python — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 30
- 课程
- 120
常见问题解答
「pgvector:PostgreSQL 中的嵌入」课时是免费的吗?
是的 — 「pgvector:PostgreSQL 中的嵌入」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 AI Engineering Academy 课程的其余内容,请升级到 CoddyKit PRO。 AI Engineering Academy 课程共包含 4 节课。
「pgvector:PostgreSQL 中的嵌入」这节课中我会学到什么?
在 PostgreSQL 中启用 pgvector 扩展,创建包含向量列的表,插入嵌入,并使用 余弦距离运算符执行最近邻查询。 你通过在浏览器中直接运行的动手代码来练习 AI Engineering Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 AI Engineering Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 AI Engineering Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「pgvector:PostgreSQL 中的嵌入」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 AI Engineering Academy 课中编写并运行代码吗?
能。每节 AI Engineering Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 为什么需要向量数据库
- Pinecone 入门
- pgvector:PostgreSQL 中的嵌入
- 选择并基准测试向量存储