跳到主要内容

向量数据库

问题

什么是向量数据库?在 AI 应用中如何使用?

答案

向量数据库基础

向量数据库专门存储和检索高维向量(Embedding),核心能力是相似度搜索:找到与查询向量最相似的向量。

主流方案对比

方案类型特点适用
pgvectorPG 扩展集成在 PostgreSQL 中已有 PG,中等规模
Pinecone托管服务Serverless,零运维快速上手
Weaviate开源内置向量化、混合搜索自托管
Qdrant开源Rust 实现,高性能大规模
ChromaDB开源轻量简单原型开发
Milvus开源分布式,亿级超大规模

pgvector 使用

pgvector.sql
-- 安装扩展
CREATE EXTENSION vector;

-- 创建表(1536 维向量,OpenAI text-embedding-3-small)
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
content TEXT,
metadata JSONB,
embedding vector(1536)
);

-- 插入
INSERT INTO documents (content, embedding)
VALUES ('React 性能优化指南', '[0.1, 0.3, -0.2, ...]');

-- 相似度搜索(余弦相似度)
SELECT content, 1 - (embedding <=> query_vector) AS similarity
FROM documents
ORDER BY embedding <=> query_vector -- <=> 是余弦距离
LIMIT 5;

-- 创建索引加速搜索
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);

Node.js 中使用

vector-search.ts
import { OpenAI } from 'openai';

const openai = new OpenAI();

// 1. 生成 Embedding
async function getEmbedding(text: string): Promise<number[]> {
const response = await openai.embeddings.create({
model: 'text-embedding-3-small',
input: text,
});
return response.data[0].embedding;
}

// 2. 存入数据库
async function indexDocument(content: string) {
const embedding = await getEmbedding(content);
await prisma.$executeRaw`
INSERT INTO documents (content, embedding)
VALUES (${content}, ${embedding}::vector)
`;
}

// 3. 相似度搜索
async function search(query: string, topK: number = 5) {
const queryEmbedding = await getEmbedding(query);
return prisma.$queryRaw`
SELECT content, 1 - (embedding <=> ${queryEmbedding}::vector) AS similarity
FROM documents
ORDER BY embedding <=> ${queryEmbedding}::vector
LIMIT ${topK}
`;
}

常见面试问题

Q1: RAG 中向量数据库的作用?

答案

RAG(检索增强生成)中,向量数据库存储知识库文档的 Embedding。用户提问时,先将问题转为向量,从向量数据库中检索相关文档,再将文档作为上下文发给 LLM。

Q2: 余弦相似度和欧氏距离怎么选?

答案

  • 余弦相似度:衡量方向相似性,适合文本搜索(推荐)
  • 欧氏距离:衡量绝对距离,适合图像搜索

Q3: pgvector 和专业向量数据库怎么选?

答案

  • pgvector:数据量 < 百万级,已有 PostgreSQL,不想引入新服务
  • 专业向量 DB:数据量大(千万+)、需要实时更新、高并发

相关链接