向量数据库
问题
什么是向量数据库?在 AI 应用中如何使用?
答案
向量数据库基础
向量数据库专门存储和检索高维向量(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 架构