Vector Database
Vector Database 是专门存储和检索高维向量的数据库。它是 RAG 系统的存储层,支持语义搜索、相似度计算和混合查询。
#type / concept
#status / evergreen
#tech / ai
#tech / database
[!info] related notes
- 所属 MOC: RAG Engineering MOC
- 相关: Embedding Model, Retriever
- 实践: RAG 知识库与 pgvector
Vector Database
一句话定义
Vector Database 是专门存储和检索高维向量的数据库。它让”找到语义最相似的文档”变得高效——不需要遍历所有文档,而是通过 ANN (近似最近邻) 算法快速找到最相似的 K 个向量。
它解决什么问题
把文档 Embedding 存在普通数据库里,检索时需要遍历所有向量计算距离,O(n) 复杂度。当文档量达到百万级时,这不可接受。Vector Database 通过 ANN 索引(HNSW、IVF)把复杂度降到 O(log n)。
核心原理
选型对比
| 数据库 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| pgvector | PostgreSQL 扩展 | 零额外组件,支持 SQL | MVP、中小规模 |
| Qdrant | 专用向量库 | 高性能,丰富过滤 | 生产环境 |
| Milvus | 专用向量库 | 分布式,亿级规模 | 大规模 |
| Pinecone | 托管服务 | 零运维 | 快速上手 |
| Weaviate | 专用向量库 | 多模态 | 复杂场景 |
pgvector 示例
-- 创建向量列
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
metadata JSONB,
embedding vector(1536) -- OpenAI embedding 维度
);
-- 创建 HNSW 索引
CREATE INDEX ON documents USING hnsw (embedding vector_cosine_ops);
-- 语义搜索
SELECT id, content, metadata,
embedding <=> '[0.1, 0.2, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 5;
Python 使用
class VectorStore:
def __init__(self, db):
self.db = db
async def upsert(self, chunks: list[Chunk], embeddings: list[list[float]]):
for chunk, embedding in zip(chunks, embeddings):
await self.db.execute(
"INSERT INTO documents (content, metadata, embedding) VALUES (?, ?, ?)",
chunk.text, chunk.metadata, embedding
)
async def search(self, query_embedding: list[float], top_k: int = 10) -> list[Chunk]:
results = await self.db.query(
"SELECT *, embedding <=> ? AS distance FROM documents ORDER BY distance LIMIT ?",
query_embedding, top_k
)
return [Chunk(text=r.content, metadata=r.metadata, score=1-r.distance) for r in results]
常见坑
- Embedding 维度不匹配: 索引时用 768 维,查询时用 1536 维
- 不做索引: 没有 HNSW/IVF 索引,查询慢
- pgvector 性能: 百万级以上性能下降明显
- 不更新向量: 文档修改后向量没更新