mcpField
V
vector-database-ops

vector-database-ops

github.com/bagelhole数据与数据库1.2k312 次安装23 周前更新
代码仓库

关于 vector-database-ops

vector-database-ops 是面向 AI 搜索、RAG 和推荐系统的向量数据库运维技能,帮助工程师比较数据库选项,并处理部署、索引、维护和生产环境调优。

主要功能

  1. 01比较 Qdrant、Weaviate、pgvector、Pinecone 和 Chroma
  2. 02部署 Qdrant、pgvector 和 Weaviate
  3. 03管理集合与索引
  4. 04配置租户隔离的过滤搜索
  5. 05备份、恢复并调优查询性能

适用场景

  1. 01为语义搜索或 RAG 应用选择数据库
  2. 02管理集合和数据迁移
  3. 03调优生产环境查询索引
  4. 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 前,使用实际查询模式进行基准测试。
  • 执行任何批量删除或迁移操作前,先创建快照。

相关技能

评论

支持 Markdown