跳到主要内容

向量数据库

问题

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

面试速答版

什么是向量数据库? 专门存储和检索「高维 Embedding 向量」的数据库,核心能力是相似度搜索

  • 文本/图片 经 Embedding 模型转成一个 768/1536 维向量,距离越近 = 语义越相近。
  • 检索靠 ANN(近似最近邻)索引,主流算法是 HNSW(分层图,查询快、内存高)和 IVF(倒排聚类,费内存低、初始训练费时)。
  • 距离函数:余弦相似度最常用,其次是点积、欧氏距离。

在 AI 应用中如何使用? 最常见场景是 RAG(检索增强生成):用户问题 → Embedding → 在向量库里找 Top K 相似文档 → 作为上下文拼进 Prompt → 交给 LLM 生成。

  • 选型:已有 PostgreSQL 首选 pgvector(一体化、能跟业务表联查);零运维选 Pinecone;自托管、大规模选 Qdrant(Rust,性能好)或 Milvus(亿级分布式);原型验证用 ChromaDB
  • 混合检索:向量检索 + 关键词检索 + Rerank 重排,召回准确率明显优于纯向量。
  • 注意点:分块策略(文档切几会资件拼进上下文)、Embedding 模型费用、多租户隔离(加 metadata 过滤)。

答案

向量数据库基础

向量数据库专门存储和检索高维向量(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:数据量大(千万+)、需要实时更新、高并发

相关链接