Vector Database

Vector Database 是专门存储和检索高维向量的数据库。它是 RAG 系统的存储层,支持语义搜索、相似度计算和混合查询。

#type / concept #status / evergreen #tech / ai #tech / database

[!info] related notes

Vector Database

一句话定义

Vector Database 是专门存储和检索高维向量的数据库。它让”找到语义最相似的文档”变得高效——不需要遍历所有文档,而是通过 ANN (近似最近邻) 算法快速找到最相似的 K 个向量。

它解决什么问题

把文档 Embedding 存在普通数据库里,检索时需要遍历所有向量计算距离,O(n) 复杂度。当文档量达到百万级时,这不可接受。Vector Database 通过 ANN 索引(HNSW、IVF)把复杂度降到 O(log n)。

核心原理

选型对比

数据库类型特点适用场景
pgvectorPostgreSQL 扩展零额外组件,支持 SQLMVP、中小规模
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]

常见坑

  1. Embedding 维度不匹配: 索引时用 768 维,查询时用 1536 维
  2. 不做索引: 没有 HNSW/IVF 索引,查询慢
  3. pgvector 性能: 百万级以上性能下降明显
  4. 不更新向量: 文档修改后向量没更新

参考资料

创建于 2026/6/30 更新于 2026/7/15