使用 pgvector 进行向量搜索
使用 pgvector 扩展存储嵌入向量,并通过 ivfflat / HNSW 执行近似最近邻搜索
使用 pgvector 进行向量搜索 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。
向量有什么用途?
嵌入向量能够编码语义。关于同一主题的两篇文档具有相似的向量。向量搜索支持语义搜索、RAG(检索增强生成)和推荐功能。
启用 pgvector
该扩展已广泛可用(RDS、Cloud SQL 和 Supabase 都已内置):
CREATE EXTENSION vector;向量列
根据嵌入模型的维度定义列:
CREATE TABLE docs (
id BIGSERIAL PRIMARY KEY,
title TEXT NOT NULL,
body TEXT NOT NULL,
embedding vector(1536)
);
-- 1536 is OpenAI text-embedding-3-small dimension; varies by model.插入嵌入向量
将向量作为数组字面量插入:
INSERT INTO docs (title, body, embedding)
VALUES ('SQL Course', 'Learn SQL', '[0.013, -0.024, ...]');距离运算符
pgvector 提供三种运算符:
<->— 欧几里得(L2)距离<#>— 负内积<=>— 余弦距离(嵌入向量最常用)
最近邻搜索
查找距离查询向量最近的文档:
SELECT id, title, 1 - (embedding <=> $1) AS similarity
FROM docs
ORDER BY embedding <=> $1
LIMIT 10;IVFFlat 索引
对于大型数据集,请构建近似最近邻(ANN)索引:
CREATE INDEX docs_embedding_idx
ON docs USING IVFFLAT (embedding vector_cosine_ops)
WITH (lists = 100);
-- Tune lists by row count: rule of thumb sqrt(N).
-- Set probes per query for accuracy:
SET ivfflat.probes = 10;HNSW 索引(PG 16+)
在许多情况下,它的召回率和延迟都优于 IVFFlat:
CREATE INDEX docs_embedding_hnsw
ON docs USING HNSW (embedding vector_cosine_ops);
SET hnsw.ef_search = 100;筛选后的向量搜索
组合向量筛选和结构化筛选:
SELECT id, title
FROM docs
WHERE language = 'en'
AND created_at >= NOW() - INTERVAL '30 days'
ORDER BY embedding <=> $1
LIMIT 10;
-- For best perf, partial index on the filter.RAG 模式
通过嵌入向量检索 N 个相关文档,并将其作为上下文提供给 LLM:
-- 1. Embed user query
-- 2. SELECT top-N docs by cosine
-- 3. Send docs + query to LLM
-- 4. Return LLM's answer to user混合搜索
组合向量搜索和词法搜索(tsvector)以获得最佳结果——单独使用任何一种都无法覆盖所有内容:
SELECT id, title,
0.6 * (1 - (embedding <=> $1)) + 0.4 * ts_rank(search_doc, $2) AS score
FROM docs
WHERE embedding <=> $1 < 0.7
OR search_doc @@ $2
ORDER BY score DESC LIMIT 10;维度选择
嵌入向量越大,准确度越高,但存储开销也越大、速度越慢。许多应用使用 384–768 维模型就能良好运行。请选择一个模型并保持一致。
回顾
pgvector 为 Postgres 添加了一流的向量搜索能力。
- vector(N) 列类型
- IVFFlat / HNSW 索引
- 使用 <=> 计算嵌入向量的余弦距离
- 与 FTS 混合使用以获得最佳召回率
快速检查
您正在使用 OpenAI 嵌入向量按语义相似度进行搜索。通常应该使用哪个 pgvector 距离运算符?
常见问题解答
「使用 pgvector 进行向量搜索」课时是免费的吗?
是的 — 「使用 pgvector 进行向量搜索」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。
「使用 pgvector 进行向量搜索」这节课中我会学到什么?
使用 pgvector 扩展存储嵌入向量,并通过 ivfflat / HNSW 执行近似最近邻搜索 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 SQL Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「使用 pgvector 进行向量搜索」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 SQL Academy 课中编写并运行代码吗?
能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 三元组搜索(pg_trgm)与模糊匹配
- 使用 tsvector 和 GIN 进行全文搜索
- 使用 PostGIS 进行地理空间索引
- 使用 pgvector 进行向量搜索