关于 vector-database-ops
vector-database-ops 是面向 AI 搜索、RAG 和推荐系统的向量数据库运维技能,帮助工程师比较数据库选项,并处理部署、索引、维护和生产环境调优。
主要功能
- 01比较 Qdrant、Weaviate、pgvector、Pinecone 和 Chroma
- 02部署 Qdrant、pgvector 和 Weaviate
- 03管理集合与索引
- 04配置租户隔离的过滤搜索
- 05备份、恢复并调优查询性能
适用场景
- 01为语义搜索或 RAG 应用选择数据库
- 02管理集合和数据迁移
- 03调优生产环境查询索引
- 04隔离向量搜索中的租户数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ bagelhole/ devops-security-agent-skills --skill vector-database-ops安装后在 Claude Code 中输入/vector-database-ops确认已加载。
详细介绍
向量数据库运维
运行生产级向量数据库,为 AI 驱动的搜索、RAG 和推荐系统提供支持。
何时使用此技能
适用于以下场景:
- 为 RAG 或语义搜索应用设置向量数据库
- 在 Qdrant、Weaviate、pgvector 或 Pinecone 之间进行选择
- 管理集合、索引和数据迁移
- 针对生产负载优化查询性能和索引
- 使用命名空间隔离实现多租户向量搜索
向量数据库对比
| 数据库 | 最适用场景 | 托管方式 | 过滤 | 规模 |
|---|---|---|---|---|
| Qdrant | 高性能、丰富的过滤功能、可自托管 | 自托管/云端 | 优秀 | 很高 |
| Weaviate | 以 Schema 为先、混合搜索、多模态 | 自托管/云端 | 良好 | 高 |
| pgvector | 已使用 Postgres、简单用例 | 自托管 | 良好 | 中 |
| Pinecone | 零运维托管、无服务器 | 仅托管 | 良好 | 很高 |
| Chroma | 本地开发、原型设计 | 仅自托管 | 基础 | 低至中 |
Qdrant — 生产部署
# Docker (single node)
docker run -d \
--name qdrant \
-p 6333:6333 \
-p 6334:6334 \
-v $(pwd)/qdrant-data:/qdrant/storage \
qdrant/qdrant:latest
# With custom config
docker run -d \
--name qdrant \
-p 6333:6333 \
-v $(pwd)/qdrant-data:/qdrant/storage \
-v $(pwd)/qdrant-config.yaml:/qdrant/config/production.yaml \
qdrant/qdrant:latest
# qdrant-config.yaml
storage:
storage_path: /qdrant/storage
on_disk_payload: true # store payload on disk (saves RAM)
service:
max_request_size_mb: 32
hnsw_index:
m: 16 # graph connections per node
ef_construct: 100 # accuracy vs build time trade-off
full_scan_threshold: 10000 # switch to brute force below this
quantization:
scalar:
type: int8
quantile: 0.99
always_ram: true # keep quantized index in RAM
telemetry_disabled: true
Qdrant 集合管理
from qdrant_client import QdrantClient
from qdrant_client.models import (
Distance, VectorParams, HnswConfigDiff,
ScalarQuantizationConfig, ScalarType, QuantizationConfig
)
client = QdrantClient("http://localhost:6333")
# Create optimized collection
client.create_collection(
collection_name="documents",
vectors_config=VectorParams(
size=1536, # OpenAI ada-002 / text-embedding-3-small
distance=Distance.COSINE,
on_disk=True, # save RAM — vectors stored on disk
),
hnsw_config=HnswConfigDiff(
m=32, # higher = better recall, more RAM
ef_construct=200,
on_disk=False, # keep HNSW graph in RAM for speed
),
quantization_config=QuantizationConfig(
scalar=ScalarQuantizationConfig(
type=ScalarType.INT8,
quantile=0.99,
always_ram=True,
)
),
)
# Create payload index for fast filtering
client.create_payload_index(
collection_name="documents",
field_name="tenant_id",
field_schema="keyword",
)
client.create_payload_index(
collection_name="documents",
field_name="created_at",
field_schema="datetime",
)
# Collection info
info = client.get_collection("documents")
print(f"Vectors: {info.vectors_count}, Status: {info.status}")
Qdrant 过滤搜索
from qdrant_client.models import Filter, FieldCondition, MatchValue, Range
# Tenant-isolated search (multi-tenant RAG)
results = client.query_points(
collection_name="documents",
query=query_embedding,
query_filter=Filter(
must=[
FieldCondition(key="tenant_id", match=MatchValue(value="acme-corp")),
FieldCondition(key="doc_type", match=MatchValue(value="contract")),
],
should=[
FieldCondition(key="created_at", range=Range(gte="2024-01-01")),
],
),
limit=10,
with_payload=True,
)
pgvector — PostgreSQL 扩展
-- Enable extension
CREATE EXTENSION IF NOT EXISTS vector;
-- Create table with vector column
CREATE TABLE documents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
content TEXT NOT NULL,
embedding VECTOR(1536),
metadata JSONB DEFAULT '{}',
tenant_id TEXT NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Create HNSW index (faster queries, more memory)
CREATE INDEX ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- Create IVFFlat index (less memory, slower build)
-- CREATE INDEX ON documents
-- USING ivfflat (embedding vector_cosine_ops)
-- WITH (lists = 100);
-- Semantic search with metadata filtering
SELECT id, content, metadata,
1 - (embedding <=> $1::vector) AS similarity
FROM documents
WHERE tenant_id = 'acme-corp'
AND metadata->>'doc_type' = 'contract'
ORDER BY embedding <=> $1::vector
LIMIT 10;
# Deploy pgvector via Docker
docker run -d \
--name pgvector \
-e POSTGRES_PASSWORD=secret \
-e POSTGRES_DB=vectordb \
-p 5432:5432 \
-v pgvector-data:/var/lib/postgresql/data \
pgvector/pgvector:pg16
Weaviate 部署
# docker-compose for Weaviate
services:
weaviate:
image: semitechnologies/weaviate:latest
ports:
- "8080:8080"
- "50051:50051"
environment:
QUERY_DEFAULTS_LIMIT: 25
AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: "false"
AUTHENTICATION_APIKEY_ENABLED: "true"
AUTHENTICATION_APIKEY_ALLOWED_KEYS: "${WEAVIATE_API_KEY}"
AUTHENTICATION_APIKEY_USERS: "admin"
PERSISTENCE_DATA_PATH: /var/lib/weaviate
ENABLE_MODULES: text2vec-openai,generative-openai
OPENAI_APIKEY: "${OPENAI_API_KEY}"
CLUSTER_HOSTNAME: node1
volumes:
- weaviate-data:/var/lib/weaviate
restart: unless-stopped
volumes:
weaviate-data:
备份与恢复
# Qdrant — snapshot backup
curl -X POST "http://localhost:6333/collections/documents/snapshots"
# Download snapshot
curl -O "http://localhost:6333/collections/documents/snapshots/documents-snapshot.snapshot"
# Restore
curl -X POST "http://localhost:6333/collections/documents/snapshots/recover" \
-H "Content-Type: application/json" \
-d '{"location": "/qdrant/snapshots/documents-snapshot.snapshot"}'
# pgvector — standard pg_dump
pg_dump -h localhost -U postgres -d vectordb \
--table=documents --format=custom > documents-backup.dump
# Restore
pg_restore -h localhost -U postgres -d vectordb documents-backup.dump
性能调优
# Qdrant — optimize collection after bulk load
client.update_collection(
collection_name="documents",
optimizer_config={"indexing_threshold": 0}, # force indexing now
)
# Wait for optimization to complete
import time
while True:
info = client.get_collection("documents")
if info.status.value == "green":
break
time.sleep(5)
print(f"Optimizing... segments: {info.segments_count}")
常见问题
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 查询缓慢 | 尚未构建 HNSW 索引 | 等待索引完成;检查 status == green |
| RAM 占用过高 | 向量驻留在内存中 | 为向量启用 on_disk=True |
| 召回率较差 | 搜索参数 ef 值过低 | 提高搜索请求中的 ef(查询时设置) |
| pgvector 速度慢 | 使用 IVFFlat 但未执行 vacuum | 运行 VACUUM ANALYZE documents |
| Weaviate 内存溢出 | 对象过多 | 启用异步索引;增大堆内存 |
最佳实践
- 归一化嵌入使用余弦距离;未归一化嵌入使用点积。
- 始终为过滤字段(
tenant_id、doc_type)创建 payload 索引。 - 对于超过 10M 个向量的数据集,使用
on_disk向量和always_ram量化。 - 在选择 IVFFlat 或 HNSW 前,使用实际查询模式进行基准测试。
- 执行任何批量删除或迁移操作前,先创建快照。
相关技能
- rag-infrastructure - 完整的 RAG 流水线
- databases - 通用数据库管理
- postgresql - pgvector 宿主数据库运维
评论
支持 Markdown