向量数据库
问题
什么是向量数据库?在 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),核心能力是相似度搜索:找到与查询向量最相似的向量。
主流方案对比
| 方案 | 类型 | 特点 | 适用 |
|---|---|---|---|
| pgvector | PG 扩展 | 集成在 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:数据量大(千万+)、需要实时更新、高并发
相关链接
- 向量搜索与 Embedding - Embedding 详解
- RAG 检索增强生成 - RAG 架构